xref: /llvm-project/clang/test/CodeGen/AArch64/builtin-shufflevector-fp8.c (revision 87103a016fbfd480e1d3bb8eba23c27a9c74e70d)
1*87103a01SMomchil Velikov // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2*87103a01SMomchil Velikov // RUN: %clang_cc1 -triple aarch64-linux -target-feature +neon -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s
3*87103a01SMomchil Velikov 
4*87103a01SMomchil Velikov // REQUIRES: aarch64-registered-target
5*87103a01SMomchil Velikov 
6*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(8))) signed char int8x8_t;
7*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(16))) signed char int8x16_t;
8*87103a01SMomchil Velikov 
9*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(8))) __mfp8 mfloat8x8_t;
10*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(16))) __mfp8 mfloat8x16_t;
11*87103a01SMomchil Velikov 
12*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_8x8(
13*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] {
14*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
15*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <8 x i8> [[X]], <8 x i8> [[X]], <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 3, i32 2, i32 1, i32 0>
16*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[SHUFFLE]]
17*87103a01SMomchil Velikov //
18*87103a01SMomchil Velikov mfloat8x8_t test_8x8(mfloat8x8_t x) {
19*87103a01SMomchil Velikov   return __builtin_shufflevector(x, x, 3, 2, 1, 0, 3, 2, 1, 0);
20*87103a01SMomchil Velikov }
21*87103a01SMomchil Velikov 
22*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_8x8_v(
23*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]], <8 x i8> noundef [[P:%.*]]) #[[ATTR0]] {
24*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
25*87103a01SMomchil Velikov // CHECK-NEXT:    [[MASK:%.*]] = and <8 x i8> [[P]], splat (i8 7)
26*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX:%.*]] = extractelement <8 x i8> [[MASK]], i64 0
27*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX]]
28*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS:%.*]] = insertelement <8 x i8> poison, i8 [[SHUF_ELT]], i64 0
29*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX1:%.*]] = extractelement <8 x i8> [[MASK]], i64 1
30*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT2:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX1]]
31*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS3:%.*]] = insertelement <8 x i8> [[SHUF_INS]], i8 [[SHUF_ELT2]], i64 1
32*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX4:%.*]] = extractelement <8 x i8> [[MASK]], i64 2
33*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT5:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX4]]
34*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS6:%.*]] = insertelement <8 x i8> [[SHUF_INS3]], i8 [[SHUF_ELT5]], i64 2
35*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX7:%.*]] = extractelement <8 x i8> [[MASK]], i64 3
36*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT8:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX7]]
37*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS9:%.*]] = insertelement <8 x i8> [[SHUF_INS6]], i8 [[SHUF_ELT8]], i64 3
38*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX10:%.*]] = extractelement <8 x i8> [[MASK]], i64 4
39*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT11:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX10]]
40*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS12:%.*]] = insertelement <8 x i8> [[SHUF_INS9]], i8 [[SHUF_ELT11]], i64 4
41*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX13:%.*]] = extractelement <8 x i8> [[MASK]], i64 5
42*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT14:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX13]]
43*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS15:%.*]] = insertelement <8 x i8> [[SHUF_INS12]], i8 [[SHUF_ELT14]], i64 5
44*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX16:%.*]] = extractelement <8 x i8> [[MASK]], i64 6
45*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT17:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX16]]
46*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS18:%.*]] = insertelement <8 x i8> [[SHUF_INS15]], i8 [[SHUF_ELT17]], i64 6
47*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX19:%.*]] = extractelement <8 x i8> [[MASK]], i64 7
48*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT20:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX19]]
49*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS21:%.*]] = insertelement <8 x i8> [[SHUF_INS18]], i8 [[SHUF_ELT20]], i64 7
50*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[SHUF_INS21]]
51*87103a01SMomchil Velikov //
52*87103a01SMomchil Velikov mfloat8x8_t test_8x8_v(mfloat8x8_t x, int8x8_t p) {
53*87103a01SMomchil Velikov   return __builtin_shufflevector(x, p);
54*87103a01SMomchil Velikov }
55*87103a01SMomchil Velikov 
56*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @test_8x16(
57*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
58*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
59*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <16 x i8> [[X]], <16 x i8> [[X]], <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
60*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[SHUFFLE]]
61*87103a01SMomchil Velikov //
62*87103a01SMomchil Velikov mfloat8x16_t test_8x16(mfloat8x16_t x) {
63*87103a01SMomchil Velikov   return __builtin_shufflevector(x, x, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2,
64*87103a01SMomchil Velikov                                  1, 0);
65*87103a01SMomchil Velikov }
66*87103a01SMomchil Velikov 
67*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @test_8x16_v(
68*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]], <16 x i8> noundef [[P:%.*]]) #[[ATTR0]] {
69*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
70*87103a01SMomchil Velikov // CHECK-NEXT:    [[MASK:%.*]] = and <16 x i8> [[P]], splat (i8 15)
71*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX:%.*]] = extractelement <16 x i8> [[MASK]], i64 0
72*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX]]
73*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS:%.*]] = insertelement <16 x i8> poison, i8 [[SHUF_ELT]], i64 0
74*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX1:%.*]] = extractelement <16 x i8> [[MASK]], i64 1
75*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT2:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX1]]
76*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS3:%.*]] = insertelement <16 x i8> [[SHUF_INS]], i8 [[SHUF_ELT2]], i64 1
77*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX4:%.*]] = extractelement <16 x i8> [[MASK]], i64 2
78*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT5:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX4]]
79*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS6:%.*]] = insertelement <16 x i8> [[SHUF_INS3]], i8 [[SHUF_ELT5]], i64 2
80*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX7:%.*]] = extractelement <16 x i8> [[MASK]], i64 3
81*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT8:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX7]]
82*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS9:%.*]] = insertelement <16 x i8> [[SHUF_INS6]], i8 [[SHUF_ELT8]], i64 3
83*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX10:%.*]] = extractelement <16 x i8> [[MASK]], i64 4
84*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT11:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX10]]
85*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS12:%.*]] = insertelement <16 x i8> [[SHUF_INS9]], i8 [[SHUF_ELT11]], i64 4
86*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX13:%.*]] = extractelement <16 x i8> [[MASK]], i64 5
87*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT14:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX13]]
88*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS15:%.*]] = insertelement <16 x i8> [[SHUF_INS12]], i8 [[SHUF_ELT14]], i64 5
89*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX16:%.*]] = extractelement <16 x i8> [[MASK]], i64 6
90*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT17:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX16]]
91*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS18:%.*]] = insertelement <16 x i8> [[SHUF_INS15]], i8 [[SHUF_ELT17]], i64 6
92*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX19:%.*]] = extractelement <16 x i8> [[MASK]], i64 7
93*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT20:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX19]]
94*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS21:%.*]] = insertelement <16 x i8> [[SHUF_INS18]], i8 [[SHUF_ELT20]], i64 7
95*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX22:%.*]] = extractelement <16 x i8> [[MASK]], i64 8
96*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT23:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX22]]
97*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS24:%.*]] = insertelement <16 x i8> [[SHUF_INS21]], i8 [[SHUF_ELT23]], i64 8
98*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX25:%.*]] = extractelement <16 x i8> [[MASK]], i64 9
99*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT26:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX25]]
100*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS27:%.*]] = insertelement <16 x i8> [[SHUF_INS24]], i8 [[SHUF_ELT26]], i64 9
101*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX28:%.*]] = extractelement <16 x i8> [[MASK]], i64 10
102*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT29:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX28]]
103*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS30:%.*]] = insertelement <16 x i8> [[SHUF_INS27]], i8 [[SHUF_ELT29]], i64 10
104*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX31:%.*]] = extractelement <16 x i8> [[MASK]], i64 11
105*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT32:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX31]]
106*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS33:%.*]] = insertelement <16 x i8> [[SHUF_INS30]], i8 [[SHUF_ELT32]], i64 11
107*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX34:%.*]] = extractelement <16 x i8> [[MASK]], i64 12
108*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT35:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX34]]
109*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS36:%.*]] = insertelement <16 x i8> [[SHUF_INS33]], i8 [[SHUF_ELT35]], i64 12
110*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX37:%.*]] = extractelement <16 x i8> [[MASK]], i64 13
111*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT38:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX37]]
112*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS39:%.*]] = insertelement <16 x i8> [[SHUF_INS36]], i8 [[SHUF_ELT38]], i64 13
113*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX40:%.*]] = extractelement <16 x i8> [[MASK]], i64 14
114*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT41:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX40]]
115*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS42:%.*]] = insertelement <16 x i8> [[SHUF_INS39]], i8 [[SHUF_ELT41]], i64 14
116*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_IDX43:%.*]] = extractelement <16 x i8> [[MASK]], i64 15
117*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_ELT44:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX43]]
118*87103a01SMomchil Velikov // CHECK-NEXT:    [[SHUF_INS45:%.*]] = insertelement <16 x i8> [[SHUF_INS42]], i8 [[SHUF_ELT44]], i64 15
119*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[SHUF_INS45]]
120*87103a01SMomchil Velikov //
121*87103a01SMomchil Velikov mfloat8x16_t test_8x16_v(mfloat8x16_t x, int8x16_t p) {
122*87103a01SMomchil Velikov   return __builtin_shufflevector(x, p);
123*87103a01SMomchil Velikov }
124