[LLVMbugs] [Bug 11025] New: Represent hadd, vector shift without target specific builtins.

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Sep 27 10:40:44 PDT 2011


           Summary: Represent hadd, vector shift without target specific
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Headers
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: benny.kra at gmail.com
                CC: llvmbugs at cs.uiuc.edu

We should try to reduce the amount of target specific builtins used to
implement intrinsics, if we can represent them with standard IR and the machine
code output is still the same. This makes the optimizer's job easier.
Eventually we can remove those builtins entirely (llvm-gcc will still generate
them so we need to autoupgrade).


Thanks to Duncan's recent work, the X86 backend can match horizontal add and
sub of fp vectors now, so we can represent it as shufflevectors + fadd.

static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
_mm_hadd_pd(__m128d a, __m128d b)
  return __builtin_shufflevector(a, b, 0, 2) + __builtin_shufflevector(a, b, 1,

similar for hsub_pd, hadd_ps and hsub_ps.


Vector shift support should also be solid enough now, so we can rewrite the
shift intrinsics:

static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
_mm_slli_epi16(__m128i a, int count)
  return (__m128i)((__v8hi)a << (__v8hi){ count, count, count, count,
                                          count, count, count, count });

We have to be careful here though, some x86 shift instructions don't support
variable shifts. Not sure if we want to allow it and emit unexpected code (or
crash the backend).


minsd/maxsd and friends should be representable with something like "return a <
b ? a : b" and let the backend do the heavy lifting, I couldn't come up with a
way to create the necessary vector compares in C code though.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list