2912 br(Assembler::GT, L_by1_loop); |
2912 br(Assembler::GT, L_by1_loop); |
2913 BIND(L_exit); |
2913 BIND(L_exit); |
2914 ornw(crc, zr, crc); |
2914 ornw(crc, zr, crc); |
2915 } |
2915 } |
2916 |
2916 |
|
2917 /** |
|
2918 * @param crc register containing existing CRC (32-bit) |
|
2919 * @param buf register pointing to input byte buffer (byte*) |
|
2920 * @param len register containing number of bytes |
|
2921 * @param table register that will contain address of CRC table |
|
2922 * @param tmp scratch register |
|
2923 */ |
|
2924 void MacroAssembler::kernel_crc32c(Register crc, Register buf, Register len, |
|
2925 Register table0, Register table1, Register table2, Register table3, |
|
2926 Register tmp, Register tmp2, Register tmp3) { |
|
2927 Label L_exit; |
|
2928 Label CRC_by64_loop, CRC_by4_loop, CRC_by1_loop; |
|
2929 |
|
2930 subs(len, len, 64); |
|
2931 br(Assembler::GE, CRC_by64_loop); |
|
2932 adds(len, len, 64-4); |
|
2933 br(Assembler::GE, CRC_by4_loop); |
|
2934 adds(len, len, 4); |
|
2935 br(Assembler::GT, CRC_by1_loop); |
|
2936 b(L_exit); |
|
2937 |
|
2938 BIND(CRC_by4_loop); |
|
2939 ldrw(tmp, Address(post(buf, 4))); |
|
2940 subs(len, len, 4); |
|
2941 crc32cw(crc, crc, tmp); |
|
2942 br(Assembler::GE, CRC_by4_loop); |
|
2943 adds(len, len, 4); |
|
2944 br(Assembler::LE, L_exit); |
|
2945 BIND(CRC_by1_loop); |
|
2946 ldrb(tmp, Address(post(buf, 1))); |
|
2947 subs(len, len, 1); |
|
2948 crc32cb(crc, crc, tmp); |
|
2949 br(Assembler::GT, CRC_by1_loop); |
|
2950 b(L_exit); |
|
2951 |
|
2952 align(CodeEntryAlignment); |
|
2953 BIND(CRC_by64_loop); |
|
2954 subs(len, len, 64); |
|
2955 ldp(tmp, tmp3, Address(post(buf, 16))); |
|
2956 crc32cx(crc, crc, tmp); |
|
2957 crc32cx(crc, crc, tmp3); |
|
2958 ldp(tmp, tmp3, Address(post(buf, 16))); |
|
2959 crc32cx(crc, crc, tmp); |
|
2960 crc32cx(crc, crc, tmp3); |
|
2961 ldp(tmp, tmp3, Address(post(buf, 16))); |
|
2962 crc32cx(crc, crc, tmp); |
|
2963 crc32cx(crc, crc, tmp3); |
|
2964 ldp(tmp, tmp3, Address(post(buf, 16))); |
|
2965 crc32cx(crc, crc, tmp); |
|
2966 crc32cx(crc, crc, tmp3); |
|
2967 br(Assembler::GE, CRC_by64_loop); |
|
2968 adds(len, len, 64-4); |
|
2969 br(Assembler::GE, CRC_by4_loop); |
|
2970 adds(len, len, 4); |
|
2971 br(Assembler::GT, CRC_by1_loop); |
|
2972 BIND(L_exit); |
|
2973 return; |
|
2974 } |
|
2975 |
2917 SkipIfEqual::SkipIfEqual( |
2976 SkipIfEqual::SkipIfEqual( |
2918 MacroAssembler* masm, const bool* flag_addr, bool value) { |
2977 MacroAssembler* masm, const bool* flag_addr, bool value) { |
2919 _masm = masm; |
2978 _masm = masm; |
2920 unsigned long offset; |
2979 unsigned long offset; |
2921 _masm->adrp(rscratch1, ExternalAddress((address)flag_addr), offset); |
2980 _masm->adrp(rscratch1, ExternalAddress((address)flag_addr), offset); |