On 27/05/26 10:38 am, Michael Meissner wrote:
> On Wed, May 13, 2026 at 08:05:12PM +0530, jeevitha wrote:
>> Gentle Ping!
>>
>> Thanks & Regards
>>  Jeevitha
>>
>> On 14/04/26 5:04 pm, jeevitha wrote:
>>> Hi All,
>>>
>>> The following patch has been bootstrapped and regtested on 
>>> powerpc64le-linux.
>>>
>>> Changes from V1:
>>> * Added new test pr106895-2.c.
>>>
>>> PTImode is used to generate even/odd register pairs for 128-bit values.
>>> When PTImode is specified via a type attribute, compilation fails
>>> because no internal type exists to represent this mode.
>>>
>>> Introduce signed and unsigned PTImode internal builtin types to handle
>>> PTImode. These __pti_internal types are not documented, as they are not
>>> intended for direct user use.
>>>
>>> 2026-04-14  Jeevitha Palanisamy  <[email protected]>
> 
> Some minor comments.  It is ok to commit if you make the changes and do
> a bootstrap on both 32-bit and 64-bit systems to ensure there are no
> other regressions with the changes.:

This patch has been committed to trunk. Can I backport it to
all open branches?

>>> gcc/
>>>     PR target/106895
>>>     * config/rs6000/rs6000.h (enum rs6000_builtin_type_index): Add
>>>     RS6000_BTI_INTPTI and RS6000_BTI_UINTPTI.
>>>     (intPTI_type_internal_node, uintPTI_type_internal_node): New
>>>     PTImode type macros.
>>>     * config/rs6000/rs6000-builtin.cc (rs6000_init_builtins): Register
>>>     signed and unsigned PTImode internal builtin types.
>>>     * config/rs6000/sync.md (trunctipti2): New splitter.
>>>     (extendptiti2): Likewise.
>>>     (zero_extendptiti2): Likewise.
>>>
>>> gcc/testsuite/
>>>     PR target/106895
>>>     * gcc.target/powerpc/pr106895-1.c: New test.
>>>     * gcc.target/powerpc/pr106895-2.c: New test.
>>>
>>> diff --git a/gcc/config/rs6000/rs6000-builtin.cc 
>>> b/gcc/config/rs6000/rs6000-builtin.cc
>>> index bbf60de3b1b..8561cd67f53 100644
>>> --- a/gcc/config/rs6000/rs6000-builtin.cc
>>> +++ b/gcc/config/rs6000/rs6000-builtin.cc
>>> @@ -756,6 +756,19 @@ rs6000_init_builtins (void)
>>>    else
>>>      ieee128_float_type_node = NULL_TREE;
>>>  
>>> +  /* PTImode to get even/odd register pairs.  */
>>> +  intPTI_type_internal_node = make_signed_type (GET_MODE_BITSIZE 
>>> (PTImode));
>>> +  SET_TYPE_MODE (intPTI_type_internal_node, PTImode);
>>> +  t = build_qualified_type (intPTI_type_internal_node, TYPE_QUAL_CONST);
>>> +  lang_hooks.types.register_builtin_type (intPTI_type_internal_node,
>>> +                                     "__pti_internal");
>>> +
>>> +  uintPTI_type_internal_node = make_unsigned_type (GET_MODE_BITSIZE 
>>> (PTImode));
>>> +  SET_TYPE_MODE (uintPTI_type_internal_node, PTImode);
>>> +  t = build_qualified_type (uintPTI_type_internal_node, TYPE_QUAL_CONST);
>>> +  lang_hooks.types.register_builtin_type (uintPTI_type_internal_node,
>>> +                                     "__upti_internal");
>>> +
>>>    /* Vector pair and vector quad support.  */
>>>    vector_pair_type_node = make_node (OPAQUE_TYPE);
>>>    SET_TYPE_MODE (vector_pair_type_node, OOmode);
> 
> Given 128-bit integer types are only implemented on 64-bit systemss, I
> think adding these two types should be under a TARGET_POWERPC64 test.
> 
>>> diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
>>> index 2b90694cef1..d85f71aa65d 100644
>>> --- a/gcc/config/rs6000/rs6000.h
>>> +++ b/gcc/config/rs6000/rs6000.h
>>> @@ -2285,6 +2285,8 @@ enum rs6000_builtin_type_index
>>>    RS6000_BTI_ptr_vector_quad,
>>>    RS6000_BTI_ptr_long_long,
>>>    RS6000_BTI_ptr_long_long_unsigned,
>>> +  RS6000_BTI_INTPTI,
>>> +  RS6000_BTI_UINTPTI,
>>>    RS6000_BTI_MAX
>>>  };
>>>  
>>> @@ -2329,6 +2331,8 @@ enum rs6000_builtin_type_index
>>>  #define uintDI_type_internal_node   
>>> (rs6000_builtin_types[RS6000_BTI_UINTDI])
>>>  #define intTI_type_internal_node    
>>> (rs6000_builtin_types[RS6000_BTI_INTTI])
>>>  #define uintTI_type_internal_node   
>>> (rs6000_builtin_types[RS6000_BTI_UINTTI])
>>> +#define intPTI_type_internal_node   
>>> (rs6000_builtin_types[RS6000_BTI_INTPTI])
>>> +#define uintPTI_type_internal_node  
>>> (rs6000_builtin_types[RS6000_BTI_UINTPTI])
>>>  #define float_type_internal_node    
>>> (rs6000_builtin_types[RS6000_BTI_float])
>>>  #define double_type_internal_node   
>>> (rs6000_builtin_types[RS6000_BTI_double])
>>>  #define long_double_type_internal_node      
>>> (rs6000_builtin_types[RS6000_BTI_long_double])
>>> diff --git a/gcc/config/rs6000/sync.md b/gcc/config/rs6000/sync.md
>>> index 7087daf7e4c..4e392584bbc 100644
>>> --- a/gcc/config/rs6000/sync.md
>>> +++ b/gcc/config/rs6000/sync.md
>>> @@ -198,6 +198,54 @@
>>>    DONE;
>>>  })
>>>  
>>> +;; PTI and TI are both 128-bit modes; the following conversions are
>>> +;; register-class changes only, no actual truncation, sign or zero
>>> +;; extension occurs.
>>> +(define_insn_and_split "trunctipti2"
>>> +  [(set (match_operand:PTI 0 "register_operand" "=r")
>>> +        (truncate:PTI (match_operand:TI 1 "register_operand" "r")))]
>>> +  ""
>>> +  "#"
>>> +  "&& reload_completed"
>>> +  [(set (match_dup 2) (match_dup 4))
>>> +   (set (match_dup 3) (match_dup 5))]
>>> +{
>>> +  operands[2] = gen_lowpart (DImode, operands[0]);
>>> +  operands[3] = gen_highpart (DImode, operands[0]);
>>> +  operands[4] = gen_lowpart (DImode, operands[1]);
>>> +  operands[5] = gen_highpart (DImode, operands[1]);
>>> +})
> 
> You should set the length attribute because the conditional jump
> generation needs to know how big each insn is, so that if necessary, it
> can reverse the test and generate a jump over an unconditional jump.
> Also, we should limit this to 64-bit systems.
> 
> Now, one other thing that in theory is helpful is to have an
> alternative where the same register is used.  This dead copy is
> eliminated, but it can help if the register allocator uses the same
> register.  Something like:
> 
> ;; PTI and TI are both 128-bit modes; the following conversions are
> ;; register-class changes only, no actual truncation, sign or zero
> ;; extension occurs.  If the register allocator uses the same input
> ;; and output register, the useless copies will be deleted.
> (define_insn_and_split "trunctipti2"
>   [(set (match_operand:PTI 0 "register_operand" "=r,r")
>         (truncate:PTI (match_operand:TI 1 "register_operand" "0,r")))]
>   "TARGET_POWERPC64"
>   "#"
>   "&& reload_completed"
>   [(set (match_dup 2) (match_dup 4))
>    (set (match_dup 3) (match_dup 5))]
> {
>   operands[2] = gen_lowpart (DImode, operands[0]);
>   operands[3] = gen_highpart (DImode, operands[0]);
>   operands[4] = gen_lowpart (DImode, operands[1]);
>   operands[5] = gen_highpart (DImode, operands[1]);
> }
>   [(set_attr "length" "0,8")])
> 
> 
>>> +(define_insn_and_split "extendptiti2"
>>> +  [(set (match_operand:TI 0 "register_operand" "=r")
>>> +        (sign_extend:TI (match_operand:PTI 1 "register_operand" "r")))]
>>> +  ""
>>> +  "#"
>>> +  "&& reload_completed"
>>> +  [(set (match_dup 2) (match_dup 4))
>>> +   (set (match_dup 3) (match_dup 5))]
>>> +{
>>> +  operands[2] = gen_lowpart (DImode, operands[0]);
>>> +  operands[3] = gen_highpart (DImode, operands[0]);
>>> +  operands[4] = gen_lowpart (DImode, operands[1]);
>>> +  operands[5] = gen_highpart (DImode, operands[1]);
>>> +})
> 
> Similar changes here.
> 
>>> +(define_insn_and_split "zero_extendptiti2"
>>> +  [(set (match_operand:TI 0 "register_operand" "=r")
>>> +        (zero_extend:TI (match_operand:PTI 1 "register_operand" "r")))]
>>> +  ""
>>> +  "#"
>>> +  "&& reload_completed"
>>> +  [(set (match_dup 2) (match_dup 4))
>>> +   (set (match_dup 3) (match_dup 5))]
>>> +{
>>> +  operands[2] = gen_lowpart (DImode, operands[0]);
>>> +  operands[3] = gen_highpart (DImode, operands[0]);
>>> +  operands[4] = gen_lowpart (DImode, operands[1]);
>>> +  operands[5] = gen_highpart (DImode, operands[1]);
>>> +})
>>> +
>>>  ;; If TARGET_PREFIXED, always use pstq rather than stq.
>>>  (define_insn "store_quadpti"
>>>    [(set (match_operand:PTI 0 "quad_memory_operand" "=wQ")
> 
> And here.
> 

Reply via email to