--- old/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp 2018-07-09 12:24:32.979117724 +0300 +++ new/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp 2018-07-09 12:24:32.719101199 +0300 @@ -1758,7 +1758,7 @@ br(Assembler::EQ, do_profile); get_method(tmp); ldrh(rscratch1, Address(tmp, Method::intrinsic_id_offset_in_bytes())); - cmp(rscratch1, vmIntrinsics::_compiledLambdaForm); + cmp_imm12(rscratch1, vmIntrinsics::_compiledLambdaForm); br(Assembler::NE, profile_continue); bind(do_profile); --- old/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp 2018-07-09 12:24:33.767167812 +0300 +++ new/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp 2018-07-09 12:24:33.511151539 +0300 @@ -4357,7 +4357,7 @@ cmp(cnt1, 8); // Use Linear Scan if cnt1 < 8 || cnt1 >= 256 br(LT, LINEARSEARCH); dup(v0, T16B, cnt1); // done in separate FPU pipeline. Almost no penalty - cmp(cnt1, 256); + cmp_imm12(cnt1, 256); lsr(tmp1, cnt2, 2); ccmp(cnt1, tmp1, 0b0000, LT); // Source must be 4 * pattern for BM br(GE, LINEARSTUB); @@ -4463,7 +4463,7 @@ BIND(BCLOOP); (this->*str1_load_1chr)(ch1, Address(post(tmp3, str1_chr_size))); if (!str1_isL) { - cmp(ch1, ASIZE); + cmp_imm12(ch1, ASIZE); br(HS, BCSKIP); } strb(ch2, Address(sp, ch1)); @@ -4527,7 +4527,7 @@ } else { mov(result_tmp, 1); } - cmp(skipch, ASIZE); + cmp_imm12(skipch, ASIZE); br(HS, BMADV); } ldrb(result_tmp, Address(sp, skipch)); // load skip distance --- old/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2018-07-09 12:24:34.455211542 +0300 +++ new/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2018-07-09 12:24:34.235197559 +0300 @@ -180,8 +180,12 @@ template inline void cmpw(Register Rd, T imm) { subsw(zr, Rd, imm); } - // imm is limited to 12 bits. - inline void cmp(Register Rd, unsigned imm) { subs(zr, Rd, imm); } + + inline void cmp(Register Rd, unsigned char imm8) { subs(zr, Rd, imm8); } + // imm is limited to 12 bits: 0= 0) { - __ subs(tmp1, cnt1, prefetchLoopThreshold); + __ cmp(tmp1, cnt1, prefetchLoopThreshold); __ br(__ LE, NO_PREFETCH_LARGE_LOOP); generate_large_array_equals_loop_simd(prefetchLoopThreshold, /* prfm = */ true, NOT_EQUAL); @@ -3951,7 +3949,7 @@ } else { __ push(spilled_regs, sp); if (SoftwarePrefetchHintDistance >= 0) { - __ subs(tmp1, cnt1, prefetchLoopThreshold); + __ cmp(tmp1, cnt1, prefetchLoopThreshold); __ br(__ LE, NO_PREFETCH_LARGE_LOOP); generate_large_array_equals_loop_nonsimd(prefetchLoopThreshold, /* prfm = */ true, NOT_EQUAL); @@ -4106,7 +4104,7 @@ __ ldr(tmp3, Address(__ post(cnt1, 8))); if (SoftwarePrefetchHintDistance >= 0) { - __ cmp(cnt2, prefetchLoopExitCondition); + __ cmp(rscratch2, cnt2, prefetchLoopExitCondition); __ br(__ LT, SMALL_LOOP); __ bind(LARGE_LOOP_PREFETCH); __ prfm(Address(tmp2, SoftwarePrefetchHintDistance)); @@ -4123,7 +4121,7 @@ __ subs(tmp4, tmp4, 1); __ br(__ GT, LARGE_LOOP_PREFETCH_REPEAT2); __ sub(cnt2, cnt2, 64); - __ cmp(cnt2, prefetchLoopExitCondition); + __ cmp(rscratch2, cnt2, prefetchLoopExitCondition); __ br(__ GE, LARGE_LOOP_PREFETCH); } __ cbz(cnt2, LOAD_LAST); // no characters left except last load @@ -4240,7 +4238,7 @@ compare_string_16_bytes_same(DIFF, DIFF2); __ sub(cnt2, cnt2, isLL ? 64 : 32); compare_string_16_bytes_same(DIFF, DIFF2); - __ cmp(cnt2, largeLoopExitCondition); + __ cmp(rscratch2, cnt2, largeLoopExitCondition); compare_string_16_bytes_same(DIFF, DIFF2); __ br(__ GT, LARGE_LOOP_PREFETCH); __ cbz(cnt2, LAST_CHECK_AND_LENGTH_DIFF); // no more chars left? @@ -4659,7 +4657,7 @@ __ zip1(v2, __ T16B, v2, v0); __ st1(v1, v2, __ T16B, __ post(dst, 32)); __ ld1(v3, v4, v5, v6, __ T16B, Address(__ post(src, 64))); - __ cmp(octetCounter, large_loop_threshold); + __ cmp(rscratch1, octetCounter, large_loop_threshold); __ br(__ LE, LOOP_START); __ b(LOOP_PRFM_START); __ bind(LOOP_PRFM); @@ -4667,7 +4665,7 @@ __ bind(LOOP_PRFM_START); __ prfm(Address(src, SoftwarePrefetchHintDistance)); __ sub(octetCounter, octetCounter, 8); - __ cmp(octetCounter, large_loop_threshold); + __ cmp(rscratch1, octetCounter, large_loop_threshold); inflate_and_store_2_fp_registers(true, v3, v4); inflate_and_store_2_fp_registers(true, v5, v6); __ br(__ GT, LOOP_PRFM);