[aarch64-port-dev ] Correct costs for operations with shifts

Andrew Haley aph at redhat.com
Thu May 15 13:24:31 UTC 2014


Th can be more expensive to do, say, an addition with a shift than a
plain addition.  This patch makes such operations more expensive than
simple operations, but less expensive than the two separate instructions.

Andrew.


# HG changeset patch
# User aph
# Date 1400153832 14400
#      Thu May 15 07:37:12 2014 -0400
# Node ID a2e9ac7b3434982b06faef8df4a78da78b374dad
# Parent  9d3bc0f40cce83038e5a0d5fc8a51389530538d9
Correct costs for operations with shifts.

diff -r 9d3bc0f40cce -r a2e9ac7b3434 src/cpu/aarch64/vm/aarch64.ad
--- a/src/cpu/aarch64/vm/aarch64.ad	Wed May 14 15:43:50 2014 +0100
+++ b/src/cpu/aarch64/vm/aarch64.ad	Thu May 15 07:37:12 2014 -0400
@@ -7042,7 +7042,7 @@
 instruct addP_reg_reg_lsl(iRegPNoSp dst, iRegP src1, iRegL src2, immIScale scale) %{
   match(Set dst (AddP src1 (LShiftL src2 scale)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "add $dst, $src1, $src2, LShiftL $scale\t# ptr" %}

   ins_encode %{
@@ -7057,7 +7057,7 @@
 instruct addP_reg_reg_ext_shift(iRegPNoSp dst, iRegP src1, iRegIorL2I src2, immIScale scale) %{
   match(Set dst (AddP src1 (LShiftL (ConvI2L src2) scale)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "add $dst, $src1, $src2, I2L $scale\t# ptr" %}

   ins_encode %{
@@ -7784,7 +7784,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndI src1 (XorI(URShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bicw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -7802,7 +7802,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndL src1 (XorL(URShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bic  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -7820,7 +7820,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndI src1 (XorI(RShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bicw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -7838,7 +7838,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndL src1 (XorL(RShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bic  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -7856,7 +7856,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndI src1 (XorI(LShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bicw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -7874,7 +7874,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (AndL src1 (XorL(LShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "bic  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -7892,7 +7892,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorI src4 (XorI(URShiftI src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eonw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -7910,7 +7910,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorL src4 (XorL(URShiftL src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eon  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -7928,7 +7928,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorI src4 (XorI(RShiftI src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eonw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -7946,7 +7946,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorL src4 (XorL(RShiftL src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eon  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -7964,7 +7964,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorI src4 (XorI(LShiftI src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eonw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -7982,7 +7982,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (XorL src4 (XorL(LShiftL src2 src3) src1)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eon  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8000,7 +8000,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrI src1 (XorI(URShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "ornw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8018,7 +8018,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrL src1 (XorL(URShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orn  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8036,7 +8036,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrI src1 (XorI(RShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "ornw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8054,7 +8054,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrL src1 (XorL(RShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orn  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8072,7 +8072,7 @@
                          iRegI src1, iRegI src2,
                          immI src3, immI_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrI src1 (XorI(LShiftI src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "ornw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8090,7 +8090,7 @@
                          iRegL src1, iRegL src2,
                          immI src3, immL_M1 src4, rFlagsReg cr) %{
   match(Set dst (OrL src1 (XorL(LShiftL src2 src3) src4)));
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orn  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8109,7 +8109,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndI src1 (URShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8128,7 +8128,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndL src1 (URShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andr  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8147,7 +8147,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndI src1 (RShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8166,7 +8166,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndL src1 (RShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andr  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8185,7 +8185,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndI src1 (LShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8204,7 +8204,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AndL src1 (LShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "andr  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8223,7 +8223,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorI src1 (URShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eorw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8242,7 +8242,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorL src1 (URShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eor  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8261,7 +8261,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorI src1 (RShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eorw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8280,7 +8280,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorL src1 (RShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eor  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8299,7 +8299,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorI src1 (LShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eorw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8318,7 +8318,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (XorL src1 (LShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "eor  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8337,7 +8337,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrI src1 (URShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orrw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8356,7 +8356,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrL src1 (URShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orr  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8375,7 +8375,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrI src1 (RShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orrw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8394,7 +8394,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrL src1 (RShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orr  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8413,7 +8413,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrI src1 (LShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orrw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8432,7 +8432,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (OrL src1 (LShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "orr  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8451,7 +8451,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddI src1 (URShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "addw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8470,7 +8470,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddL src1 (URShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "add  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8489,7 +8489,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddI src1 (RShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "addw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8508,7 +8508,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddL src1 (RShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "add  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8527,7 +8527,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddI src1 (LShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "addw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8546,7 +8546,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (AddL src1 (LShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "add  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8565,7 +8565,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubI src1 (URShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "subw  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8584,7 +8584,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubL src1 (URShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "sub  $dst, $src1, $src2, LSR $src3" %}

   ins_encode %{
@@ -8603,7 +8603,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubI src1 (RShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "subw  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8622,7 +8622,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubL src1 (RShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "sub  $dst, $src1, $src2, ASR $src3" %}

   ins_encode %{
@@ -8641,7 +8641,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubI src1 (LShiftI src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "subw  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -8660,7 +8660,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst (SubL src1 (LShiftL src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "sub  $dst, $src1, $src2, LSL $src3" %}

   ins_encode %{
@@ -9021,7 +9021,7 @@
 %{
   match(Set dst (AddL src1 (ConvI2L src2)));
   ins_cost(INSN_COST);
-  format %{ "add  $dst, $src1,  $src2, sxtw" %}
+  format %{ "add  $dst, $src1, sxtw $src2" %}

    ins_encode %{
      __ add(as_Register($dst$$reg), as_Register($src1$$reg),
@@ -9034,7 +9034,7 @@
 %{
   match(Set dst (SubL src1 (ConvI2L src2)));
   ins_cost(INSN_COST);
-  format %{ "sub  $dst, $src1,  $src2, sxtw" %}
+  format %{ "sub  $dst, $src1, sxtw $src2" %}

    ins_encode %{
      __ sub(as_Register($dst$$reg), as_Register($src1$$reg),
@@ -9100,7 +9100,7 @@
 %{
   match(Set dst (AddL src1 (RShiftL (LShiftL src2 lshift) rshift)));
   ins_cost(INSN_COST);
-  format %{ "add  $dst, $src1, sxtw $src2, sxtw" %}
+  format %{ "add  $dst, $src1, sxtw $src2" %}

    ins_encode %{
      __ add(as_Register($dst$$reg), as_Register($src1$$reg),
diff -r 9d3bc0f40cce -r a2e9ac7b3434 src/cpu/aarch64/vm/aarch64_ad.m4
--- a/src/cpu/aarch64/vm/aarch64_ad.m4	Wed May 14 15:43:50 2014 +0100
+++ b/src/cpu/aarch64/vm/aarch64_ad.m4	Thu May 15 07:37:12 2014 -0400
@@ -7,7 +7,7 @@
                          immI src3, rFlagsReg cr) %{
   match(Set dst ($2$1 src1 ($4$1 src2 src3)));

-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "$3  $dst, $src1, $src2, $5 $src3" %}

   ins_encode %{
@@ -52,7 +52,7 @@
   ifelse($2,Xor,
     match(Set dst ($2$1 src4 (Xor$1($4$1 src2 src3) src1)));,
     match(Set dst ($2$1 src1 (Xor$1($4$1 src2 src3) src4)));)
-  ins_cost(INSN_COST);
+  ins_cost(1.9 * INSN_COST);
   format %{ "$3  $dst, $src1, $src2, $5 $src3" %}

   ins_encode %{
@@ -278,7 +278,7 @@
 %{
   match(Set dst ($3$2 src1 (ConvI2L src2)));
   ins_cost(INSN_COST);
-  format %{ "$4  $dst, $src1, $6 $src2" %}
+  format %{ "$4  $dst, $src1, $5 $src2" %}

    ins_encode %{
      __ $4(as_Register($dst$$reg), as_Register($src1$$reg),


More information about the aarch64-port-dev mailing list