< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page

        

*** 3183,3202 **** */ void MacroAssembler::kernel_crc32c(Register crc, Register buf, Register len, Register table0, Register table1, Register table2, Register table3, Register tmp, Register tmp2, Register tmp3) { Label L_exit; ! Label CRC_by64_loop, CRC_by4_loop, CRC_by1_loop; ! subs(len, len, 64); ! br(Assembler::GE, CRC_by64_loop); ! adds(len, len, 64-4); br(Assembler::GE, CRC_by4_loop); adds(len, len, 4); br(Assembler::GT, CRC_by1_loop); b(L_exit); BIND(CRC_by4_loop); ldrw(tmp, Address(post(buf, 4))); subs(len, len, 4); crc32cw(crc, crc, tmp); br(Assembler::GE, CRC_by4_loop); --- 3183,3220 ---- */ void MacroAssembler::kernel_crc32c(Register crc, Register buf, Register len, Register table0, Register table1, Register table2, Register table3, Register tmp, Register tmp2, Register tmp3) { Label L_exit; ! Label CRC_by64_loop, CRC_by4_loop, CRC_by1_loop, CRC_less64, CRC_by64_pre, CRC_by32_loop, CRC_less32; ! subs(len, len, 128); ! br(Assembler::GE, CRC_by64_pre); ! BIND(CRC_less64); ! adds(len, len, 128-32); ! br(Assembler::GE, CRC_by32_loop); ! BIND(CRC_less32) ! adds(len, len, 32-4); br(Assembler::GE, CRC_by4_loop); adds(len, len, 4); br(Assembler::GT, CRC_by1_loop); b(L_exit); + BIND(CRC_by32_loop); + ldp(table0, table1, Address(post(buf, 16))); + subs(len, len, 32); + crc32cx(crc, crc, table0); + ldr(table2, Address(post(buf, 8))); + crc32cx(crc, crc, table1); + ldr(table3, Address(post(buf, 8))); + crc32cx(crc, crc, table2); + crc32cx(crc, crc, table3); + br(Assembler::GE, CRC_by32_loop); + cmn(len, 32); + br(Assembler::NE, CRC_less32); + b(L_exit); + BIND(CRC_by4_loop); ldrw(tmp, Address(post(buf, 4))); subs(len, len, 4); crc32cw(crc, crc, tmp); br(Assembler::GE, CRC_by4_loop);
*** 3207,3240 **** subs(len, len, 1); crc32cb(crc, crc, tmp); br(Assembler::GT, CRC_by1_loop); b(L_exit); align(CodeEntryAlignment); BIND(CRC_by64_loop); subs(len, len, 64); ! ldp(tmp, tmp3, Address(post(buf, 16))); ! crc32cx(crc, crc, tmp); ! crc32cx(crc, crc, tmp3); ! ldp(tmp, tmp3, Address(post(buf, 16))); ! crc32cx(crc, crc, tmp); ! crc32cx(crc, crc, tmp3); ! ldp(tmp, tmp3, Address(post(buf, 16))); ! crc32cx(crc, crc, tmp); ! crc32cx(crc, crc, tmp3); ! ldp(tmp, tmp3, Address(post(buf, 16))); ! crc32cx(crc, crc, tmp); ! crc32cx(crc, crc, tmp3); br(Assembler::GE, CRC_by64_loop); ! adds(len, len, 64-4); ! br(Assembler::GE, CRC_by4_loop); ! adds(len, len, 4); ! br(Assembler::GT, CRC_by1_loop); BIND(L_exit); return; } SkipIfEqual::SkipIfEqual( MacroAssembler* masm, const bool* flag_addr, bool value) { _masm = masm; unsigned long offset; _masm->adrp(rscratch1, ExternalAddress((address)flag_addr), offset); --- 3225,3286 ---- subs(len, len, 1); crc32cb(crc, crc, tmp); br(Assembler::GT, CRC_by1_loop); b(L_exit); + BIND(CRC_by64_pre); + sub(buf, buf, 8); + ldp(table0, table1, Address(buf, 8)); + crc32cx(crc, crc, table0); + ldr(table2, Address(buf, 24)); + crc32cx(crc, crc, table1); + ldr(table3, Address(buf, 32)); + crc32cx(crc, crc, table2); + ldr(table0, Address(buf, 40)); + crc32cx(crc, crc, table3); + ldr(table1, Address(buf, 48)); + crc32cx(crc, crc, table0); + ldr(table2, Address(buf, 56)); + crc32cx(crc, crc, table1); + ldr(table3, Address(pre(buf, 64))); + + b(CRC_by64_loop); + align(CodeEntryAlignment); BIND(CRC_by64_loop); subs(len, len, 64); ! crc32cx(crc, crc, table2); ! ldr(table0, Address(buf, 8)); ! crc32cx(crc, crc, table3); ! ldr(table1, Address(buf, 16)); ! crc32cx(crc, crc, table0); ! ldr(table2, Address(buf, 24)); ! crc32cx(crc, crc, table1); ! ldr(table3, Address(buf, 32)); ! crc32cx(crc, crc, table2); ! ldr(table0, Address(buf, 40)); ! crc32cx(crc, crc, table3); ! ldr(table1, Address(buf, 48)); ! crc32cx(crc, crc, table0); ! ldr(table2, Address(buf, 56)); ! crc32cx(crc, crc, table1); ! ldr(table3, Address(pre(buf, 64))); br(Assembler::GE, CRC_by64_loop); ! ! // post-loop ! crc32cx(crc, crc, table2); ! crc32cx(crc, crc, table3); ! ! sub(len, len, 64); ! add(buf, buf, 8); ! cmn(len, 128); ! br(Assembler::NE, CRC_less64); BIND(L_exit); return; } + SkipIfEqual::SkipIfEqual( MacroAssembler* masm, const bool* flag_addr, bool value) { _masm = masm; unsigned long offset; _masm->adrp(rscratch1, ExternalAddress((address)flag_addr), offset);
< prev index next >