s390: Fix constraint for insn *cmphi_ccu

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.
This commit is contained in:
Stefan Schulze Frielinghaus 2023-10-25 11:18:14 +02:00
parent 221166ad15
commit 74a7bb2c50

View file

@ -1356,13 +1356,13 @@
(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")