[aarch64-port-dev ] RFR: 8221658: aarch64: add necessary predicate for ubfx patterns

Andrew Haley aph at redhat.com
Thu Apr 4 18:11:07 UTC 2019


Try this:

diff -r c763810a9bf5 src/cpu/aarch64/vm/aarch64.ad
--- a/src/cpu/aarch64/vm/aarch64.ad	Fri Sep 28 08:48:26 2018 +0800
+++ b/src/cpu/aarch64/vm/aarch64.ad	Thu Apr 04 13:47:03 2019 -0400
@@ -12340,7 +12340,7 @@
   ins_cost(INSN_COST);
   format %{ "ubfxw $dst, $src, $mask" %}
   ins_encode %{
-    int rshift = $rshift$$constant;
+    int rshift = $rshift$$constant & 31;
     long mask = $mask$$constant;
     int width = exact_log2(mask+1);
     __ ubfxw(as_Register($dst$$reg),
@@ -12355,7 +12355,7 @@
   ins_cost(INSN_COST);
   format %{ "ubfx $dst, $src, $mask" %}
   ins_encode %{
-    int rshift = $rshift$$constant;
+    int rshift = $rshift$$constant & 63;
     long mask = $mask$$constant;
     int width = exact_log2(mask+1);
     __ ubfx(as_Register($dst$$reg),
@@ -12373,7 +12373,7 @@
   ins_cost(INSN_COST * 2);
   format %{ "ubfx $dst, $src, $mask" %}
   ins_encode %{
-    int rshift = $rshift$$constant;
+    int rshift = $rshift$$constant & 31;
     long mask = $mask$$constant;
     int width = exact_log2(mask+1);
     __ ubfx(as_Register($dst$$reg),
diff -r c763810a9bf5 src/cpu/aarch64/vm/aarch64_ad.m4
--- a/src/cpu/aarch64/vm/aarch64_ad.m4	Fri Sep 28 08:48:26 2018 +0800
+++ b/src/cpu/aarch64/vm/aarch64_ad.m4	Thu Apr 04 13:47:03 2019 -0400
@@ -185,7 +185,7 @@
   ins_cost(INSN_COST);
   format %{ "$3 $dst, $src, $mask" %}
   ins_encode %{
-    int rshift = $rshift$$constant;
+    int rshift = $rshift$$constant & $4;
     long mask = $mask$$constant;
     int width = exact_log2(mask+1);
     __ $3(as_Register($dst$$reg),
@@ -193,8 +193,8 @@
   %}
   ins_pipe(ialu_reg_shift);
 %}')
-BFX_INSN(I,URShift,ubfxw)
-BFX_INSN(L,URShift,ubfx)
+BFX_INSN(I,URShift,ubfxw,31)
+BFX_INSN(L,URShift,ubfx,63)

 // We can use ubfx when extending an And with a mask when we know mask
 // is positive.  We know that because immI_bitmask guarantees it.
@@ -205,7 +205,7 @@
   ins_cost(INSN_COST * 2);
   format %{ "ubfx $dst, $src, $mask" %}
   ins_encode %{
-    int rshift = $rshift$$constant;
+    int rshift = $rshift$$constant & 31;
     long mask = $mask$$constant;
     int width = exact_log2(mask+1);
     __ ubfx(as_Register($dst$$reg),

-- 
Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


More information about the aarch64-port-dev mailing list