[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