]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Fix constraint for insn *cmphi_ccu
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Wed, 25 Oct 2023 09:18:14 +0000 (11:18 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Mon, 27 Nov 2023 09:23:17 +0000 (10:23 +0100)
Currently for an unsigned 16-bit comparison between memory and an
immediate where the high bit is set, a clc is emitted.  This is because
the constant is created for mode HI and therefore sign extended.  This
means constraint D does not hold anymore.  Since the mode already
restricts the immediate to 16 bit, it is enough to make use of
constraint n and chop of the high bits in the output template.

gcc/ChangeLog:

* config/s390/s390.md (*cmphi_ccu): For immediate operand 1 make
use of constraint n instead of D and chop of high bits in the
output template.

gcc/config/s390/s390.md

index e30795a00ab1706dd0850605957d718574257e74..685bb288b088f126a1579d278a9298d2fcc0d956 100644 (file)
 (define_insn "*cmphi_ccu"
   [(set (reg CC_REGNUM)
         (compare (match_operand:HI 0 "nonimmediate_operand" "d,d,Q,Q,BQ")
-                 (match_operand:HI 1 "general_operand"      "Q,S,D,BQ,Q")))]
+                 (match_operand:HI 1 "general_operand"      "Q,S,n,BQ,Q")))]
   "s390_match_ccmode (insn, CCUmode)
    && !register_operand (operands[1], HImode)"
   "@
    clm\t%0,3,%S1
    clmy\t%0,3,%S1
-   clhhsi\t%0,%1
+   clhhsi\t%0,%x1
    #
    #"
   [(set_attr "op_type" "RS,RSY,SIL,SS,SS")