S/390: Add loc patterns for QImode and HImode
This adds QImode and HImode support to load on condition. gcc/ChangeLog: 2018-11-05 Robin Dapp <rdapp@linux.ibm.com> * config/s390/s390.md: QImode and HImode for load on condition. gcc/testsuite/ChangeLog: 2018-11-05 Robin Dapp <rdapp@linux.ibm.com> * gcc.target/s390/ifcvt-one-insn-bool.c: New test. * gcc.target/s390/ifcvt-one-insn-char.c: New test. From-SVN: r265808
This commit is contained in:
parent
88e845c060
commit
d89288868c
@ -1,3 +1,7 @@
|
||||
2018-11-05 Robin Dapp <rdapp@linux.ibm.com>
|
||||
|
||||
* config/s390/s390.md: QImode and HImode for load on condition.
|
||||
|
||||
2018-11-05 Robin Dapp <rdapp@linux.ibm.com>
|
||||
|
||||
* config/s390/predicates.md: Fix typo.
|
||||
|
@ -6592,6 +6592,44 @@
|
||||
XEXP (operands[1], 1));
|
||||
})
|
||||
|
||||
;;
|
||||
;; - We do not have instructions for QImode or HImode but still
|
||||
;; enable load on condition/if conversion for them.
|
||||
(define_expand "mov<mode>cc"
|
||||
[(set (match_operand:HQI 0 "nonimmediate_operand" "")
|
||||
(if_then_else:HQI (match_operand 1 "comparison_operator" "")
|
||||
(match_operand:HQI 2 "loc_operand" "")
|
||||
(match_operand:HQI 3 "loc_operand" "")))]
|
||||
"TARGET_Z196"
|
||||
{
|
||||
/* Emit the comparison insn in case we do not already have a comparison
|
||||
result. */
|
||||
if (!s390_comparison (operands[1], VOIDmode))
|
||||
operands[1] = s390_emit_compare (GET_CODE (operands[1]),
|
||||
XEXP (operands[1], 0),
|
||||
XEXP (operands[1], 1));
|
||||
|
||||
rtx then = operands[2];
|
||||
rtx els = operands[3];
|
||||
|
||||
if ((!TARGET_Z13 && CONSTANT_P (then)) || MEM_P (then))
|
||||
then = force_reg (<MODE>mode, then);
|
||||
if ((!TARGET_Z13 && CONSTANT_P (els)) || MEM_P (els))
|
||||
els = force_reg (<MODE>mode, els);
|
||||
|
||||
if (!CONSTANT_P (then))
|
||||
then = simplify_gen_subreg (E_SImode, then, <MODE>mode, 0);
|
||||
if (!CONSTANT_P (els))
|
||||
els = simplify_gen_subreg (E_SImode, els, <MODE>mode, 0);
|
||||
|
||||
rtx tmp_target = gen_reg_rtx (E_SImode);
|
||||
emit_insn (gen_movsicc (tmp_target, operands[1], then, els));
|
||||
emit_move_insn (operands[0], gen_lowpart (<MODE>mode, tmp_target));
|
||||
DONE;
|
||||
})
|
||||
|
||||
|
||||
|
||||
; locr, loc, stoc, locgr, locg, stocg, lochi, locghi
|
||||
(define_insn "*mov<mode>cc"
|
||||
[(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d,d,d,d,d,S,S")
|
||||
|
@ -1,3 +1,8 @@
|
||||
2018-10-26 Robin Dapp <rdapp@linux.ibm.com>
|
||||
|
||||
* gcc.target/s390/ifcvt-one-insn-bool.c: New test.
|
||||
* gcc.target/s390/ifcvt-one-insn-char.c: New test.
|
||||
|
||||
2018-11-05 Robin Dapp <rdapp@linux.ibm.com>
|
||||
|
||||
* gcc.dg/loop-8.c: On s390, always run the test with -march=zEC12.
|
||||
|
24
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-bool.c
Normal file
24
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-bool.c
Normal file
@ -0,0 +1,24 @@
|
||||
/* Check load on condition for bool. */
|
||||
|
||||
/* { dg-do compile { target { s390*-*-* } } } */
|
||||
/* { dg-options "-O2 -march=z13" } */
|
||||
|
||||
/* { dg-final { scan-assembler "lochinh\t%r.?,1" } } */
|
||||
#include <stdbool.h>
|
||||
|
||||
int foo (int *a, unsigned int n)
|
||||
{
|
||||
int min = 999999;
|
||||
bool bla = false;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (a[i] < min)
|
||||
{
|
||||
bla = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (bla)
|
||||
min += 1;
|
||||
return min;
|
||||
}
|
26
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-char.c
Normal file
26
gcc/testsuite/gcc.target/s390/ifcvt-one-insn-char.c
Normal file
@ -0,0 +1,26 @@
|
||||
/* Check load on condition for global char. */
|
||||
|
||||
/* { dg-do compile { target { s390*-*-* } } } */
|
||||
/* { dg-options "-O2 -march=z13" } */
|
||||
|
||||
/* { dg-final { scan-assembler "locrnh\t%r.?,%r.?" } } */
|
||||
#include <stdbool.h>
|
||||
|
||||
char g = 42;
|
||||
|
||||
int foo (int *a, unsigned int n)
|
||||
{
|
||||
int min = 999999;
|
||||
char bla = 3;
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (a[i] < min)
|
||||
{
|
||||
bla = g;
|
||||
}
|
||||
}
|
||||
|
||||
if (bla == 42)
|
||||
min += 1;
|
||||
return min;
|
||||
}
|
Loading…
Reference in New Issue
Block a user