OpenJDK / jdk / jdk
changeset 50242:9a87afc49148
8203041: AArch64: fix overflow in immediate cmp/cmn instruction
Summary: fix overflow in immediate cmp/cmn instruction for AArch64
Reviewed-by: aph, dpochepk, drwhite
Contributed-by: joshua.zhu@arm.com
author | fyang |
---|---|
date | Thu, 24 May 2018 07:20:10 +0800 |
parents | b4bfc263cdc6 |
children | 4fac3c99487d |
files | src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp |
diffstat | 1 files changed, 6 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp Wed May 23 21:08:33 2018 +0200 +++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp Thu May 24 07:20:10 2018 +0800 @@ -3851,7 +3851,9 @@ __ sub(cnt1, cnt1, 8 * wordSize); __ eor(tmp7, tmp7, tmp8); __ ldp(tmp2, tmp4, Address(__ post(a2, 2 * wordSize))); - __ cmp(cnt1, loopThreshold); + // tmp6 is not used. MacroAssembler::subs is used here (rather than + // cmp) because subs allows an unlimited range of immediate operand. + __ subs(tmp6, cnt1, loopThreshold); __ orr(tmp5, tmp5, tmp7); __ cbnz(tmp5, NOT_EQUAL); __ br(__ GE, LOOP); @@ -3877,7 +3879,7 @@ __ ld1(v0, v1, v2, v3, __ T2D, Address(__ post(a1, 4 * 2 * wordSize))); __ sub(cnt1, cnt1, 8 * wordSize); __ ld1(v4, v5, v6, v7, __ T2D, Address(__ post(a2, 4 * 2 * wordSize))); - __ cmp(cnt1, loopThreshold); + __ subs(tmp1, cnt1, loopThreshold); __ eor(v0, __ T16B, v0, v4); __ eor(v1, __ T16B, v1, v5); __ eor(v2, __ T16B, v2, v6); @@ -3936,7 +3938,7 @@ } if (UseSIMDForArrayEquals) { if (SoftwarePrefetchHintDistance >= 0) { - __ cmp(cnt1, prefetchLoopThreshold); + __ subs(tmp1, cnt1, prefetchLoopThreshold); __ br(__ LE, NO_PREFETCH_LARGE_LOOP); generate_large_array_equals_loop_simd(prefetchLoopThreshold, /* prfm = */ true, NOT_EQUAL); @@ -3949,7 +3951,7 @@ } else { __ push(spilled_regs, sp); if (SoftwarePrefetchHintDistance >= 0) { - __ cmp(cnt1, prefetchLoopThreshold); + __ subs(tmp1, cnt1, prefetchLoopThreshold); __ br(__ LE, NO_PREFETCH_LARGE_LOOP); generate_large_array_equals_loop_nonsimd(prefetchLoopThreshold, /* prfm = */ true, NOT_EQUAL);