On Wed, 2023-05-31 at 12:59 -0500, Peter Bergner wrote: > On 5/22/23 4:04 AM, Kewen.Lin wrote: > > on 2023/5/11 02:06, Carl Love via Gcc-patches wrote: > > > @@ -3161,12 +3161,15 @@ > > > void __builtin_altivec_tr_stxvrbx (vsq, signed long, signed > > > char *); > > > TR_STXVRBX vsx_stxvrbx {stvec} > > > > > > - void __builtin_altivec_tr_stxvrhx (vsq, signed long, signed > > > int *); > > > + void __builtin_altivec_tr_stxvrhx (vsq, signed long, signed > > > short *); > > > TR_STXVRHX vsx_stxvrhx {stvec} > > > > > > - void __builtin_altivec_tr_stxvrwx (vsq, signed long, signed > > > short *); > > > + void __builtin_altivec_tr_stxvrwx (vsq, signed long, signed > > > int *); > > > TR_STXVRWX vsx_stxvrwx {stvec} > > > > Good catching! > > This hunk should be its own patch and commit, as it is independent of > the other change. Especially since other built-ins also don't have > {,un}simgned long * as arguments, not just > __builtin_altivec_tr_stxvr*x.
Yes, I was thinking the patch needs to be split into a bug fix and a patch for the long * arguments. I redid the patch to create the bug fix only. The patch includes a testcase that tests the __builtin_altivec_tr_stxvr* builtins. I will post the new patch. The updated patch is now called: " rs6000: Fix arguments for __builtin_altivec_tr_stxvrwx, __builtin_altivec_tr_stxvrhx" > > > > > > + void __builtin_altivec_tr_stxvrlx (vsq, signed long, signed > > > long *); > > > + TR_STXVRLX vsx_stxvrdx {stvec} > > > + > > > > This is mapped to the one used for type long long, it's a hard > > mapping, > > IMHO it's wrong and not consistent with what the users expect, > > since on Power > > the size of type long int is 4 bytes at -m32 while 8 bytes at -m64, > > this > > implementation binding to 8 bytes can cause trouble in 32-bit. I > > wonder if > > it's a good idea to add one overloaded version for type long int, > > for now > > openxl also emits error message for long int type pointer (see its > > doc [1]), > > users can use casting to make it to the acceptable pointer types > > (long long > > or int as its size). > > I'm the person who noticed that we don't accept signed/unsigned long > * as > an argument type and asked Carl to investigate. I find it hard to > believe > we accept all integer pointer types, except long *. I agree that it > shouldn't > always map to long long *, since as you say, that's wrong for -m32. > My hope was that we could somehow automagically handle the long * > types > in the built-in machinery, mapping them to either the int * built-in > or > the long long * built-in depending on -m32 or -m64. Again, this > limitation > is no limited to __builtin_altivec_tr_stx* built-ins, but others as > well, > so I was kind of hoping for a general solution that would fix them > all. > I'm not sure of that's possible though. Per Peter's request, I added the overloaded version of the __builtin_vec_xst_trunc builtin with the long * argument which Kewen pushed back on. So, that approach is not acceptable. Not sure about how to get the builtin infrastructure to automatically map long * to int * or long long *? If someone has some idea on how to do that, I will gladly pursue it. I will study the builtin support some more to see if I can come up with any ideas as well. Carl