[aarch64-port-dev ] RFR: JDK-8183533 AArch64: redundant registers saving in arraycopy stubs
Zhongwei Yao
zhongwei.yao at linaro.org
Fri Jul 14 04:32:34 UTC 2017
Hi, all,
In disjoint oop arraycopy stub, conjoint oop arraycopy stub and
checkcasingt arraycopy stub, gen_write_ref_array_*_barrier will save all
call-clobbered registers. Those saves are actually redundant. This patch
removes these redundant saved registers and improves performance.
For example in StubRoutines::arrayof_oop_disjoint_arraycopy
Before applying this patch:
StubRoutines::arrayof_oop_disjoint_arraycopy [0x0000ffffa0678c80,
0x0000ffffa0678f5c[ (732 bytes)
0x0000ffffa0678c80: stp x29, x30, [sp,#-16]!
0x0000ffffa0678c84: mov x29, sp
0x0000ffffa0678c88: stp x1, x2, [sp,#-16]!
0x0000ffffa0678c8c: stp x0, x1, [sp,#-144]!
0x0000ffffa0678c90: stp x2, x3, [sp,#16]
0x0000ffffa0678c94: stp x4, x5, [sp,#32]
0x0000ffffa0678c98: stp x6, x7, [sp,#48]
0x0000ffffa0678c9c: stp x10, x11, [sp,#64]
0x0000ffffa0678ca0: stp x12, x13, [sp,#80]
0x0000ffffa0678ca4: stp x14, x15, [sp,#96]
0x0000ffffa0678ca8: stp x16, x17, [sp,#112]
0x0000ffffa0678cac: stp x18, xzr, [sp,#128]
0x0000ffffa0678cb0: stp d30, d31, [sp,#-16]!
0x0000ffffa0678cb4: stp d28, d29, [sp,#-16]!
0x0000ffffa0678cb8: stp d26, d27, [sp,#-16]!
0x0000ffffa0678cbc: stp d24, d25, [sp,#-16]!
0x0000ffffa0678cc0: stp d22, d23, [sp,#-16]!
0x0000ffffa0678cc4: stp d20, d21, [sp,#-16]!
0x0000ffffa0678cc8: stp d18, d19, [sp,#-16]!
0x0000ffffa0678ccc: stp d16, d17, [sp,#-16]!
0x0000ffffa0678cd0: stp d6, d7, [sp,#-16]!
0x0000ffffa0678cd4: stp d4, d5, [sp,#-16]!
0x0000ffffa0678cd8: stp d2, d3, [sp,#-16]!
0x0000ffffa0678cdc: stp d0, d1, [sp,#-16]!
0x0000ffffa0678ce0: mov x0, x1
0x0000ffffa0678ce4: mov x1, x2
0x0000ffffa0678ce8: stp x8, x12, [sp,#-16]!
0x0000ffffa0678cec: mov x8, #0x5ce0 // #23776
0x0000ffffa0678cf0: movk x8, #0xa3cd, lsl #16
0x0000ffffa0678cf4: movk x8, #0xffff, lsl #32
0x0000ffffa0678cf8: blr x8
0x0000ffffa0678cfc: ldp x8, x12, [sp],#16
0x0000ffffa0678d00: isb
0x0000ffffa0678d04: ldp d0, d1, [sp],#16
0x0000ffffa0678d08: ldp d2, d3, [sp],#16
0x0000ffffa0678d0c: ldp d4, d5, [sp],#16
0x0000ffffa0678d10: ldp d6, d7, [sp],#16
0x0000ffffa0678d14: ldp d16, d17, [sp],#16
0x0000ffffa0678d18: ldp d18, d19, [sp],#16
0x0000ffffa0678d1c: ldp d20, d21, [sp],#16
0x0000ffffa0678d20: ldp d22, d23, [sp],#16
0x0000ffffa0678d24: ldp d24, d25, [sp],#16
0x0000ffffa0678d28: ldp d26, d27, [sp],#16
0x0000ffffa0678d2c: ldp d28, d29, [sp],#16
0x0000ffffa0678d30: ldp d30, d31, [sp],#16
0x0000ffffa0678d34: ldp x2, x3, [sp,#16]
0x0000ffffa0678d38: ldp x4, x5, [sp,#32]
0x0000ffffa0678d3c: ldp x6, x7, [sp,#48]
0x0000ffffa0678d40: ldp x10, x11, [sp,#64]
0x0000ffffa0678d44: ldp x12, x13, [sp,#80]
0x0000ffffa0678d48: ldp x14, x15, [sp,#96]
0x0000ffffa0678d4c: ldp x16, x17, [sp,#112]
0x0000ffffa0678d50: ldp x18, xzr, [sp,#128]
0x0000ffffa0678d54: ldp x0, x1, [sp],#144
0x0000ffffa0678d58: prfm pldl1keep, [x0]
...
After applying this patch:
StubRoutines::arrayof_oop_disjoint_arraycopy [0x0000ffff8887ec80,
0x0000ffff8887ee1c[ (412 bytes)
0x0000ffff8887ec80: stp x29, x30, [sp,#-16]!
0x0000ffff8887ec84: mov x29, sp
0x0000ffff8887ec88: stp x0, x1, [sp,#-32]!
0x0000ffff8887ec8c: stp x2, xzr, [sp,#16]
0x0000ffff8887ec90: mov x0, x1
0x0000ffff8887ec94: mov x1, x2
0x0000ffff8887ec98: stp x8, x12, [sp,#-16]!
0x0000ffff8887ec9c: mov x8, #0x2ce0 // #11488
0x0000ffff8887eca0: movk x8, #0x9998, lsl #16
0x0000ffff8887eca4: movk x8, #0xffff, lsl #32
0x0000ffff8887eca8: blr x8
0x0000ffff8887ecac: ldp x8, x12, [sp],#16
0x0000ffff8887ecb0: isb
0x0000ffff8887ecb4: ldp x2, xzr, [sp,#16]
0x0000ffff8887ecb8: ldp x0, x1, [sp],#32
0x0000ffff8887ecbc: stp x1, x2, [sp,#-16]!
0x0000ffff8887ecc0: prfm pldl1keep, [x0]
...
And this patch passes all jtreg tests.
Bug:
https://bugs.openjdk.java.net/browse/JDK-8183533
Webrev:
http://cr.openjdk.java.net/~njian/8183533/webrev.00/
Please help to review it.
--
Best regards,
Zhongwei
More information about the aarch64-port-dev
mailing list