@@ -3968,6 +3968,64 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
3968
3968
mvnw (crc, crc);
3969
3969
}
3970
3970
3971
+ void MacroAssembler::kernel_crc32c_using_crypto_pmull (Register crc, Register buf,
3972
+ Register len, Register tmp0, Register tmp1, Register tmp2, Register tmp3) {
3973
+ Label CRC_by4_loop, CRC_by1_loop, CRC_less128, CRC_by128_pre, CRC_by32_loop, CRC_less32, L_exit;
3974
+ assert_different_registers (crc, buf, len, tmp0, tmp1, tmp2);
3975
+
3976
+ subs (tmp0, len, 384 );
3977
+ br (Assembler::GE, CRC_by128_pre);
3978
+ BIND (CRC_less128);
3979
+ subs (len, len, 32 );
3980
+ br (Assembler::GE, CRC_by32_loop);
3981
+ BIND (CRC_less32);
3982
+ adds (len, len, 32 - 4 );
3983
+ br (Assembler::GE, CRC_by4_loop);
3984
+ adds (len, len, 4 );
3985
+ br (Assembler::GT, CRC_by1_loop);
3986
+ b (L_exit);
3987
+
3988
+ BIND (CRC_by32_loop);
3989
+ ldp (tmp0, tmp1, Address (buf));
3990
+ crc32cx (crc, crc, tmp0);
3991
+ ldr (tmp2, Address (buf, 16 ));
3992
+ crc32cx (crc, crc, tmp1);
3993
+ ldr (tmp3, Address (buf, 24 ));
3994
+ crc32cx (crc, crc, tmp2);
3995
+ add (buf, buf, 32 );
3996
+ subs (len, len, 32 );
3997
+ crc32cx (crc, crc, tmp3);
3998
+ br (Assembler::GE, CRC_by32_loop);
3999
+ cmn (len, (u1)32 );
4000
+ br (Assembler::NE, CRC_less32);
4001
+ b (L_exit);
4002
+
4003
+ BIND (CRC_by4_loop);
4004
+ ldrw (tmp0, Address (post (buf, 4 )));
4005
+ subs (len, len, 4 );
4006
+ crc32cw (crc, crc, tmp0);
4007
+ br (Assembler::GE, CRC_by4_loop);
4008
+ adds (len, len, 4 );
4009
+ br (Assembler::LE, L_exit);
4010
+ BIND (CRC_by1_loop);
4011
+ ldrb (tmp0, Address (post (buf, 1 )));
4012
+ subs (len, len, 1 );
4013
+ crc32cb (crc, crc, tmp0);
4014
+ br (Assembler::GT, CRC_by1_loop);
4015
+ b (L_exit);
4016
+
4017
+ BIND (CRC_by128_pre);
4018
+ kernel_crc32_common_fold_using_crypto_pmull (crc, buf, len, tmp0, tmp1, tmp2,
4019
+ 4 *256 *sizeof (juint) + 8 *sizeof (juint) + 0x50 );
4020
+ mov (crc, 0 );
4021
+ crc32cx (crc, crc, tmp0);
4022
+ crc32cx (crc, crc, tmp1);
4023
+
4024
+ cbnz (len, CRC_less128);
4025
+
4026
+ BIND (L_exit);
4027
+ }
4028
+
3971
4029
void MacroAssembler::kernel_crc32c_using_crc32c (Register crc, Register buf,
3972
4030
Register len, Register tmp0, Register tmp1, Register tmp2,
3973
4031
Register tmp3) {
@@ -4074,7 +4132,11 @@ void MacroAssembler::kernel_crc32c_using_crc32c(Register crc, Register buf,
4074
4132
void MacroAssembler::kernel_crc32c (Register crc, Register buf, Register len,
4075
4133
Register table0, Register table1, Register table2, Register table3,
4076
4134
Register tmp, Register tmp2, Register tmp3) {
4077
- kernel_crc32c_using_crc32c (crc, buf, len, table0, table1, table2, table3);
4135
+ if (UseCryptoPmullForCRC32) {
4136
+ kernel_crc32c_using_crypto_pmull (crc, buf, len, table0, table1, table2, table3);
4137
+ } else {
4138
+ kernel_crc32c_using_crc32c (crc, buf, len, table0, table1, table2, table3);
4139
+ }
4078
4140
}
4079
4141
4080
4142
void MacroAssembler::kernel_crc32_common_fold_using_crypto_pmull (Register crc, Register buf,
0 commit comments