[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