# HG changeset patch # User aph # Date 1469203508 -3600 # Node ID 00aba4bf1a8308ac2267665fd7b0a5f50abc10ca # Parent 40d48ddc12bcf57f6de818cc9219f8aa85472f8c 8161190: AArch64: Fix overflow in immediate cmp instruction Summary: Use subs instead of cmp to compare BlockZeroingLowLimit. Subs can check and handle immediate out of range correctly. Reviewed-by: aph Contributed-by: yang.zhang@linaro.org diff -r 40d48ddc12bc -r 00aba4bf1a83 hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Wed Jul 20 19:35:08 2016 +0300 +++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri Jul 22 17:05:08 2016 +0100 @@ -4916,7 +4916,7 @@ // alignment. if (!is_large || !(BlockZeroingLowLimit >= zva_length * 2)) { int low_limit = MAX2(zva_length * 2, (int)BlockZeroingLowLimit); - cmp(cnt, low_limit >> 3); + subs(tmp, cnt, low_limit >> 3); br(Assembler::LT, small); } diff -r 40d48ddc12bc -r 00aba4bf1a83 hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Wed Jul 20 19:35:08 2016 +0300 +++ b/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp Fri Jul 22 17:05:08 2016 +0100 @@ -2346,8 +2346,9 @@ __ subw(count, count, cnt_words, Assembler::LSL, 3 - shift); if (UseBlockZeroing) { Label non_block_zeroing, rest; + Register tmp = rscratch1; // count >= BlockZeroingLowLimit && value == 0 - __ cmp(cnt_words, BlockZeroingLowLimit >> 3); + __ subs(tmp, cnt_words, BlockZeroingLowLimit >> 3); __ ccmp(value, 0 /* comparing value */, 0 /* NZCV */, Assembler::GE); __ br(Assembler::NE, non_block_zeroing); __ mov(bz_base, to);