diff options
-rw-r--r-- | gcc/config/s390/s390.cc | 2 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c | 3 |
4 files changed, 5 insertions, 7 deletions
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc index c6cfe41..d2af6d8 100644 --- a/gcc/config/s390/s390.cc +++ b/gcc/config/s390/s390.cc @@ -3636,7 +3636,7 @@ s390_rtx_costs (rtx x, machine_mode mode, int outer_code, /* It is going to be a load/store on condition. Make it slightly more expensive than a normal load. */ - *total = COSTS_N_INSNS (1) + 1; + *total = COSTS_N_INSNS (1) + 2; rtx dst = SET_DEST (x); rtx then = XEXP (SET_SRC (x), 1); diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index e3ccbac..5eee8e8 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -7003,9 +7003,9 @@ if (!CONSTANT_P (els)) els = simplify_gen_subreg (E_SImode, els, <MODE>mode, 0); - rtx tmp_target = gen_reg_rtx (E_SImode); + rtx tmp_target = simplify_gen_subreg (E_SImode, operands[0], <MODE>mode, 0); + emit_insn (gen_movsicc (tmp_target, operands[1], then, els)); - emit_move_insn (operands[0], gen_lowpart (<MODE>mode, tmp_target)); DONE; }) diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c index 1ced710..031cc43 100644 --- a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c +++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-int.c @@ -5,7 +5,6 @@ /* { dg-final { scan-assembler "lochinle\t%r.?,1" } } */ /* { dg-final { scan-assembler "locrnle\t.*" } } */ -#include <stdbool.h> #include <limits.h> #include <stdio.h> #include <assert.h> @@ -33,7 +32,7 @@ int main() { int a[] = {2, 1, -13, INT_MAX, INT_MIN, 0}; - int res = foo (a, sizeof (a)); + int res = foo (a, sizeof (a) / sizeof (a[0])); assert (res == (INT_MIN + 1)); } diff --git a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c index 5a1173f..cd04d2a 100644 --- a/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c +++ b/gcc/testsuite/gcc.target/s390/ifcvt-two-insns-long.c @@ -5,7 +5,6 @@ /* { dg-final { scan-assembler "locghinle\t%r.?,1" } } */ /* { dg-final { scan-assembler "locgrnle\t.*" } } */ -#include <stdbool.h> #include <limits.h> #include <stdio.h> #include <assert.h> @@ -33,7 +32,7 @@ int main() { long a[] = {2, 1, -13, LONG_MAX, LONG_MIN, 0}; - long res = foo (a, sizeof (a)); + long res = foo (a, sizeof (a) / sizeof (a[0])); assert (res == (LONG_MIN + 1)); } |