changeset 57506:9b4336f9fa6d

8234228: AArch64: Some temp vars in string_compare intrinsics for processing the last 4 chars (LU/UL) are no use Summary: Clean up redundant temp vars in generate_compare_long_string_different_encoding Reviewed-by: adinn
author qpzhang
date Fri, 15 Nov 2019 17:02:17 +0800
parents 10ca494c141f
children aac4eebf5e92
files src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
diffstat 1 files changed, 7 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp	Mon Aug 12 16:22:24 2019 +0800
+++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp	Fri Nov 15 17:02:17 2019 +0800
@@ -4010,7 +4010,7 @@
   // code for comparing 16 characters of strings with Latin1 and Utf16 encoding
   void compare_string_16_x_LU(Register tmpL, Register tmpU, Label &DIFF1,
       Label &DIFF2) {
-    Register cnt1 = r2, tmp1 = r10, tmp2 = r11, tmp3 = r12;
+    Register cnt1 = r2, tmp2 = r11, tmp3 = r12;
     FloatRegister vtmp = v1, vtmpZ = v0, vtmp3 = v2;
 
     __ ldrq(vtmp, Address(__ post(tmp2, 16)));
@@ -4070,18 +4070,14 @@
     __ add(str2, str2, isLU ? wordSize : wordSize/2);
     __ fmovd(isLU ? tmp1 : tmp2, vtmp);
     __ subw(cnt2, cnt2, 8); // Already loaded 4 symbols. Last 4 is special case.
-    __ add(str1, str1, cnt2, __ LSL, isLU ? 0 : 1);
     __ eor(rscratch2, tmp1, tmp2);
-    __ add(str2, str2, cnt2, __ LSL, isLU ? 1 : 0);
     __ mov(rscratch1, tmp2);
     __ cbnz(rscratch2, CALCULATE_DIFFERENCE);
-    Register strU = isLU ? str2 : str1,
-             strL = isLU ? str1 : str2,
-             tmpU = isLU ? rscratch1 : tmp1, // where to keep U for comparison
+    Register tmpU = isLU ? rscratch1 : tmp1, // where to keep U for comparison
              tmpL = isLU ? tmp1 : rscratch1; // where to keep L for comparison
     __ push(spilled_regs, sp);
-    __ sub(tmp2, strL, cnt2); // strL pointer to load from
-    __ sub(cnt1, strU, cnt2, __ LSL, 1); // strU pointer to load from
+    __ mov(tmp2, isLU ? str1 : str2); // init the pointer to L next load
+    __ mov(cnt1, isLU ? str2 : str1); // init the pointer to U next load
 
     __ ldr(tmp3, Address(__ post(cnt1, 8)));
 
@@ -4118,7 +4114,7 @@
       __ cmn(cnt2, (u1)16);
       __ br(__ EQ, LOAD_LAST);
     __ bind(TAIL); // 1..15 characters left until last load (last 4 characters)
-      __ add(cnt1, cnt1, cnt2, __ LSL, 1); // Address of 8 bytes before last 4 characters in UTF-16 string
+      __ add(cnt1, cnt1, cnt2, __ LSL, 1); // Address of 32 bytes before last 4 characters in UTF-16 string
       __ add(tmp2, tmp2, cnt2); // Address of 16 bytes before last 4 characters in Latin1 string
       __ ldr(tmp3, Address(cnt1, -8));
       compare_string_16_x_LU(tmpL, tmpU, DIFF1, DIFF2); // last 16 characters before last load
@@ -4134,7 +4130,8 @@
       __ mov(tmpU, tmp3);
       __ pop(spilled_regs, sp);
 
-      __ ldrs(vtmp, Address(strL));
+      // tmp2 points to the address of the last 4 Latin1 characters right now
+      __ ldrs(vtmp, Address(tmp2));
       __ zip1(vtmp, __ T8B, vtmp, vtmpZ);
       __ fmovd(tmpL, vtmp);