s390: Fix constraint for insn *cmphi_ccu

Message ID 20231025092732.1636701-2-stefansf@linux.ibm.com
State Accepted
Headers
Series s390: Fix constraint for insn *cmphi_ccu |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Stefan Schulze Frielinghaus Oct. 25, 2023, 9:27 a.m. UTC
  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.

Bootstrapped and regtested on s390.  Ok for mainline?

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 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  

Comments

Stefan Schulze Frielinghaus Nov. 27, 2023, 9:12 a.m. UTC | #1
Ping.

On Wed, Oct 25, 2023 at 11:27:33AM +0200, Stefan Schulze Frielinghaus wrote:
> 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.
> 
> Bootstrapped and regtested on s390.  Ok for mainline?
> 
> 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 | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
> index 3f29ba21442..777a20f8e77 100644
> --- a/gcc/config/s390/s390.md
> +++ b/gcc/config/s390/s390.md
> @@ -1355,13 +1355,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")
> -- 
> 2.41.0
>
  
Andreas Krebbel Nov. 27, 2023, 9:20 a.m. UTC | #2
Ok, thanks!

Andreas

On 11/27/23 10:12, Stefan Schulze Frielinghaus wrote:
> Ping.
> 
> On Wed, Oct 25, 2023 at 11:27:33AM +0200, Stefan Schulze Frielinghaus wrote:
>> 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.
>>
>> Bootstrapped and regtested on s390.  Ok for mainline?
>>
>> 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 | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
>> index 3f29ba21442..777a20f8e77 100644
>> --- a/gcc/config/s390/s390.md
>> +++ b/gcc/config/s390/s390.md
>> @@ -1355,13 +1355,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")
>> -- 
>> 2.41.0
>>
  

Patch

diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 3f29ba21442..777a20f8e77 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -1355,13 +1355,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")