hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
changeset 31591 82134a118aea
parent 31414 20e05afbc7af
child 31863 22ea3a456610
child 31955 c6ac18ab3d6b
child 31849 92ca49fa9fa7
equal deleted inserted replaced
31590:427d073af867 31591:82134a118aea
  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);