On 12/14/21 7:32 AM, Bill Schmidt wrote:
> Hi!
>
> On 12/13/21 6:22 PM, Segher Boessenkool wrote:
>>
>> These builtins should just return a "long", just like __builtin_ppc_mftb
>> does.  All three of them.
> Well, that seems wrong for __builtin_darn_32, which maps to an SImode pattern.
>
> So, I assume what you'd like to see is for the other two built-ins to return
> long, and for the "&& TARGET_64BIT" to be removed from the darn_raw and darn
> patterns?
>
For the record, I don't see how this can work.  WHen I compile:

#include <altivec.h>

long get_raw_random ()
{
  return __builtin_darn_raw ();
}

with these changes, the compiler thinks that __builtin_darn_raw returns a
register pair, presumably due to it being a DImode pattern.  It then pulls
the second register of the pair as the actual result.

get_raw_random:
.LFB0:
        darn 10,2
        mr 3,11
        blr

The vregs dump shows:

(insn 5 2 6 2 (set (reg:DI 118)
        (unspec_volatile:DI [
                (const_int 0 [0])
            ] UNSPECV_DARN_RAW)) "darn-thing.c":11:10 1043 {darn_raw}
     (nil))
(insn 6 5 10 2 (set (reg:SI 117 [ <retval> ])
        (subreg:SI (reg:DI 118) 4)) "darn-thing.c":11:10 543 {*movsi_internal1}
     (nil))
(insn 10 6 11 2 (set (reg/i:SI 3 3)
        (reg:SI 117 [ <retval> ])) "darn-thing.c":12:1 543 {*movsi_internal1}
     (nil))
(insn 11 10 0 2 (use (reg/i:SI 3 3)) "darn-thing.c":12:1 -1
     (nil))

So if you want to support these patterns for 32-bit mode, there's more work
required.

Given this, I'd like to ask you to reconsider the original submitted patch
for now.

Thanks,
Bill

Reply via email to