MaskRay marked an inline comment as done. MaskRay added a comment. float ws_float(float x, float y) { __asm__ ("xsadddp %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } float ww_float(float x, float y) { __asm__ ("xsadddp %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; } double ws_double(double x, double y) { __asm__ ("xsadddp %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } double ww_double(double x, double y) { __asm__ ("xsadddp %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; }
% powerpc64le-linux-gnu-gcc -O2 a.c -S -o - | grep xsadd xsadddp 1, 1, 2 xsadddp 1, 1, 2 xsadddp 1, 1, 2 xsadddp 1, 1, 2 float scalar_ww_float(float x, float y) { __asm__ ("fadds %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; } float scalar_ws_float(float x, float y) { __asm__ ("fadds %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } double scalar_ww_double(double x, double y) { __asm__ ("fadds %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; } double scalar_ws_double(double x, double y) { __asm__ ("fadds %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } % powerpc64le-linux-gnu-gcc -O2 a.c -S -o - | grep fadds fadds 1, 1, 2 fadds 1, 1, 2 fadds 1, 1, 2 fadds 1, 1, 2 ================ Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:14080 return std::make_pair(0U, &PPC::VSRCRegClass); - } else if (Constraint == "ws" && Subtarget.hasVSX()) { + } else if ((Constraint == "ws" || Constraint == "ww") && Subtarget.hasVSX()) { if (VT == MVT::f32 && Subtarget.hasP8Vector()) ---------------- jsji wrote: > MaskRay wrote: > > jsji wrote: > > > Should we exclude `FP` for `ws` and return `VFRCRegClass` instead of > > > `VSFRCRegClass` ? > > Can you elaborate on what I should do? I'm not familiar with the register > > info stuff... > `VSFRC` contains both `F8RC` and `VFRC`. `F8RC` is FP. > So if `ws` can NOT use FP, then we should not use `VSFRC`. > > However, if `ws` can use `FP` as well as you found in later GCC experiments, > then we don't need to do this. ``` float ws_float(float x, float y) { __asm__ ("xsadddp %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } float ww_float(float x, float y) { __asm__ ("xsadddp %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; } double ws_double(double x, double y) { __asm__ ("xsadddp %0, %1, %2" : "=ws"(x) : "ws"(x), "ws"(y)); return x; } double ww_double(double x, double y) { __asm__ ("xsadddp %0, %1, %2" : "=ww"(x) : "ww"(x), "ww"(y)); return x; } ``` ``` % powerpc64le-linux-gnu-gcc -O2 a.c -S -o - | grep xsadd xsadddp 1, 1, 2 xsadddp 1, 1, 2 xsadddp 1, 1, 2 xsadddp 1, 1, 2 ``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64119/new/ https://reviews.llvm.org/D64119 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits