Changeset View
Changeset View
Standalone View
Standalone View
clang/test/CodeGen/aarch64-neon-tbl.c
Context not available. | |||||
#include <arm_neon.h> | #include <arm_neon.h> | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl1_s8(<8 x i8> %a, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl1_s8(<8 x i8> noundef %a, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL11_I]] | // CHECK: ret <8 x i8> [[VTBL11_I]] | ||||
Context not available. | |||||
return vtbl1_s8(a, b); | return vtbl1_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl1_s8(<16 x i8> %a, <8 x i8> %b) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl1_s8(<16 x i8> noundef %a, <8 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL1_I]] | // CHECK: ret <8 x i8> [[VTBL1_I]] | ||||
int8x8_t test_vqtbl1_s8(int8x16_t a, uint8x8_t b) { | int8x8_t test_vqtbl1_s8(int8x16_t a, uint8x8_t b) { | ||||
return vqtbl1_s8(a, b); | return vqtbl1_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl2_s8([2 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl2_s8([2 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x2_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x2_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x8x2_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.int8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x2_t, %struct.int8x8x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x2_t, %struct.int8x8x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl2_s8(a, b); | return vtbl2_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl2_s8([2 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl2_s8([2 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2_s8(a, b); | return vqtbl2_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl3_s8([3 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl3_s8([3 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x3_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x3_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x8x3_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.int8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x3_t, %struct.int8x8x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x3_t, %struct.int8x8x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl3_s8(a, b); | return vtbl3_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl3_s8([3 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl3_s8([3 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3_s8(a, b); | return vqtbl3_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl4_s8([4 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl4_s8([4 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x4_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x8x4_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x8x4_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.int8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x4_t, %struct.int8x8x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x4_t, %struct.int8x8x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl4_s8(a, b); | return vtbl4_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl4_s8([4 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl4_s8([4 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4_s8(a, b); | return vqtbl4_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl1q_s8(<16 x i8> %a, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl1q_s8(<16 x i8> noundef %a, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | ||||
// CHECK: ret <16 x i8> [[VTBL1_I]] | // CHECK: ret <16 x i8> [[VTBL1_I]] | ||||
int8x16_t test_vqtbl1q_s8(int8x16_t a, int8x16_t b) { | int8x16_t test_vqtbl1q_s8(int8x16_t a, int8x16_t b) { | ||||
return vqtbl1q_s8(a, b); | return vqtbl1q_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl2q_s8([2 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl2q_s8([2 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2q_s8(a, b); | return vqtbl2q_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl3q_s8([3 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl3q_s8([3 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3q_s8(a, b); | return vqtbl3q_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl4q_s8([4 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl4q_s8([4 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4q_s8(a, b); | return vqtbl4q_s8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx1_s8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx1_s8(<8 x i8> noundef %a, <8 x i8> noundef %b, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | ||||
// CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | // CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | ||||
Context not available. | |||||
return vtbx1_s8(a, b, c); | return vtbx1_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx2_s8(<8 x i8> %a, [2 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx2_s8(<8 x i8> noundef %a, [2 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x2_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x2_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x8x2_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.int8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x2_t, %struct.int8x8x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x2_t, %struct.int8x8x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx2_s8(a, b, c); | return vtbx2_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx3_s8(<8 x i8> %a, [3 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx3_s8(<8 x i8> noundef %a, [3 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x3_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x3_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x8x3_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.int8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x3_t, %struct.int8x8x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x3_t, %struct.int8x8x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx3_s8(a, b, c); | return vtbx3_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx4_s8(<8 x i8> %a, [4 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx4_s8(<8 x i8> noundef %a, [4 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x4_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x8x4_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x8x4_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.int8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x4_t, %struct.int8x8x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x8x4_t, %struct.int8x8x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx4_s8(a, b, c); | return vtbx4_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx1_s8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx1_s8(<8 x i8> noundef %a, <16 x i8> noundef %b, <8 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | ||||
// CHECK: ret <8 x i8> [[VTBX1_I]] | // CHECK: ret <8 x i8> [[VTBX1_I]] | ||||
int8x8_t test_vqtbx1_s8(int8x8_t a, int8x16_t b, uint8x8_t c) { | int8x8_t test_vqtbx1_s8(int8x8_t a, int8x16_t b, uint8x8_t c) { | ||||
return vqtbx1_s8(a, b, c); | return vqtbx1_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx2_s8(<8 x i8> %a, [2 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx2_s8(<8 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2_s8(a, b, c); | return vqtbx2_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx3_s8(<8 x i8> %a, [3 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx3_s8(<8 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3_s8(a, b, c); | return vqtbx3_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx4_s8(<8 x i8> %a, [4 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx4_s8(<8 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx4_s8(a, b, c); | return vqtbx4_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx1q_s8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx1q_s8(<16 x i8> noundef %a, <16 x i8> noundef %b, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | ||||
// CHECK: ret <16 x i8> [[VTBX1_I]] | // CHECK: ret <16 x i8> [[VTBX1_I]] | ||||
int8x16_t test_vqtbx1q_s8(int8x16_t a, int8x16_t b, uint8x16_t c) { | int8x16_t test_vqtbx1q_s8(int8x16_t a, int8x16_t b, uint8x16_t c) { | ||||
return vqtbx1q_s8(a, b, c); | return vqtbx1q_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx2q_s8(<16 x i8> %a, [2 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx2q_s8(<16 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x2_t, %struct.int8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2q_s8(a, b, c); | return vqtbx2q_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx3q_s8(<16 x i8> %a, [3 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx3q_s8(<16 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x3_t, %struct.int8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3q_s8(a, b, c); | return vqtbx3q_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx4q_s8(<16 x i8> %a, [4 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx4q_s8(<16 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.int8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.int8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.int8x16x4_t, %struct.int8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx4q_s8(a, b, c); | return vqtbx4q_s8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl1_u8(<8 x i8> %a, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl1_u8(<8 x i8> noundef %a, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL11_I]] | // CHECK: ret <8 x i8> [[VTBL11_I]] | ||||
Context not available. | |||||
return vtbl1_u8(a, b); | return vtbl1_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl1_u8(<16 x i8> %a, <8 x i8> %b) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl1_u8(<16 x i8> noundef %a, <8 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL1_I]] | // CHECK: ret <8 x i8> [[VTBL1_I]] | ||||
uint8x8_t test_vqtbl1_u8(uint8x16_t a, uint8x8_t b) { | uint8x8_t test_vqtbl1_u8(uint8x16_t a, uint8x8_t b) { | ||||
return vqtbl1_u8(a, b); | return vqtbl1_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl2_u8([2 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl2_u8([2 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x2_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x2_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x8x2_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.uint8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x2_t, %struct.uint8x8x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x2_t, %struct.uint8x8x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl2_u8(a, b); | return vtbl2_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl2_u8([2 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl2_u8([2 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2_u8(a, b); | return vqtbl2_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl3_u8([3 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl3_u8([3 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x3_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x3_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x8x3_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.uint8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x3_t, %struct.uint8x8x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x3_t, %struct.uint8x8x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl3_u8(a, b); | return vtbl3_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl3_u8([3 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl3_u8([3 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3_u8(a, b); | return vqtbl3_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl4_u8([4 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl4_u8([4 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x4_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x8x4_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x8x4_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.uint8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x4_t, %struct.uint8x8x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x4_t, %struct.uint8x8x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl4_u8(a, b); | return vtbl4_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl4_u8([4 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl4_u8([4 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4_u8(a, b); | return vqtbl4_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl1q_u8(<16 x i8> %a, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl1q_u8(<16 x i8> noundef %a, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | ||||
// CHECK: ret <16 x i8> [[VTBL1_I]] | // CHECK: ret <16 x i8> [[VTBL1_I]] | ||||
uint8x16_t test_vqtbl1q_u8(uint8x16_t a, uint8x16_t b) { | uint8x16_t test_vqtbl1q_u8(uint8x16_t a, uint8x16_t b) { | ||||
return vqtbl1q_u8(a, b); | return vqtbl1q_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl2q_u8([2 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl2q_u8([2 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2q_u8(a, b); | return vqtbl2q_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl3q_u8([3 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl3q_u8([3 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3q_u8(a, b); | return vqtbl3q_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl4q_u8([4 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl4q_u8([4 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4q_u8(a, b); | return vqtbl4q_u8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx1_u8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx1_u8(<8 x i8> noundef %a, <8 x i8> noundef %b, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | ||||
// CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | // CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | ||||
Context not available. | |||||
return vtbx1_u8(a, b, c); | return vtbx1_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx2_u8(<8 x i8> %a, [2 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx2_u8(<8 x i8> noundef %a, [2 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x2_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x2_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x8x2_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.uint8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x2_t, %struct.uint8x8x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x2_t, %struct.uint8x8x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx2_u8(a, b, c); | return vtbx2_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx3_u8(<8 x i8> %a, [3 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx3_u8(<8 x i8> noundef %a, [3 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x3_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x3_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x8x3_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.uint8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x3_t, %struct.uint8x8x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x3_t, %struct.uint8x8x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx3_u8(a, b, c); | return vtbx3_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx4_u8(<8 x i8> %a, [4 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx4_u8(<8 x i8> noundef %a, [4 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x4_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x8x4_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x8x4_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.uint8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x4_t, %struct.uint8x8x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x8x4_t, %struct.uint8x8x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx4_u8(a, b, c); | return vtbx4_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx1_u8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx1_u8(<8 x i8> noundef %a, <16 x i8> noundef %b, <8 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | ||||
// CHECK: ret <8 x i8> [[VTBX1_I]] | // CHECK: ret <8 x i8> [[VTBX1_I]] | ||||
uint8x8_t test_vqtbx1_u8(uint8x8_t a, uint8x16_t b, uint8x8_t c) { | uint8x8_t test_vqtbx1_u8(uint8x8_t a, uint8x16_t b, uint8x8_t c) { | ||||
return vqtbx1_u8(a, b, c); | return vqtbx1_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx2_u8(<8 x i8> %a, [2 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx2_u8(<8 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2_u8(a, b, c); | return vqtbx2_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx3_u8(<8 x i8> %a, [3 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx3_u8(<8 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3_u8(a, b, c); | return vqtbx3_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx4_u8(<8 x i8> %a, [4 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx4_u8(<8 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx4_u8(a, b, c); | return vqtbx4_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx1q_u8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx1q_u8(<16 x i8> noundef %a, <16 x i8> noundef %b, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | ||||
// CHECK: ret <16 x i8> [[VTBX1_I]] | // CHECK: ret <16 x i8> [[VTBX1_I]] | ||||
uint8x16_t test_vqtbx1q_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c) { | uint8x16_t test_vqtbx1q_u8(uint8x16_t a, uint8x16_t b, uint8x16_t c) { | ||||
return vqtbx1q_u8(a, b, c); | return vqtbx1q_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx2q_u8(<16 x i8> %a, [2 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx2q_u8(<16 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x2_t, %struct.uint8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2q_u8(a, b, c); | return vqtbx2q_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx3q_u8(<16 x i8> %a, [3 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx3q_u8(<16 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x3_t, %struct.uint8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3q_u8(a, b, c); | return vqtbx3q_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx4q_u8(<16 x i8> %a, [4 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx4q_u8(<16 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.uint8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.uint8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.uint8x16x4_t, %struct.uint8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx4q_u8(a, b, c); | return vqtbx4q_u8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl1_p8(<8 x i8> %a, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl1_p8(<8 x i8> noundef %a, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %a, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL11_I]] | // CHECK: ret <8 x i8> [[VTBL11_I]] | ||||
Context not available. | |||||
return vtbl1_p8(a, b); | return vtbl1_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl1_p8(<16 x i8> %a, <8 x i8> %b) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl1_p8(<16 x i8> noundef %a, <8 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> %a, <8 x i8> %b) #3 | ||||
// CHECK: ret <8 x i8> [[VTBL1_I]] | // CHECK: ret <8 x i8> [[VTBL1_I]] | ||||
poly8x8_t test_vqtbl1_p8(poly8x16_t a, uint8x8_t b) { | poly8x8_t test_vqtbl1_p8(poly8x16_t a, uint8x8_t b) { | ||||
return vqtbl1_p8(a, b); | return vqtbl1_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl2_p8([2 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl2_p8([2 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x2_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x2_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x8x2_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.poly8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x2_t, %struct.poly8x8x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x2_t, %struct.poly8x8x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl2_p8(a, b); | return vtbl2_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl2_p8([2 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl2_p8([2 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2_p8(a, b); | return vqtbl2_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl3_p8([3 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl3_p8([3 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x3_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x3_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x8x3_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.poly8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x3_t, %struct.poly8x8x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x3_t, %struct.poly8x8x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl3_p8(a, b); | return vtbl3_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl3_p8([3 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl3_p8([3 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3_p8(a, b); | return vqtbl3_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbl4_p8([4 x <8 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbl4_p8([4 x <8 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x4_t, align 8 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x8x4_t, align 8 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x8x4_t, align 8 | // CHECK: [[A:%.*]] = alloca %struct.poly8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x4_t, %struct.poly8x8x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x4_t, %struct.poly8x8x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbl4_p8(a, b); | return vtbl4_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbl4_p8([4 x <16 x i8>] %a.coerce, <8 x i8> %b) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbl4_p8([4 x <16 x i8>] %a.coerce, <8 x i8> noundef %b) #0 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4_p8(a, b); | return vqtbl4_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl1q_p8(<16 x i8> %a, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl1q_p8(<16 x i8> noundef %a, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | // CHECK: [[VTBL1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbl1.v16i8(<16 x i8> %a, <16 x i8> %b) #3 | ||||
// CHECK: ret <16 x i8> [[VTBL1_I]] | // CHECK: ret <16 x i8> [[VTBL1_I]] | ||||
poly8x16_t test_vqtbl1q_p8(poly8x16_t a, uint8x16_t b) { | poly8x16_t test_vqtbl1q_p8(poly8x16_t a, uint8x16_t b) { | ||||
return vqtbl1q_p8(a, b); | return vqtbl1q_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl2q_p8([2 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl2q_p8([2 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl2q_p8(a, b); | return vqtbl2q_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl3q_p8([3 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl3q_p8([3 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl3q_p8(a, b); | return vqtbl3q_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbl4q_p8([4 x <16 x i8>] %a.coerce, <16 x i8> %b) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbl4q_p8([4 x <16 x i8>] %a.coerce, <16 x i8> noundef %b) #1 { | ||||
// CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[__P0_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[A:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[A:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[A]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[A]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbl4q_p8(a, b); | return vqtbl4q_p8(a, b); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx1_p8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx1_p8(<8 x i8> noundef %a, <8 x i8> noundef %b, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | // CHECK: [[VTBL1_I:%.*]] = shufflevector <8 x i8> %b, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | ||||
// CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | // CHECK: [[VTBL11_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbl1.v8i8(<16 x i8> [[VTBL1_I]], <8 x i8> %c) #3 | ||||
// CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | // CHECK: [[TMP0:%.*]] = icmp uge <8 x i8> %c, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> | ||||
Context not available. | |||||
return vtbx1_p8(a, b, c); | return vtbx1_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx2_p8(<8 x i8> %a, [2 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx2_p8(<8 x i8> noundef %a, [2 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x2_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x2_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x8x2_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.poly8x8x2_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x2_t, %struct.poly8x8x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x2_t, %struct.poly8x8x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx2_p8(a, b, c); | return vtbx2_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx3_p8(<8 x i8> %a, [3 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx3_p8(<8 x i8> noundef %a, [3 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x3_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x3_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x8x3_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.poly8x8x3_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x3_t, %struct.poly8x8x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x3_t, %struct.poly8x8x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx3_p8(a, b, c); | return vtbx3_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vtbx4_p8(<8 x i8> %a, [4 x <8 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vtbx4_p8(<8 x i8> noundef %a, [4 x <8 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x4_t, align 8 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x8x4_t, align 8 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x8x4_t, align 8 | // CHECK: [[B:%.*]] = alloca %struct.poly8x8x4_t, align 8 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x4_t, %struct.poly8x8x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x8x4_t, %struct.poly8x8x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vtbx4_p8(a, b, c); | return vtbx4_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx1_p8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #1 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx1_p8(<8 x i8> noundef %a, <16 x i8> noundef %b, <8 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.tbx1.v8i8(<8 x i8> %a, <16 x i8> %b, <8 x i8> %c) #3 | ||||
// CHECK: ret <8 x i8> [[VTBX1_I]] | // CHECK: ret <8 x i8> [[VTBX1_I]] | ||||
poly8x8_t test_vqtbx1_p8(poly8x8_t a, uint8x16_t b, uint8x8_t c) { | poly8x8_t test_vqtbx1_p8(poly8x8_t a, uint8x16_t b, uint8x8_t c) { | ||||
return vqtbx1_p8(a, b, c); | return vqtbx1_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx2_p8(<8 x i8> %a, [2 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx2_p8(<8 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2_p8(a, b, c); | return vqtbx2_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx3_p8(<8 x i8> %a, [3 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx3_p8(<8 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3_p8(a, b, c); | return vqtbx3_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <8 x i8> @test_vqtbx4_p8(<8 x i8> %a, [4 x <16 x i8>] %b.coerce, <8 x i8> %c) #0 { | // CHECK-LABEL: define noundef <8 x i8> @test_vqtbx4_p8(<8 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <8 x i8> noundef %c) #0 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx4_p8(a, b, c); | return vqtbx4_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx1q_p8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx1q_p8(<16 x i8> noundef %a, <16 x i8> noundef %b, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | // CHECK: [[VTBX1_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.tbx1.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) #3 | ||||
// CHECK: ret <16 x i8> [[VTBX1_I]] | // CHECK: ret <16 x i8> [[VTBX1_I]] | ||||
poly8x16_t test_vqtbx1q_p8(poly8x16_t a, uint8x16_t b, uint8x16_t c) { | poly8x16_t test_vqtbx1q_p8(poly8x16_t a, uint8x16_t b, uint8x16_t c) { | ||||
return vqtbx1q_p8(a, b, c); | return vqtbx1q_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx2q_p8(<16 x i8> %a, [2 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx2q_p8(<16 x i8> noundef %a, [2 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x2_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x2_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x2_t, %struct.poly8x16x2_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx2q_p8(a, b, c); | return vqtbx2q_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx3q_p8(<16 x i8> %a, [3 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx3q_p8(<16 x i8> noundef %a, [3 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x3_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x3_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x3_t, %struct.poly8x16x3_t* [[B]], i32 0, i32 0 | ||||
Context not available. | |||||
return vqtbx3q_p8(a, b, c); | return vqtbx3q_p8(a, b, c); | ||||
} | } | ||||
// CHECK-LABEL: define <16 x i8> @test_vqtbx4q_p8(<16 x i8> %a, [4 x <16 x i8>] %b.coerce, <16 x i8> %c) #1 { | // CHECK-LABEL: define noundef <16 x i8> @test_vqtbx4q_p8(<16 x i8> noundef %a, [4 x <16 x i8>] %b.coerce, <16 x i8> noundef %c) #1 { | ||||
// CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[__P1_I:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[B:%.*]] = alloca %struct.poly8x16x4_t, align 16 | // CHECK: [[B:%.*]] = alloca %struct.poly8x16x4_t, align 16 | ||||
// CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[B]], i32 0, i32 0 | // CHECK: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.poly8x16x4_t, %struct.poly8x16x4_t* [[B]], i32 0, i32 0 | ||||
Context not available. |