<div dir="ltr">Hi Tim,<div><br></div><div>I like the general direction - it's one I've argued for before. +1 from me!</div><div><br></div><div>James</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 9 Mar 2016 at 19:00 Tim Northover via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Modified: cfe/trunk/test/CodeGen/arm_neon_intrinsics.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm_neon_intrinsics.c?rev=263048&r1=263047&r2=263048&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm_neon_intrinsics.c?rev=263048&r1=263047&r2=263048&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/arm_neon_intrinsics.c (original)<br>
+++ cfe/trunk/test/CodeGen/arm_neon_intrinsics.c Wed Mar  9 12:54:42 2016<br>
@@ -1,1611 +1,2446 @@<br>
 // RUN: %clang_cc1 -triple thumbv7s-apple-darwin -target-abi apcs-gnu\<br>
-// RUN:  -target-cpu swift -ffreestanding -Os -S -o - %s\<br>
-// RUN:  | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-SWIFT<br>
-// RUN: %clang_cc1 -triple armv8-linux-gnu \<br>
-// RUN:  -target-cpu cortex-a57 -mfloat-abi soft -ffreestanding -Os -S -o - %s\<br>
-// RUN:  | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-A57<br>
+// RUN:  -target-cpu swift -ffreestanding -emit-llvm -S -o - %s\<br>
+// RUN:  opt -S -mem2reg | FileCheck %s<br>
<br>
 // REQUIRES: long_tests<br>
<br>
 #include <arm_neon.h><br>
<br>
-// CHECK-LABEL: test_vaba_s8<br>
-// CHECK: vaba.s8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vaba_s8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> %c) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i8> %a, [[VABD_I_I]]<br>
+// CHECK:   ret <8 x i8> [[ADD_I]]<br>
 int8x8_t test_vaba_s8(int8x8_t a, int8x8_t b, int8x8_t c) {<br>
   return vaba_s8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaba_s16<br>
-// CHECK: vaba.s16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vaba_s16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> [[VABD_I_I]], <4 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i16> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <4 x i16> [[ADD_I]]<br>
 int16x4_t test_vaba_s16(int16x4_t a, int16x4_t b, int16x4_t c) {<br>
   return vaba_s16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaba_s32<br>
-// CHECK: vaba.s32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vaba_s32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> [[VABD_I_I]], <2 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i32> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <2 x i32> [[ADD_I]]<br>
 int32x2_t test_vaba_s32(int32x2_t a, int32x2_t b, int32x2_t c) {<br>
   return vaba_s32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaba_u8<br>
-// CHECK: vaba.u8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vaba_u8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %b, <8 x i8> %c) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i8> %a, [[VABD_I_I]]<br>
+// CHECK:   ret <8 x i8> [[ADD_I]]<br>
 uint8x8_t test_vaba_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c) {<br>
   return vaba_u8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaba_u16<br>
-// CHECK: vaba.u16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vaba_u16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> [[VABD_I_I]], <4 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i16> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <4 x i16> [[ADD_I]]<br>
 uint16x4_t test_vaba_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c) {<br>
   return vaba_u16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaba_u32<br>
-// CHECK: vaba.u32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vaba_u32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> [[VABD_I_I]], <2 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i32> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <2 x i32> [[ADD_I]]<br>
 uint32x2_t test_vaba_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c) {<br>
   return vaba_u32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_s8<br>
-// CHECK: vaba.s8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vabaq_s8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8> %b, <16 x i8> %c) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <16 x i8> %a, [[VABD_I_I]]<br>
+// CHECK:   ret <16 x i8> [[ADD_I]]<br>
 int8x16_t test_vabaq_s8(int8x16_t a, int8x16_t b, int8x16_t c) {<br>
   return vabaq_s8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_s16<br>
-// CHECK: vaba.s16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabaq_s16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %c to <16 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16> [[VABD_I_I]], <8 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 int16x8_t test_vabaq_s16(int16x8_t a, int16x8_t b, int16x8_t c) {<br>
   return vabaq_s16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_s32<br>
-// CHECK: vaba.s32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabaq_s32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %c to <16 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32> [[VABD_I_I]], <4 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 int32x4_t test_vabaq_s32(int32x4_t a, int32x4_t b, int32x4_t c) {<br>
   return vabaq_s32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_u8<br>
-// CHECK: vaba.u8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vabaq_u8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.uabd.v16i8(<16 x i8> %b, <16 x i8> %c) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <16 x i8> %a, [[VABD_I_I]]<br>
+// CHECK:   ret <16 x i8> [[ADD_I]]<br>
 uint8x16_t test_vabaq_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c) {<br>
   return vabaq_u8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_u16<br>
-// CHECK: vaba.u16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabaq_u16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %c to <16 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.uabd.v8i16(<8 x i16> [[VABD_I_I]], <8 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 uint16x8_t test_vabaq_u16(uint16x8_t a, uint16x8_t b, uint16x8_t c) {<br>
   return vabaq_u16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabaq_u32<br>
-// CHECK: vaba.u32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabaq_u32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %c to <16 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.uabd.v4i32(<4 x i32> [[VABD_I_I]], <4 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VABD2_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 uint32x4_t test_vabaq_u32(uint32x4_t a, uint32x4_t b, uint32x4_t c) {<br>
   return vabaq_u32(a, b, c);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vabal_s8<br>
-// CHECK: vabal.s8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabal_s8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %b, <8 x i8> %c) #4<br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <8 x i8> [[VABD_I_I_I]] to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 int16x8_t test_vabal_s8(int16x8_t a, int8x8_t b, int8x8_t c) {<br>
   return vabal_s8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabal_s16<br>
-// CHECK: vabal.s16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabal_s16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> [[VABD_I_I_I]], <4 x i16> [[VABD1_I_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> [[VABD2_I_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 int32x4_t test_vabal_s16(int32x4_t a, int16x4_t b, int16x4_t c) {<br>
   return vabal_s16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabal_s32<br>
-// CHECK: vabal.s32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vabal_s32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> [[VABD_I_I_I]], <2 x i32> [[VABD1_I_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> [[VABD2_I_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 int64x2_t test_vabal_s32(int64x2_t a, int32x2_t b, int32x2_t c) {<br>
   return vabal_s32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabal_u8<br>
-// CHECK: vabal.u8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabal_u8(<8 x i16> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VABD_I_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %b, <8 x i8> %c) #4<br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <8 x i8> [[VABD_I_I_I]] to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 uint16x8_t test_vabal_u8(uint16x8_t a, uint8x8_t b, uint8x8_t c) {<br>
   return vabal_u8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabal_u16<br>
-// CHECK: vabal.u16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabal_u16(<4 x i32> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> [[VABD_I_I_I]], <4 x i16> [[VABD1_I_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> [[VABD2_I_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 uint32x4_t test_vabal_u16(uint32x4_t a, uint16x4_t b, uint16x4_t c) {<br>
   return vabal_u16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabal_u32<br>
-// CHECK: vabal.u32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vabal_u32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VABD_I_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> [[VABD_I_I_I]], <2 x i32> [[VABD1_I_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> [[VABD2_I_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I_I:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, [[VMOVL_I_I_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 uint64x2_t test_vabal_u32(uint64x2_t a, uint32x2_t b, uint32x2_t c) {<br>
   return vabal_u32(a, b, c);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vabd_s8<br>
-// CHECK: vabd.s8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vabd_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %a, <8 x i8> %b) #4<br>
+// CHECK:   ret <8 x i8> [[VABD_I]]<br>
 int8x8_t test_vabd_s8(int8x8_t a, int8x8_t b) {<br>
   return vabd_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_s16<br>
-// CHECK: vabd.s16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vabd_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> [[VABD_I]], <4 x i16> [[VABD1_I]]) #4<br>
+// CHECK:   ret <4 x i16> [[VABD2_I]]<br>
 int16x4_t test_vabd_s16(int16x4_t a, int16x4_t b) {<br>
   return vabd_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_s32<br>
-// CHECK: vabd.s32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vabd_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> [[VABD_I]], <2 x i32> [[VABD1_I]]) #4<br>
+// CHECK:   ret <2 x i32> [[VABD2_I]]<br>
 int32x2_t test_vabd_s32(int32x2_t a, int32x2_t b) {<br>
   return vabd_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_u8<br>
-// CHECK: vabd.u8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vabd_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %a, <8 x i8> %b) #4<br>
+// CHECK:   ret <8 x i8> [[VABD_I]]<br>
 uint8x8_t test_vabd_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vabd_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_u16<br>
-// CHECK: vabd.u16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vabd_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> [[VABD_I]], <4 x i16> [[VABD1_I]]) #4<br>
+// CHECK:   ret <4 x i16> [[VABD2_I]]<br>
 uint16x4_t test_vabd_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vabd_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_u32<br>
-// CHECK: vabd.u32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vabd_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> [[VABD_I]], <2 x i32> [[VABD1_I]]) #4<br>
+// CHECK:   ret <2 x i32> [[VABD2_I]]<br>
 uint32x2_t test_vabd_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vabd_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabd_f32<br>
-// CHECK: vabd.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x float> @test_vabd_f32(<2 x float> %a, <2 x float> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x float> %b to <8 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x float><br>
+// CHECK:   [[VABD2_I:%.*]] = call <2 x float> @llvm.aarch64.neon.fabd.v2f32(<2 x float> [[VABD_I]], <2 x float> [[VABD1_I]]) #4<br>
+// CHECK:   ret <2 x float> [[VABD2_I]]<br>
 float32x2_t test_vabd_f32(float32x2_t a, float32x2_t b) {<br>
   return vabd_f32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_s8<br>
-// CHECK: vabd.s8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vabdq_s8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.sabd.v16i8(<16 x i8> %a, <16 x i8> %b) #4<br>
+// CHECK:   ret <16 x i8> [[VABD_I]]<br>
 int8x16_t test_vabdq_s8(int8x16_t a, int8x16_t b) {<br>
   return vabdq_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_s16<br>
-// CHECK: vabd.s16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabdq_s16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VABD2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.sabd.v8i16(<8 x i16> [[VABD_I]], <8 x i16> [[VABD1_I]]) #4<br>
+// CHECK:   ret <8 x i16> [[VABD2_I]]<br>
 int16x8_t test_vabdq_s16(int16x8_t a, int16x8_t b) {<br>
   return vabdq_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_s32<br>
-// CHECK: vabd.s32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabdq_s32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VABD2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.sabd.v4i32(<4 x i32> [[VABD_I]], <4 x i32> [[VABD1_I]]) #4<br>
+// CHECK:   ret <4 x i32> [[VABD2_I]]<br>
 int32x4_t test_vabdq_s32(int32x4_t a, int32x4_t b) {<br>
   return vabdq_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_u8<br>
-// CHECK: vabd.u8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vabdq_u8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.uabd.v16i8(<16 x i8> %a, <16 x i8> %b) #4<br>
+// CHECK:   ret <16 x i8> [[VABD_I]]<br>
 uint8x16_t test_vabdq_u8(uint8x16_t a, uint8x16_t b) {<br>
   return vabdq_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_u16<br>
-// CHECK: vabd.u16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabdq_u16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VABD2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.uabd.v8i16(<8 x i16> [[VABD_I]], <8 x i16> [[VABD1_I]]) #4<br>
+// CHECK:   ret <8 x i16> [[VABD2_I]]<br>
 uint16x8_t test_vabdq_u16(uint16x8_t a, uint16x8_t b) {<br>
   return vabdq_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_u32<br>
-// CHECK: vabd.u32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabdq_u32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VABD2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.uabd.v4i32(<4 x i32> [[VABD_I]], <4 x i32> [[VABD1_I]]) #4<br>
+// CHECK:   ret <4 x i32> [[VABD2_I]]<br>
 uint32x4_t test_vabdq_u32(uint32x4_t a, uint32x4_t b) {<br>
   return vabdq_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdq_f32<br>
-// CHECK: vabd.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x float> @test_vabdq_f32(<4 x float> %a, <4 x float> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x float> %b to <16 x i8><br>
+// CHECK:   [[VABD_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float><br>
+// CHECK:   [[VABD1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x float><br>
+// CHECK:   [[VABD2_I:%.*]] = call <4 x float> @llvm.aarch64.neon.fabd.v4f32(<4 x float> [[VABD_I]], <4 x float> [[VABD1_I]]) #4<br>
+// CHECK:   ret <4 x float> [[VABD2_I]]<br>
 float32x4_t test_vabdq_f32(float32x4_t a, float32x4_t b) {<br>
   return vabdq_f32(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vabdl_s8<br>
-// CHECK: vabdl.s8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabdl_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sabd.v8i8(<8 x i8> %a, <8 x i8> %b) #4<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <8 x i8> [[VABD_I_I]] to <8 x i16><br>
+// CHECK:   ret <8 x i16> [[VMOVL_I_I]]<br>
 int16x8_t test_vabdl_s8(int8x8_t a, int8x8_t b) {<br>
   return vabdl_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdl_s16<br>
-// CHECK: vabdl.s16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabdl_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sabd.v4i16(<4 x i16> [[VABD_I_I]], <4 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> [[VABD2_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   ret <4 x i32> [[VMOVL_I_I]]<br>
 int32x4_t test_vabdl_s16(int16x4_t a, int16x4_t b) {<br>
   return vabdl_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdl_s32<br>
-// CHECK: vabdl.s32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vabdl_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sabd.v2i32(<2 x i32> [[VABD_I_I]], <2 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> [[VABD2_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   ret <2 x i64> [[VMOVL_I_I]]<br>
 int64x2_t test_vabdl_s32(int32x2_t a, int32x2_t b) {<br>
   return vabdl_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdl_u8<br>
-// CHECK: vabdl.u8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabdl_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VABD_I_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %a, <8 x i8> %b) #4<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <8 x i8> [[VABD_I_I]] to <8 x i16><br>
+// CHECK:   ret <8 x i16> [[VMOVL_I_I]]<br>
 uint16x8_t test_vabdl_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vabdl_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdl_u16<br>
-// CHECK: vabdl.u16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabdl_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uabd.v4i16(<4 x i16> [[VABD_I_I]], <4 x i16> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> [[VABD2_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   ret <4 x i32> [[VMOVL_I_I]]<br>
 uint32x4_t test_vabdl_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vabdl_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabdl_u32<br>
-// CHECK: vabdl.u32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vabdl_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[VABD_I_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABD1_I_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VABD2_I_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uabd.v2i32(<2 x i32> [[VABD_I_I]], <2 x i32> [[VABD1_I_I]]) #4<br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> [[VABD2_I_I]] to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   ret <2 x i64> [[VMOVL_I_I]]<br>
 uint64x2_t test_vabdl_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vabdl_u32(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vabs_s8<br>
-// CHECK: vabs.s8 d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vabs_s8(<8 x i8> %a) #0 {<br>
+// CHECK:   [[VABS_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.abs.v8i8(<8 x i8> %a) #4<br>
+// CHECK:   ret <8 x i8> [[VABS_I]]<br>
 int8x8_t test_vabs_s8(int8x8_t a) {<br>
   return vabs_s8(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabs_s16<br>
-// CHECK: vabs.s16 d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vabs_s16(<4 x i16> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VABS1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.abs.v4i16(<4 x i16> [[VABS_I]]) #4<br>
+// CHECK:   ret <4 x i16> [[VABS1_I]]<br>
 int16x4_t test_vabs_s16(int16x4_t a) {<br>
   return vabs_s16(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabs_s32<br>
-// CHECK: vabs.s32 d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vabs_s32(<2 x i32> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VABS1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.abs.v2i32(<2 x i32> [[VABS_I]]) #4<br>
+// CHECK:   ret <2 x i32> [[VABS1_I]]<br>
 int32x2_t test_vabs_s32(int32x2_t a) {<br>
   return vabs_s32(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabs_f32<br>
-// CHECK: vabs.f32 d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x float> @test_vabs_f32(<2 x float> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float><br>
+// CHECK:   [[VABS1_I:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VABS_I]]) #4<br>
+// CHECK:   ret <2 x float> [[VABS1_I]]<br>
 float32x2_t test_vabs_f32(float32x2_t a) {<br>
   return vabs_f32(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabsq_s8<br>
-// CHECK: vabs.s8 q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vabsq_s8(<16 x i8> %a) #0 {<br>
+// CHECK:   [[VABS_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.abs.v16i8(<16 x i8> %a) #4<br>
+// CHECK:   ret <16 x i8> [[VABS_I]]<br>
 int8x16_t test_vabsq_s8(int8x16_t a) {<br>
   return vabsq_s8(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabsq_s16<br>
-// CHECK: vabs.s16 q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vabsq_s16(<8 x i16> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VABS1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.abs.v8i16(<8 x i16> [[VABS_I]]) #4<br>
+// CHECK:   ret <8 x i16> [[VABS1_I]]<br>
 int16x8_t test_vabsq_s16(int16x8_t a) {<br>
   return vabsq_s16(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabsq_s32<br>
-// CHECK: vabs.s32 q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vabsq_s32(<4 x i32> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VABS1_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.abs.v4i32(<4 x i32> [[VABS_I]]) #4<br>
+// CHECK:   ret <4 x i32> [[VABS1_I]]<br>
 int32x4_t test_vabsq_s32(int32x4_t a) {<br>
   return vabsq_s32(a);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vabsq_f32<br>
-// CHECK: vabs.f32 q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x float> @test_vabsq_f32(<4 x float> %a) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8><br>
+// CHECK:   [[VABS_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float><br>
+// CHECK:   [[VABS1_I:%.*]] = call <4 x float> @llvm.fabs.v4f32(<4 x float> [[VABS_I]]) #4<br>
+// CHECK:   ret <4 x float> [[VABS1_I]]<br>
 float32x4_t test_vabsq_f32(float32x4_t a) {<br>
   return vabsq_f32(a);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vadd_s8<br>
-// CHECK: vadd.i8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vadd_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i8> %a, %b<br>
+// CHECK:   ret <8 x i8> [[ADD_I]]<br>
 int8x8_t test_vadd_s8(int8x8_t a, int8x8_t b) {<br>
   return vadd_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_s16<br>
-// CHECK: vadd.i16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vadd_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i16> %a, %b<br>
+// CHECK:   ret <4 x i16> [[ADD_I]]<br>
 int16x4_t test_vadd_s16(int16x4_t a, int16x4_t b) {<br>
   return vadd_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_s32<br>
-// CHECK: vadd.i32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vadd_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i32> %a, %b<br>
+// CHECK:   ret <2 x i32> [[ADD_I]]<br>
 int32x2_t test_vadd_s32(int32x2_t a, int32x2_t b) {<br>
   return vadd_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_s64<br>
-// CHECK: vadd.i64 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vadd_s64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <1 x i64> %a, %b<br>
+// CHECK:   ret <1 x i64> [[ADD_I]]<br>
 int64x1_t test_vadd_s64(int64x1_t a, int64x1_t b) {<br>
   return vadd_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_f32<br>
-// CHECK: vadd.f32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x float> @test_vadd_f32(<2 x float> %a, <2 x float> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = fadd <2 x float> %a, %b<br>
+// CHECK:   ret <2 x float> [[ADD_I]]<br>
 float32x2_t test_vadd_f32(float32x2_t a, float32x2_t b) {<br>
   return vadd_f32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_u8<br>
-// CHECK: vadd.i8 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vadd_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i8> %a, %b<br>
+// CHECK:   ret <8 x i8> [[ADD_I]]<br>
 uint8x8_t test_vadd_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vadd_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_u16<br>
-// CHECK: vadd.i16 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vadd_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i16> %a, %b<br>
+// CHECK:   ret <4 x i16> [[ADD_I]]<br>
 uint16x4_t test_vadd_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vadd_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_u32<br>
-// CHECK: vadd.i32 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vadd_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i32> %a, %b<br>
+// CHECK:   ret <2 x i32> [[ADD_I]]<br>
 uint32x2_t test_vadd_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vadd_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vadd_u64<br>
-// CHECK: vadd.i64 d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vadd_u64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <1 x i64> %a, %b<br>
+// CHECK:   ret <1 x i64> [[ADD_I]]<br>
 uint64x1_t test_vadd_u64(uint64x1_t a, uint64x1_t b) {<br>
   return vadd_u64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_s8<br>
-// CHECK: vadd.i8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vaddq_s8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <16 x i8> %a, %b<br>
+// CHECK:   ret <16 x i8> [[ADD_I]]<br>
 int8x16_t test_vaddq_s8(int8x16_t a, int8x16_t b) {<br>
   return vaddq_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_s16<br>
-// CHECK: vadd.i16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddq_s16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, %b<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 int16x8_t test_vaddq_s16(int16x8_t a, int16x8_t b) {<br>
   return vaddq_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_s32<br>
-// CHECK: vadd.i32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddq_s32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, %b<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 int32x4_t test_vaddq_s32(int32x4_t a, int32x4_t b) {<br>
   return vaddq_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_s64<br>
-// CHECK: vadd.i64 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddq_s64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, %b<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 int64x2_t test_vaddq_s64(int64x2_t a, int64x2_t b) {<br>
   return vaddq_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_f32<br>
-// CHECK: vadd.f32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x float> @test_vaddq_f32(<4 x float> %a, <4 x float> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = fadd <4 x float> %a, %b<br>
+// CHECK:   ret <4 x float> [[ADD_I]]<br>
 float32x4_t test_vaddq_f32(float32x4_t a, float32x4_t b) {<br>
   return vaddq_f32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_u8<br>
-// CHECK: vadd.i8 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vaddq_u8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <16 x i8> %a, %b<br>
+// CHECK:   ret <16 x i8> [[ADD_I]]<br>
 uint8x16_t test_vaddq_u8(uint8x16_t a, uint8x16_t b) {<br>
   return vaddq_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_u16<br>
-// CHECK: vadd.i16 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddq_u16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, %b<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 uint16x8_t test_vaddq_u16(uint16x8_t a, uint16x8_t b) {<br>
   return vaddq_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_u32<br>
-// CHECK: vadd.i32 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddq_u32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, %b<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 uint32x4_t test_vaddq_u32(uint32x4_t a, uint32x4_t b) {<br>
   return vaddq_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddq_u64<br>
-// CHECK: vadd.i64 q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddq_u64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, %b<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 uint64x2_t test_vaddq_u64(uint64x2_t a, uint64x2_t b) {<br>
   return vaddq_u64(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vaddhn_s16<br>
-// CHECK: vaddhn.i16 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vaddhn_s16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <8 x i16> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <8 x i16> [[VADDHN_I]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <8 x i16> [[VADDHN1_I]] to <8 x i8><br>
+// CHECK:   ret <8 x i8> [[VADDHN2_I]]<br>
 int8x8_t test_vaddhn_s16(int16x8_t a, int16x8_t b) {<br>
   return vaddhn_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddhn_s32<br>
-// CHECK: vaddhn.i32 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vaddhn_s32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <4 x i32> [[VADDHN_I]], <i32 16, i32 16, i32 16, i32 16><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <4 x i32> [[VADDHN1_I]] to <4 x i16><br>
+// CHECK:   ret <4 x i16> [[VADDHN2_I]]<br>
 int16x4_t test_vaddhn_s32(int32x4_t a, int32x4_t b) {<br>
   return vaddhn_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddhn_s64<br>
-// CHECK: vaddhn.i64 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vaddhn_s64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i64> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <2 x i64> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <2 x i64> [[VADDHN_I]], <i64 32, i64 32><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <2 x i64> [[VADDHN1_I]] to <2 x i32><br>
+// CHECK:   ret <2 x i32> [[VADDHN2_I]]<br>
 int32x2_t test_vaddhn_s64(int64x2_t a, int64x2_t b) {<br>
   return vaddhn_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddhn_u16<br>
-// CHECK: vaddhn.i16 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vaddhn_u16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <8 x i16> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <8 x i16> [[VADDHN_I]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <8 x i16> [[VADDHN1_I]] to <8 x i8><br>
+// CHECK:   ret <8 x i8> [[VADDHN2_I]]<br>
 uint8x8_t test_vaddhn_u16(uint16x8_t a, uint16x8_t b) {<br>
   return vaddhn_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddhn_u32<br>
-// CHECK: vaddhn.i32 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vaddhn_u32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <4 x i32> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <4 x i32> [[VADDHN_I]], <i32 16, i32 16, i32 16, i32 16><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <4 x i32> [[VADDHN1_I]] to <4 x i16><br>
+// CHECK:   ret <4 x i16> [[VADDHN2_I]]<br>
 uint16x4_t test_vaddhn_u32(uint32x4_t a, uint32x4_t b) {<br>
   return vaddhn_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddhn_u64<br>
-// CHECK: vaddhn.i64 d{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vaddhn_u64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i64> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[VADDHN_I:%.*]] = add <2 x i64> [[TMP2]], [[TMP3]]<br>
+// CHECK:   [[VADDHN1_I:%.*]] = lshr <2 x i64> [[VADDHN_I]], <i64 32, i64 32><br>
+// CHECK:   [[VADDHN2_I:%.*]] = trunc <2 x i64> [[VADDHN1_I]] to <2 x i32><br>
+// CHECK:   ret <2 x i32> [[VADDHN2_I]]<br>
 uint32x2_t test_vaddhn_u64(uint64x2_t a, uint64x2_t b) {<br>
   return vaddhn_u64(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vaddl_s8<br>
-// CHECK: vaddl.s8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddl_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <8 x i8> %a to <8 x i16><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = sext <8 x i8> %b to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 int16x8_t test_vaddl_s8(int8x8_t a, int8x8_t b) {<br>
   return vaddl_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddl_s16<br>
-// CHECK: vaddl.s16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddl_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <4 x i16> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = sext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 int32x4_t test_vaddl_s16(int16x4_t a, int16x4_t b) {<br>
   return vaddl_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddl_s32<br>
-// CHECK: vaddl.s32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddl_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <2 x i32> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = sext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 int64x2_t test_vaddl_s32(int32x2_t a, int32x2_t b) {<br>
   return vaddl_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddl_u8<br>
-// CHECK: vaddl.u8 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddl_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <8 x i8> %a to <8 x i16><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = zext <8 x i8> %b to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 uint16x8_t test_vaddl_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vaddl_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddl_u16<br>
-// CHECK: vaddl.u16 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddl_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <4 x i16> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 uint32x4_t test_vaddl_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vaddl_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddl_u32<br>
-// CHECK: vaddl.u32 q{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddl_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I4_I:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> [[VMOVL_I_I]], [[VMOVL_I4_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 uint64x2_t test_vaddl_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vaddl_u32(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vaddw_s8<br>
-// CHECK: vaddw.s8 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddw_s8(<8 x i16> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <8 x i8> %b to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 int16x8_t test_vaddw_s8(int16x8_t a, int8x8_t b) {<br>
   return vaddw_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddw_s16<br>
-// CHECK: vaddw.s16 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddw_s16(<4 x i32> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <4 x i16> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 int32x4_t test_vaddw_s16(int32x4_t a, int16x4_t b) {<br>
   return vaddw_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddw_s32<br>
-// CHECK: vaddw.s32 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddw_s32(<2 x i64> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = sext <2 x i32> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 int64x2_t test_vaddw_s32(int64x2_t a, int32x2_t b) {<br>
   return vaddw_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddw_u8<br>
-// CHECK: vaddw.u8 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vaddw_u8(<8 x i16> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <8 x i8> %b to <8 x i16><br>
+// CHECK:   [[ADD_I:%.*]] = add <8 x i16> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <8 x i16> [[ADD_I]]<br>
 uint16x8_t test_vaddw_u8(uint16x8_t a, uint8x8_t b) {<br>
   return vaddw_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddw_u16<br>
-// CHECK: vaddw.u16 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vaddw_u16(<4 x i32> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <4 x i16> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[ADD_I:%.*]] = add <4 x i32> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <4 x i32> [[ADD_I]]<br>
 uint32x4_t test_vaddw_u16(uint32x4_t a, uint16x4_t b) {<br>
   return vaddw_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vaddw_u32<br>
-// CHECK: vaddw.u32 q{{[0-9]+}}, q{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vaddw_u32(<2 x i64> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VMOVL_I_I:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[ADD_I:%.*]] = add <2 x i64> %a, [[VMOVL_I_I]]<br>
+// CHECK:   ret <2 x i64> [[ADD_I]]<br>
 uint64x2_t test_vaddw_u32(uint64x2_t a, uint32x2_t b) {<br>
   return vaddw_u32(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vand_s8<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vand_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i8> %a, %b<br>
+// CHECK:   ret <8 x i8> [[AND_I]]<br>
 int8x8_t test_vand_s8(int8x8_t a, int8x8_t b) {<br>
   return vand_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_s16<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vand_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i16> %a, %b<br>
+// CHECK:   ret <4 x i16> [[AND_I]]<br>
 int16x4_t test_vand_s16(int16x4_t a, int16x4_t b) {<br>
   return vand_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_s32<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vand_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i32> %a, %b<br>
+// CHECK:   ret <2 x i32> [[AND_I]]<br>
 int32x2_t test_vand_s32(int32x2_t a, int32x2_t b) {<br>
   return vand_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_s64<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vand_s64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <1 x i64> %a, %b<br>
+// CHECK:   ret <1 x i64> [[AND_I]]<br>
 int64x1_t test_vand_s64(int64x1_t a, int64x1_t b) {<br>
   return vand_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_u8<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vand_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i8> %a, %b<br>
+// CHECK:   ret <8 x i8> [[AND_I]]<br>
 uint8x8_t test_vand_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vand_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_u16<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vand_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i16> %a, %b<br>
+// CHECK:   ret <4 x i16> [[AND_I]]<br>
 uint16x4_t test_vand_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vand_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_u32<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vand_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i32> %a, %b<br>
+// CHECK:   ret <2 x i32> [[AND_I]]<br>
 uint32x2_t test_vand_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vand_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vand_u64<br>
-// CHECK: vand d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vand_u64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <1 x i64> %a, %b<br>
+// CHECK:   ret <1 x i64> [[AND_I]]<br>
 uint64x1_t test_vand_u64(uint64x1_t a, uint64x1_t b) {<br>
   return vand_u64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_s8<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vandq_s8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <16 x i8> %a, %b<br>
+// CHECK:   ret <16 x i8> [[AND_I]]<br>
 int8x16_t test_vandq_s8(int8x16_t a, int8x16_t b) {<br>
   return vandq_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_s16<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vandq_s16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i16> %a, %b<br>
+// CHECK:   ret <8 x i16> [[AND_I]]<br>
 int16x8_t test_vandq_s16(int16x8_t a, int16x8_t b) {<br>
   return vandq_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_s32<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vandq_s32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i32> %a, %b<br>
+// CHECK:   ret <4 x i32> [[AND_I]]<br>
 int32x4_t test_vandq_s32(int32x4_t a, int32x4_t b) {<br>
   return vandq_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_s64<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vandq_s64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i64> %a, %b<br>
+// CHECK:   ret <2 x i64> [[AND_I]]<br>
 int64x2_t test_vandq_s64(int64x2_t a, int64x2_t b) {<br>
   return vandq_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_u8<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vandq_u8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <16 x i8> %a, %b<br>
+// CHECK:   ret <16 x i8> [[AND_I]]<br>
 uint8x16_t test_vandq_u8(uint8x16_t a, uint8x16_t b) {<br>
   return vandq_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_u16<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vandq_u16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i16> %a, %b<br>
+// CHECK:   ret <8 x i16> [[AND_I]]<br>
 uint16x8_t test_vandq_u16(uint16x8_t a, uint16x8_t b) {<br>
   return vandq_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_u32<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vandq_u32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i32> %a, %b<br>
+// CHECK:   ret <4 x i32> [[AND_I]]<br>
 uint32x4_t test_vandq_u32(uint32x4_t a, uint32x4_t b) {<br>
   return vandq_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vandq_u64<br>
-// CHECK: vand q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vandq_u64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i64> %a, %b<br>
+// CHECK:   ret <2 x i64> [[AND_I]]<br>
 uint64x2_t test_vandq_u64(uint64x2_t a, uint64x2_t b) {<br>
   return vandq_u64(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vbic_s8<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vbic_s8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <8 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i8> %a, [[NEG_I]]<br>
+// CHECK:   ret <8 x i8> [[AND_I]]<br>
 int8x8_t test_vbic_s8(int8x8_t a, int8x8_t b) {<br>
   return vbic_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_s16<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vbic_s16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <4 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i16> %a, [[NEG_I]]<br>
+// CHECK:   ret <4 x i16> [[AND_I]]<br>
 int16x4_t test_vbic_s16(int16x4_t a, int16x4_t b) {<br>
   return vbic_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_s32<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vbic_s32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <2 x i32> %b, <i32 -1, i32 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i32> %a, [[NEG_I]]<br>
+// CHECK:   ret <2 x i32> [[AND_I]]<br>
 int32x2_t test_vbic_s32(int32x2_t a, int32x2_t b) {<br>
   return vbic_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_s64<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vbic_s64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <1 x i64> %b, <i64 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <1 x i64> %a, [[NEG_I]]<br>
+// CHECK:   ret <1 x i64> [[AND_I]]<br>
 int64x1_t test_vbic_s64(int64x1_t a, int64x1_t b) {<br>
   return vbic_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_u8<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vbic_u8(<8 x i8> %a, <8 x i8> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <8 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i8> %a, [[NEG_I]]<br>
+// CHECK:   ret <8 x i8> [[AND_I]]<br>
 uint8x8_t test_vbic_u8(uint8x8_t a, uint8x8_t b) {<br>
   return vbic_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_u16<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vbic_u16(<4 x i16> %a, <4 x i16> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <4 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i16> %a, [[NEG_I]]<br>
+// CHECK:   ret <4 x i16> [[AND_I]]<br>
 uint16x4_t test_vbic_u16(uint16x4_t a, uint16x4_t b) {<br>
   return vbic_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_u32<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vbic_u32(<2 x i32> %a, <2 x i32> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <2 x i32> %b, <i32 -1, i32 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i32> %a, [[NEG_I]]<br>
+// CHECK:   ret <2 x i32> [[AND_I]]<br>
 uint32x2_t test_vbic_u32(uint32x2_t a, uint32x2_t b) {<br>
   return vbic_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbic_u64<br>
-// CHECK: vbic d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vbic_u64(<1 x i64> %a, <1 x i64> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <1 x i64> %b, <i64 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <1 x i64> %a, [[NEG_I]]<br>
+// CHECK:   ret <1 x i64> [[AND_I]]<br>
 uint64x1_t test_vbic_u64(uint64x1_t a, uint64x1_t b) {<br>
   return vbic_u64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_s8<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vbicq_s8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <16 x i8> %a, [[NEG_I]]<br>
+// CHECK:   ret <16 x i8> [[AND_I]]<br>
 int8x16_t test_vbicq_s8(int8x16_t a, int8x16_t b) {<br>
   return vbicq_s8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_s16<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vbicq_s16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i16> %a, [[NEG_I]]<br>
+// CHECK:   ret <8 x i16> [[AND_I]]<br>
 int16x8_t test_vbicq_s16(int16x8_t a, int16x8_t b) {<br>
   return vbicq_s16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_s32<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vbicq_s32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i32> %a, [[NEG_I]]<br>
+// CHECK:   ret <4 x i32> [[AND_I]]<br>
 int32x4_t test_vbicq_s32(int32x4_t a, int32x4_t b) {<br>
   return vbicq_s32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_s64<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vbicq_s64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <2 x i64> %b, <i64 -1, i64 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i64> %a, [[NEG_I]]<br>
+// CHECK:   ret <2 x i64> [[AND_I]]<br>
 int64x2_t test_vbicq_s64(int64x2_t a, int64x2_t b) {<br>
   return vbicq_s64(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_u8<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vbicq_u8(<16 x i8> %a, <16 x i8> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <16 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <16 x i8> %a, [[NEG_I]]<br>
+// CHECK:   ret <16 x i8> [[AND_I]]<br>
 uint8x16_t test_vbicq_u8(uint8x16_t a, uint8x16_t b) {<br>
   return vbicq_u8(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_u16<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vbicq_u16(<8 x i16> %a, <8 x i16> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <8 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <8 x i16> %a, [[NEG_I]]<br>
+// CHECK:   ret <8 x i16> [[AND_I]]<br>
 uint16x8_t test_vbicq_u16(uint16x8_t a, uint16x8_t b) {<br>
   return vbicq_u16(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_u32<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vbicq_u32(<4 x i32> %a, <4 x i32> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <4 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <4 x i32> %a, [[NEG_I]]<br>
+// CHECK:   ret <4 x i32> [[AND_I]]<br>
 uint32x4_t test_vbicq_u32(uint32x4_t a, uint32x4_t b) {<br>
   return vbicq_u32(a, b);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbicq_u64<br>
-// CHECK: vbic q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vbicq_u64(<2 x i64> %a, <2 x i64> %b) #0 {<br>
+// CHECK:   [[NEG_I:%.*]] = xor <2 x i64> %b, <i64 -1, i64 -1><br>
+// CHECK:   [[AND_I:%.*]] = and <2 x i64> %a, [[NEG_I]]<br>
+// CHECK:   ret <2 x i64> [[AND_I]]<br>
 uint64x2_t test_vbicq_u64(uint64x2_t a, uint64x2_t b) {<br>
   return vbicq_u64(a, b);<br>
 }<br>
<br>
<br>
-// CHECK-LABEL: test_vbsl_s8<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vbsl_s8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VBSL_I:%.*]] = and <8 x i8> %a, %b<br>
+// CHECK:   [[TMP0:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[VBSL1_I:%.*]] = and <8 x i8> [[TMP0]], %c<br>
+// CHECK:   [[VBSL2_I:%.*]] = or <8 x i8> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   ret <8 x i8> [[VBSL2_I]]<br>
 int8x8_t test_vbsl_s8(uint8x8_t a, int8x8_t b, int8x8_t c) {<br>
   return vbsl_s8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_s16<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vbsl_s16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <4 x i16> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <4 x i16> [[VBSL_I]], <i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <4 x i16> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <4 x i16> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <4 x i16> [[VBSL5_I]]<br>
 int16x4_t test_vbsl_s16(uint16x4_t a, int16x4_t b, int16x4_t c) {<br>
   return vbsl_s16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_s32<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vbsl_s32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <2 x i32> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <2 x i32> [[VBSL_I]], <i32 -1, i32 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <2 x i32> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <2 x i32> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <2 x i32> [[VBSL5_I]]<br>
 int32x2_t test_vbsl_s32(uint32x2_t a, int32x2_t b, int32x2_t c) {<br>
   return vbsl_s32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_s64<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vbsl_s64(<1 x i64> %a, <1 x i64> %b, <1 x i64> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <1 x i64> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <1 x i64> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <1 x i64><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <1 x i64> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <1 x i64> [[VBSL_I]], <i64 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <1 x i64> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <1 x i64> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <1 x i64> [[VBSL5_I]]<br>
 int64x1_t test_vbsl_s64(uint64x1_t a, int64x1_t b, int64x1_t c) {<br>
   return vbsl_s64(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_u8<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vbsl_u8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VBSL_I:%.*]] = and <8 x i8> %a, %b<br>
+// CHECK:   [[TMP0:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[VBSL1_I:%.*]] = and <8 x i8> [[TMP0]], %c<br>
+// CHECK:   [[VBSL2_I:%.*]] = or <8 x i8> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   ret <8 x i8> [[VBSL2_I]]<br>
 uint8x8_t test_vbsl_u8(uint8x8_t a, uint8x8_t b, uint8x8_t c) {<br>
   return vbsl_u8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_u16<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vbsl_u16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <4 x i16> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <4 x i16> [[VBSL_I]], <i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <4 x i16> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <4 x i16> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <4 x i16> [[VBSL5_I]]<br>
 uint16x4_t test_vbsl_u16(uint16x4_t a, uint16x4_t b, uint16x4_t c) {<br>
   return vbsl_u16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_u32<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i32> @test_vbsl_u32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i32> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i32> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <2 x i32> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <2 x i32> [[VBSL_I]], <i32 -1, i32 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <2 x i32> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <2 x i32> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <2 x i32> [[VBSL5_I]]<br>
 uint32x2_t test_vbsl_u32(uint32x2_t a, uint32x2_t b, uint32x2_t c) {<br>
   return vbsl_u32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_u64<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <1 x i64> @test_vbsl_u64(<1 x i64> %a, <1 x i64> %b, <1 x i64> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <1 x i64> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <1 x i64> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <1 x i64><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <1 x i64> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <1 x i64> [[VBSL_I]], <i64 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <1 x i64> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <1 x i64> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <1 x i64> [[VBSL5_I]]<br>
 uint64x1_t test_vbsl_u64(uint64x1_t a, uint64x1_t b, uint64x1_t c) {<br>
   return vbsl_u64(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_f32<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x float> @test_vbsl_f32(<2 x i32> %a, <2 x float> %b, <2 x float> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i32> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x float> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x float> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <2 x i32><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <2 x i32> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <2 x i32> [[VBSL_I]], <i32 -1, i32 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <2 x i32> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <2 x i32> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   [[TMP4:%.*]] = bitcast <2 x i32> [[VBSL5_I]] to <2 x float><br>
+// CHECK:   ret <2 x float> [[TMP4]]<br>
 float32x2_t test_vbsl_f32(uint32x2_t a, float32x2_t b, float32x2_t c) {<br>
   return vbsl_f32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_p8<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i8> @test_vbsl_p8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 {<br>
+// CHECK:   [[VBSL_I:%.*]] = and <8 x i8> %a, %b<br>
+// CHECK:   [[TMP0:%.*]] = xor <8 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[VBSL1_I:%.*]] = and <8 x i8> [[TMP0]], %c<br>
+// CHECK:   [[VBSL2_I:%.*]] = or <8 x i8> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   ret <8 x i8> [[VBSL2_I]]<br>
 poly8x8_t test_vbsl_p8(uint8x8_t a, poly8x8_t b, poly8x8_t c) {<br>
   return vbsl_p8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbsl_p16<br>
-// CHECK: vbsl d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i16> @test_vbsl_p16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i16> %a to <8 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i16> %b to <8 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i16> %c to <8 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x i16><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <4 x i16> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <4 x i16> [[VBSL_I]], <i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <4 x i16> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <4 x i16> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <4 x i16> [[VBSL5_I]]<br>
 poly16x4_t test_vbsl_p16(uint16x4_t a, poly16x4_t b, poly16x4_t c) {<br>
   return vbsl_p16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbslq_s8<br>
-// CHECK: vbsl q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <16 x i8> @test_vbslq_s8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #0 {<br>
+// CHECK:   [[VBSL_I:%.*]] = and <16 x i8> %a, %b<br>
+// CHECK:   [[TMP0:%.*]] = xor <16 x i8> %a, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1><br>
+// CHECK:   [[VBSL1_I:%.*]] = and <16 x i8> [[TMP0]], %c<br>
+// CHECK:   [[VBSL2_I:%.*]] = or <16 x i8> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   ret <16 x i8> [[VBSL2_I]]<br>
 int8x16_t test_vbslq_s8(uint8x16_t a, int8x16_t b, int8x16_t c) {<br>
   return vbslq_s8(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbslq_s16<br>
-// CHECK: vbsl q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <8 x i16> @test_vbslq_s16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <8 x i16> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <8 x i16> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <8 x i16> %c to <16 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x i16><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <8 x i16> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <8 x i16> [[VBSL_I]], <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <8 x i16> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <8 x i16> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <8 x i16> [[VBSL5_I]]<br>
 int16x8_t test_vbslq_s16(uint16x8_t a, int16x8_t b, int16x8_t c) {<br>
   return vbslq_s16(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbslq_s32<br>
-// CHECK: vbsl q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <4 x i32> @test_vbslq_s32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <4 x i32> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <4 x i32> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <4 x i32> %c to <16 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <16 x i8> [[TMP2]] to <4 x i32><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <4 x i32> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <4 x i32> [[VBSL_I]], <i32 -1, i32 -1, i32 -1, i32 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <4 x i32> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <4 x i32> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <4 x i32> [[VBSL5_I]]<br>
 int32x4_t test_vbslq_s32(uint32x4_t a, int32x4_t b, int32x4_t c) {<br>
   return vbslq_s32(a, b, c);<br>
 }<br>
<br>
-// CHECK-LABEL: test_vbslq_s64<br>
-// CHECK: vbsl q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}<br>
+// CHECK-LABEL: define <2 x i64> @test_vbslq_s64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c) #0 {<br>
+// CHECK:   [[TMP0:%.*]] = bitcast <2 x i64> %a to <16 x i8><br>
+// CHECK:   [[TMP1:%.*]] = bitcast <2 x i64> %b to <16 x i8><br>
+// CHECK:   [[TMP2:%.*]] = bitcast <2 x i64> %c to <16 x i8><br>
+// CHECK:   [[VBSL_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64><br>
+// CHECK:   [[VBSL1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64><br>
+// CHECK:   [[VBSL2_I:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64><br>
+// CHECK:   [[VBSL3_I:%.*]] = and <2 x i64> [[VBSL_I]], [[VBSL1_I]]<br>
+// CHECK:   [[TMP3:%.*]] = xor <2 x i64> [[VBSL_I]], <i64 -1, i64 -1><br>
+// CHECK:   [[VBSL4_I:%.*]] = and <2 x i64> [[TMP3]], [[VBSL2_I]]<br>
+// CHECK:   [[VBSL5_I:%.*]] = or <2 x i64> [[VBSL3_I]], [[VBSL4_I]]<br>
+// CHECK:   ret <2 x i64> [[VBSL5_I]]<br>
 int64x2_t test_vbslq_s64(uint64x2_t a, int64x2_t b, int64x2_t c) {<br>
   return vbslq_s64(a, b, c);<br>
 }<br>
<br>
-/</blockquote></div>