Go to file
Jim Grosbach d10f1c04aa ARM: Improve codegen for vget_low_* and vget_high_ intrinsics.
These intrinsics use the __builtin_shuffle() function to extract the
low and high half, respectively, of a 128-bit NEON vector. Currently,
they're defined to use bitcasts to simplify the emitter, so we get code
like:
uint16x4_t vget_low_u32(uint16x8_t __a) {
  return (uint32x2_t) __builtin_shufflevector((int64x2_t) __a,
                                              (int64x2_t) __a,
                                              0);
}

While this works, it results in those bitcasts going all the way through
to the IR, resulting in code like:
  %1 = bitcast <8 x i16> %in to <2 x i64>
  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <1 x i32>
  %zeroinitializer
  %3 = bitcast <1 x i64> %2 to <4 x i16>

We can instead easily perform the operation directly on the input vector
like:

uint16x4_t vget_low_u16(uint16x8_t __a) {
  return __builtin_shufflevector(__a, __a, 0, 1, 2, 3);
}

Not only is that much easier to read on its own, it also results in
cleaner IR like:

  %1 = shufflevector <8 x i16> %in, <8 x i16> undef,
                     <4 x i32> <i32 0, i32 1, i32 2, i32 3>

This is both easier to read and easier for the back end to reason
about effectively since the operation is obfuscating the source with
bitcasts.

rdar://13894163

llvm-svn: 181865
2013-05-15 02:40:04 +00:00
clang ARM: Improve codegen for vget_low_* and vget_high_ intrinsics. 2013-05-15 02:40:04 +00:00
clang-tools-extra cpp11-migrate: Add override specifier before comments on inline methods 2013-05-14 17:34:12 +00:00
compiler-rt [sanitizer] Fix Android build. 2013-05-14 15:22:39 +00:00
debuginfo-tests Remove IR scenario tests. 2013-03-15 20:52:10 +00:00
libclc Update the copyright coredits -- Happy new year 2013! 2013-01-01 10:00:19 +00:00
libcxx Fixing the MSan/compiler-rt build 2013-05-13 21:53:44 +00:00
libcxxabi Add capability to demangle invocation functions for ObjC blocks. 2013-04-10 19:44:03 +00:00
lld [lld] Fix compiler warning that shift count is too big on P64. 2013-05-14 23:51:50 +00:00
lldb Change the mechanism around SBValue::GetSP() so that it always requires the target API lock AND the 2013-05-15 02:16:21 +00:00
llvm ELFRelocationEntry::operator<(): Try to stabilize the order. r_offset was insufficient to sort Relocs. 2013-05-15 02:16:23 +00:00
polly Sort includes 2013-05-07 08:11:54 +00:00