This revision was automatically updated to reflect the committed changes.
Closed by commit rG961530fdc9f7: [ARM,MVE] Fix vreinterpretq in big-endian 
mode. (authored by simon_tatham).

Changed prior to commit:
  https://reviews.llvm.org/D73786?vs=241727&id=242012#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D73786/new/

https://reviews.llvm.org/D73786

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/include/clang/Basic/arm_mve_defs.td
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/arm-mve-intrinsics/admin.c
  clang/test/CodeGen/arm-mve-intrinsics/reinterpret.c
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMISelLowering.cpp
  llvm/lib/Target/ARM/ARMISelLowering.h
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/test/CodeGen/Thumb2/mve-be.ll

Index: llvm/test/CodeGen/Thumb2/mve-be.ll
===================================================================
--- llvm/test/CodeGen/Thumb2/mve-be.ll
+++ llvm/test/CodeGen/Thumb2/mve-be.ll
@@ -295,3 +295,64 @@
   %3 = tail call <4 x i32> asm sideeffect "  VMULLB.s32 $0, $1, $1", "=&w,w"(<4 x i32> %2) #2
   ret <4 x i32> %3
 }
+
+; Test case demonstrating that 'bitcast' reinterprets the memory format of a
+; vector, as if stored and then loaded. So if it has to go between two
+; operations treating a register as having different lane sizes, then in
+; big-endian mode, it has to emit a vrev32.16, which is equivalent to the
+; effect that vstrw.32 followed by vldrh.16 would have.
+define arm_aapcs_vfpcc void @test_bitcast(<4 x i32>* readonly %in, <8 x i16>* %out) {
+; CHECK-LE-LABEL: test_bitcast:
+; CHECK-LE:       @ %bb.0: @ %entry
+; CHECK-LE-NEXT:    vldrw.u32 q0, [r0]
+; CHECK-LE-NEXT:    vmul.i32 q0, q0, q0
+; CHECK-LE-NEXT:    vmul.i16 q0, q0, q0
+; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
+; CHECK-LE-NEXT:    bx lr
+;
+; CHECK-BE-LABEL: test_bitcast:
+; CHECK-BE:       @ %bb.0: @ %entry
+; CHECK-BE-NEXT:    vldrw.u32 q0, [r0]
+; CHECK-BE-NEXT:    vmul.i32 q0, q0, q0
+; CHECK-BE-NEXT:    vrev32.16 q0, q0
+; CHECK-BE-NEXT:    vmul.i16 q0, q0, q0
+; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
+; CHECK-BE-NEXT:    bx lr
+entry:
+  %vin = load <4 x i32>, <4 x i32>* %in, align 8
+  %vdbl = mul <4 x i32> %vin, %vin
+  %cast = bitcast <4 x i32> %vdbl to <8 x i16>
+  %cdbl = mul <8 x i16> %cast, %cast
+  store <8 x i16> %cdbl, <8 x i16>* %out, align 8
+  ret void
+}
+
+; Similar test case but using the arm.mve.vreinterpretq intrinsic instead,
+; which is defined to reinterpret the in-register format, so it generates no
+; instruction in either endianness.
+define arm_aapcs_vfpcc void @test_vreinterpretq(<4 x i32>* readonly %in, <8 x i16>* %out) {
+; CHECK-LE-LABEL: test_vreinterpretq:
+; CHECK-LE:       @ %bb.0: @ %entry
+; CHECK-LE-NEXT:    vldrw.u32 q0, [r0]
+; CHECK-LE-NEXT:    vmul.i32 q0, q0, q0
+; CHECK-LE-NEXT:    vmul.i16 q0, q0, q0
+; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
+; CHECK-LE-NEXT:    bx lr
+;
+; CHECK-BE-LABEL: test_vreinterpretq:
+; CHECK-BE:       @ %bb.0: @ %entry
+; CHECK-BE-NEXT:    vldrw.u32 q0, [r0]
+; CHECK-BE-NEXT:    vmul.i32 q0, q0, q0
+; CHECK-BE-NEXT:    vmul.i16 q0, q0, q0
+; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
+; CHECK-BE-NEXT:    bx lr
+entry:
+  %vin = load <4 x i32>, <4 x i32>* %in, align 8
+  %vdbl = mul <4 x i32> %vin, %vin
+  %cast = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32> %vdbl)
+  %cdbl = mul <8 x i16> %cast, %cast
+  store <8 x i16> %cdbl, <8 x i16>* %out, align 8
+  ret void
+}
+
+declare <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32>)
Index: llvm/lib/Target/ARM/ARMInstrMVE.td
===================================================================
--- llvm/lib/Target/ARM/ARMInstrMVE.td
+++ llvm/lib/Target/ARM/ARMInstrMVE.td
@@ -3959,9 +3959,23 @@
 // example when moving between rGPR and VPR.P0 as part of predicate vector
 // shuffles. We also sometimes need to cast between different predicate
 // vector types (v4i1<>v8i1, etc.) also as part of lowering vector shuffles.
-
 def predicate_cast : SDNode<"ARMISD::PREDICATE_CAST", SDTUnaryOp>;
 
+// 'vector_reg_cast' is an operation that reinterprets the contents of an MVE
+// vector register as a different vector type, without changing the contents of
+// the register. It differs from 'bitconvert' in that bitconvert reinterprets
+// the _memory_ storage format of the vector, whereas vector_reg_cast
+// reinterprets the _register_ format - and in big-endian, the memory and
+// register formats are different, so they are different operations.
+//
+// For example, 'vector_reg_cast' between v8i16 and v16i8 will map the LSB of
+// the zeroth i16 lane to the zeroth i8 lane, regardless of system endianness,
+// whereas 'bitconvert' will map it to the high byte in big-endian mode,
+// because that's what VSTRH.16 followed by VLDRB.8 would do. So the bitconvert
+// would have to emit a VREV16.8 instruction, whereas the vector_reg_cast emits
+// no code at all if the vector is already in a register.
+def vector_reg_cast : SDNode<"ARMISD::VECTOR_REG_CAST", SDTUnaryOp>;
+
 let Predicates = [HasMVEInt] in {
   foreach VT = [ v4i1, v8i1, v16i1 ] in {
     def : Pat<(i32 (predicate_cast (VT VCCR:$src))),
@@ -3973,6 +3987,10 @@
       def : Pat<(VT  (predicate_cast (VT2 VCCR:$src))),
                 (VT  (COPY_TO_REGCLASS (VT2 VCCR:$src), VCCR))>;
   }
+
+  foreach VT = [ v16i8, v8i16, v8f16, v4i32, v4f32, v2i64, v2f64 ] in
+    foreach VT2 = [ v16i8, v8i16, v8f16, v4i32, v4f32, v2i64, v2f64 ] in
+      def : Pat<(VT (vector_reg_cast (VT2 MQPR:$src))), (VT MQPR:$src)>;
 }
 
 // end of MVE compares
Index: llvm/lib/Target/ARM/ARMISelLowering.h
===================================================================
--- llvm/lib/Target/ARM/ARMISelLowering.h
+++ llvm/lib/Target/ARM/ARMISelLowering.h
@@ -131,6 +131,7 @@
       LE,           // Low-overhead loops, Loop End
 
       PREDICATE_CAST, // Predicate cast for MVE i1 types
+      VECTOR_REG_CAST, // Reinterpret the current contents of a vector register
 
       VCMP,         // Vector compare.
       VCMPZ,        // Vector compare to zero.
Index: llvm/lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -1605,6 +1605,7 @@
   case ARMISD::WIN__DBZCHK:   return "ARMISD::WIN__DBZCHK";
 
   case ARMISD::PREDICATE_CAST: return "ARMISD::PREDICATE_CAST";
+  case ARMISD::VECTOR_REG_CAST: return "ARMISD::VECTOR_REG_CAST";
   case ARMISD::VCMP:          return "ARMISD::VCMP";
   case ARMISD::VCMPZ:         return "ARMISD::VCMPZ";
   case ARMISD::VTST:          return "ARMISD::VTST";
@@ -3777,6 +3778,9 @@
   case Intrinsic::arm_mve_pred_v2i:
     return DAG.getNode(ARMISD::PREDICATE_CAST, SDLoc(Op), Op.getValueType(),
                        Op.getOperand(1));
+  case Intrinsic::arm_mve_vreinterpretq:
+    return DAG.getNode(ARMISD::VECTOR_REG_CAST, SDLoc(Op), Op.getValueType(),
+                       Op.getOperand(1));
   }
 }
 
Index: llvm/include/llvm/IR/IntrinsicsARM.td
===================================================================
--- llvm/include/llvm/IR/IntrinsicsARM.td
+++ llvm/include/llvm/IR/IntrinsicsARM.td
@@ -795,6 +795,8 @@
   [llvm_anyvector_ty], [llvm_i32_ty], [IntrNoMem]>;
 def int_arm_mve_pred_v2i : Intrinsic<
   [llvm_i32_ty], [llvm_anyvector_ty], [IntrNoMem]>;
+def int_arm_mve_vreinterpretq : Intrinsic<
+  [llvm_anyvector_ty], [llvm_anyvector_ty], [IntrNoMem]>;
 
 multiclass IntrinsicSignSuffix<list<LLVMType> rets, list<LLVMType> params = [],
                                     list<IntrinsicProperty> props = [],
Index: clang/test/CodeGen/arm-mve-intrinsics/reinterpret.c
===================================================================
--- /dev/null
+++ clang/test/CodeGen/arm-mve-intrinsics/reinterpret.c
@@ -0,0 +1,1629 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple thumbv8.1m.main-arm-none-eabi -target-feature +mve.fp -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -S -emit-llvm -o - %s | opt -S -mem2reg -sroa -early-cse | FileCheck %s --check-prefix=BOTH --check-prefix=LE
+// RUN: %clang_cc1 -triple thumbv8.1m.main-arm-none-eabi -target-feature +mve.fp -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -DPOLYMORPHIC -S -emit-llvm -o - %s | opt -S -mem2reg -sroa -early-cse | FileCheck %s --check-prefix=BOTH --check-prefix=LE
+// RUN: %clang_cc1 -triple thumbebv8.1m.main-arm-none-eabi -target-feature +mve.fp -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -S -emit-llvm -o - %s | opt -S -mem2reg -sroa -early-cse | FileCheck %s --check-prefix=BOTH --check-prefix=BE
+// RUN: %clang_cc1 -triple thumbebv8.1m.main-arm-none-eabi -target-feature +mve.fp -mfloat-abi hard -fallow-half-arguments-and-returns -O0 -disable-O0-optnone -DPOLYMORPHIC -S -emit-llvm -o - %s | opt -S -mem2reg -sroa -early-cse | FileCheck %s --check-prefix=BOTH --check-prefix=BE
+
+#include <arm_mve.h>
+
+// LE-LABEL: @test_vreinterpretq_f16_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_f16_s16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x half>
+// BOTH-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_f16_u16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x half>
+// BOTH-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f16_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x half>
+// LE-NEXT:    ret <8 x half> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f16_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x half> @llvm.arm.mve.vreinterpretq.v8f16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x half> [[TMP0]]
+//
+float16x8_t test_vreinterpretq_f16_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f16_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_f32_s32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <4 x float>
+// BOTH-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_f32_u32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <4 x float>
+// BOTH-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_f32_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x float>
+// LE-NEXT:    ret <4 x float> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_f32_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x float> @llvm.arm.mve.vreinterpretq.v4f32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x float> [[TMP0]]
+//
+float32x4_t test_vreinterpretq_f32_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_f32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_f32_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s16_f16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <8 x i16>
+// BOTH-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s16_u16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <8 x i16> [[A:%.*]]
+//
+int16x8_t test_vreinterpretq_s16_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s16_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s16_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+int16x8_t test_vreinterpretq_s16_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s16_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s32_f32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <4 x i32>
+// BOTH-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s32_u32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <4 x i32> [[A:%.*]]
+//
+int32x4_t test_vreinterpretq_s32_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s32_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s32_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+int32x4_t test_vreinterpretq_s32_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s32_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s64_u64(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <2 x i64> [[A:%.*]]
+//
+int64x2_t test_vreinterpretq_s64_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s64_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s64_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+int64x2_t test_vreinterpretq_s64_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s64_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_s8_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_s8_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+int8x16_t test_vreinterpretq_s8_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_s8_u8(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <16 x i8> [[A:%.*]]
+//
+int8x16_t test_vreinterpretq_s8_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_s8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_s8_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u16_f16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <8 x i16>
+// BOTH-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u16_s16(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <8 x i16> [[A:%.*]]
+//
+uint16x8_t test_vreinterpretq_u16_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u16_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
+// LE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u16_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <8 x i16> @llvm.arm.mve.vreinterpretq.v8i16.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <8 x i16> [[TMP0]]
+//
+uint16x8_t test_vreinterpretq_u16_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u16(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u16_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u32_f32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <4 x i32>
+// BOTH-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u32_s32(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <4 x i32> [[A:%.*]]
+//
+uint32x4_t test_vreinterpretq_u32_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_u64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u32_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
+// LE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u32_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vreinterpretq.v4i32.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <4 x i32> [[TMP0]]
+//
+uint32x4_t test_vreinterpretq_u32_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u32(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u32_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u64_s64(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <2 x i64> [[A:%.*]]
+//
+uint64x2_t test_vreinterpretq_u64_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_s8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_s8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u64_u8(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
+// LE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u64_u8(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <2 x i64> @llvm.arm.mve.vreinterpretq.v2i64.v16i8(<16 x i8> [[A:%.*]])
+// BE-NEXT:    ret <2 x i64> [[TMP0]]
+//
+uint64x2_t test_vreinterpretq_u64_u8(uint8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u64(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u64_u8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_f16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_f16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8f16(<8 x half> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_f16(float16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_f16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_f32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_f32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4f32(<4 x float> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_f32(float32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_f32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_s16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_s16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_s16(int16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_s16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_s32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_s32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_s32(int32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_s32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_s64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_s64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_s64(int64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_s64(a);
+#endif /* POLYMORPHIC */
+}
+
+// BOTH-LABEL: @test_vreinterpretq_u8_s8(
+// BOTH-NEXT:  entry:
+// BOTH-NEXT:    ret <16 x i8> [[A:%.*]]
+//
+uint8x16_t test_vreinterpretq_u8_s8(int8x16_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_s8(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_u16(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_u16(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v8i16(<8 x i16> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_u16(uint16x8_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_u16(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_u32(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_u32(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v4i32(<4 x i32> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_u32(uint32x4_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_u32(a);
+#endif /* POLYMORPHIC */
+}
+
+// LE-LABEL: @test_vreinterpretq_u8_u64(
+// LE-NEXT:  entry:
+// LE-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
+// LE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+// BE-LABEL: @test_vreinterpretq_u8_u64(
+// BE-NEXT:  entry:
+// BE-NEXT:    [[TMP0:%.*]] = call <16 x i8> @llvm.arm.mve.vreinterpretq.v16i8.v2i64(<2 x i64> [[A:%.*]])
+// BE-NEXT:    ret <16 x i8> [[TMP0]]
+//
+uint8x16_t test_vreinterpretq_u8_u64(uint64x2_t a)
+{
+#ifdef POLYMORPHIC
+    return vreinterpretq_u8(a);
+#else /* POLYMORPHIC */
+    return vreinterpretq_u8_u64(a);
+#endif /* POLYMORPHIC */
+}
Index: clang/test/CodeGen/arm-mve-intrinsics/admin.c
===================================================================
--- clang/test/CodeGen/arm-mve-intrinsics/admin.c
+++ clang/test/CodeGen/arm-mve-intrinsics/admin.c
@@ -122,1258 +122,6 @@
     return vcreateq_u8(a, b);
 }
 
-// CHECK-LABEL: @test_vreinterpretq_f16_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f16_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x half>
-// CHECK-NEXT:    ret <8 x half> [[TMP0]]
-//
-float16x8_t test_vreinterpretq_f16_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f16_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_f32_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x float>
-// CHECK-NEXT:    ret <4 x float> [[TMP0]]
-//
-float32x4_t test_vreinterpretq_f32_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_f32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_f32_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <8 x i16> [[A:%.*]]
-//
-int16x8_t test_vreinterpretq_s16_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s16_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-int16x8_t test_vreinterpretq_s16_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s16_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <4 x i32> [[A:%.*]]
-//
-int32x4_t test_vreinterpretq_s32_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s32_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-int32x4_t test_vreinterpretq_s32_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s32_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <2 x i64> [[A:%.*]]
-//
-int64x2_t test_vreinterpretq_s64_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s64_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-int64x2_t test_vreinterpretq_s64_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s64_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-int8x16_t test_vreinterpretq_s8_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_s8_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <16 x i8> [[A:%.*]]
-//
-int8x16_t test_vreinterpretq_s8_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_s8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_s8_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <8 x i16> [[A:%.*]]
-//
-uint16x8_t test_vreinterpretq_u16_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u16_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x i16>
-// CHECK-NEXT:    ret <8 x i16> [[TMP0]]
-//
-uint16x8_t test_vreinterpretq_u16_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u16(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u16_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <4 x i32> [[A:%.*]]
-//
-uint32x4_t test_vreinterpretq_u32_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_u64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u32_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <4 x i32>
-// CHECK-NEXT:    ret <4 x i32> [[TMP0]]
-//
-uint32x4_t test_vreinterpretq_u32_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u32(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u32_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <2 x i64> [[A:%.*]]
-//
-uint64x2_t test_vreinterpretq_u64_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u64_u8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <2 x i64>
-// CHECK-NEXT:    ret <2 x i64> [[TMP0]]
-//
-uint64x2_t test_vreinterpretq_u64_u8(uint8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u64(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u64_u8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_f16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_f16(float16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_f16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_f32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_f32(float32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_f32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_s16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_s16(int16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_s16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_s32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_s32(int32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_s32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_s64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_s64(int64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_s64(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_s8(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    ret <16 x i8> [[A:%.*]]
-//
-uint8x16_t test_vreinterpretq_u8_s8(int8x16_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_s8(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_u16(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_u16(uint16x8_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_u16(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_u32(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_u32(uint32x4_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_u32(a);
-#endif /* POLYMORPHIC */
-}
-
-// CHECK-LABEL: @test_vreinterpretq_u8_u64(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <16 x i8>
-// CHECK-NEXT:    ret <16 x i8> [[TMP0]]
-//
-uint8x16_t test_vreinterpretq_u8_u64(uint64x2_t a)
-{
-#ifdef POLYMORPHIC
-    return vreinterpretq_u8(a);
-#else /* POLYMORPHIC */
-    return vreinterpretq_u8_u64(a);
-#endif /* POLYMORPHIC */
-}
-
 // CHECK-LABEL: @test_vuninitializedq_polymorphic_f16(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    ret <8 x half> undef
Index: clang/lib/CodeGen/CGBuiltin.cpp
===================================================================
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -7019,6 +7019,32 @@
   return Builder.CreateVectorSplat(Elements, V);
 }
 
+static llvm::Value *ARMMVEVectorReinterpret(CGBuilderTy &Builder,
+                                            CodeGenFunction *CGF,
+                                            llvm::Value *V,
+                                            llvm::Type *DestType) {
+  // Convert one MVE vector type into another by reinterpreting its in-register
+  // format.
+  //
+  // Little-endian, this is identical to a bitcast (which reinterprets the
+  // memory format). But big-endian, they're not necessarily the same, because
+  // the register and memory formats map to each other differently depending on
+  // the lane size.
+  //
+  // We generate a bitcast whenever we can (if we're little-endian, or if the
+  // lane sizes are the same anyway). Otherwise we fall back to an IR intrinsic
+  // that performs the different kind of reinterpretation.
+  if (CGF->getTarget().isBigEndian() &&
+      V->getType()->getScalarSizeInBits() != DestType->getScalarSizeInBits()) {
+    return Builder.CreateCall(
+        CGF->CGM.getIntrinsic(Intrinsic::arm_mve_vreinterpretq,
+                              {DestType, V->getType()}),
+        V);
+  } else {
+    return Builder.CreateBitCast(V, DestType);
+  }
+}
+
 Value *CodeGenFunction::EmitARMMVEBuiltinExpr(unsigned BuiltinID,
                                               const CallExpr *E,
                                               ReturnValueSlot ReturnValue,
Index: clang/include/clang/Basic/arm_mve_defs.td
===================================================================
--- clang/include/clang/Basic/arm_mve_defs.td
+++ clang/include/clang/Basic/arm_mve_defs.td
@@ -57,6 +57,10 @@
   // an argument.
   let prefix = func # "(Builder, ";
 }
+class CGFHelperFn<string func> : IRBuilderBase {
+  // Like CGHelperFn, but also takes the CodeGenFunction itself.
+  let prefix = func # "(Builder, this, ";
+}
 def add: IRBuilder<"CreateAdd">;
 def mul: IRBuilder<"CreateMul">;
 def not: IRBuilder<"CreateNot">;
@@ -89,6 +93,7 @@
 def xelt_var: IRBuilder<"CreateExtractElement">;
 def trunc: IRBuilder<"CreateTrunc">;
 def bitcast: IRBuilder<"CreateBitCast">;
+def vreinterpret: CGFHelperFn<"ARMMVEVectorReinterpret">;
 def extend: CGHelperFn<"SignOrZeroExtend"> {
   let special_params = [IRBuilderIntParam<2, "bool">];
 }
Index: clang/include/clang/Basic/arm_mve.td
===================================================================
--- clang/include/clang/Basic/arm_mve.td
+++ clang/include/clang/Basic/arm_mve.td
@@ -1063,7 +1063,7 @@
       !if(!eq(!cast<string>(desttype),!cast<string>(srctype)),[],[srctype])))
   in {
     def "vreinterpretq_" # desttype: Intrinsic<
-        VecOf<desttype>, (args Vector:$x), (bitcast $x, VecOf<desttype>)>;
+        VecOf<desttype>, (args Vector:$x), (vreinterpret $x, VecOf<desttype>)>;
   }
 }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to