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")
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+}