xref: /llvm-project/clang/test/CodeGen/AArch64/fp8-cast.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-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg | FileCheck %s
3*87103a01SMomchil Velikov // RUN: %clang_cc1 -x c++ -triple aarch64-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg | FileCheck %s -check-prefix CHECK-CXX
4*87103a01SMomchil Velikov 
5*87103a01SMomchil Velikov // RUN: %clang_cc1        -triple aarch64-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -S -o /dev/null %s
6*87103a01SMomchil Velikov 
7*87103a01SMomchil Velikov // REQUIRES: aarch64-registered-target
8*87103a01SMomchil Velikov 
9*87103a01SMomchil Velikov #include <arm_neon.h>
10*87103a01SMomchil Velikov 
11*87103a01SMomchil Velikov // Bitcast between FP8 Neon vectors
12*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_f8(
13*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] {
14*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
15*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[X]]
16*87103a01SMomchil Velikov //
17*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z10test_f8_f813__Mfloat8x8_t(
18*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] {
19*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
20*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <8 x i8> [[X]]
21*87103a01SMomchil Velikov //
22*87103a01SMomchil Velikov mfloat8x8_t test_f8_f8(mfloat8x8_t x) {
23*87103a01SMomchil Velikov     return (mfloat8x8_t) x;
24*87103a01SMomchil Velikov }
25*87103a01SMomchil Velikov 
26*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_f8(
27*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
28*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
29*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[X]]
30*87103a01SMomchil Velikov //
31*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z11testq_f8_f814__Mfloat8x16_t(
32*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
33*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
34*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <16 x i8> [[X]]
35*87103a01SMomchil Velikov //
36*87103a01SMomchil Velikov mfloat8x16_t testq_f8_f8(mfloat8x16_t x) {
37*87103a01SMomchil Velikov     return (mfloat8x16_t) x;
38*87103a01SMomchil Velikov }
39*87103a01SMomchil Velikov 
40*87103a01SMomchil Velikov // Bitcast between FP8 and int8 Neon vectors
41*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_s8(
42*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> noundef [[X:%.*]]) #[[ATTR0]] {
43*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
44*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[X]]
45*87103a01SMomchil Velikov //
46*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z10test_f8_s810__Int8x8_t(
47*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> noundef [[X:%.*]]) #[[ATTR0]] {
48*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
49*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <8 x i8> [[X]]
50*87103a01SMomchil Velikov //
51*87103a01SMomchil Velikov mfloat8x8_t test_f8_s8(int8x8_t x) {
52*87103a01SMomchil Velikov     return (mfloat8x8_t) x;
53*87103a01SMomchil Velikov }
54*87103a01SMomchil Velikov 
55*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_s8_f8(
56*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] {
57*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
58*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[X]]
59*87103a01SMomchil Velikov //
60*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <8 x i8> @_Z10test_s8_f813__Mfloat8x8_t(
61*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] {
62*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
63*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <8 x i8> [[X]]
64*87103a01SMomchil Velikov //
65*87103a01SMomchil Velikov int8x8_t test_s8_f8(mfloat8x8_t x) {
66*87103a01SMomchil Velikov     return (int8x8_t) x;
67*87103a01SMomchil Velikov }
68*87103a01SMomchil Velikov 
69*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_s8(
70*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> noundef [[X:%.*]]) #[[ATTR0]] {
71*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
72*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[X]]
73*87103a01SMomchil Velikov //
74*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z11testq_f8_s811__Int8x16_t(
75*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> noundef [[X:%.*]]) #[[ATTR0]] {
76*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
77*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <16 x i8> [[X]]
78*87103a01SMomchil Velikov //
79*87103a01SMomchil Velikov mfloat8x16_t testq_f8_s8(int8x16_t x) {
80*87103a01SMomchil Velikov     return (mfloat8x16_t) x;
81*87103a01SMomchil Velikov }
82*87103a01SMomchil Velikov 
83*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_s8_f8(
84*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
85*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
86*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[X]]
87*87103a01SMomchil Velikov //
88*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <16 x i8> @_Z11testq_s8_f814__Mfloat8x16_t(
89*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
90*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
91*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <16 x i8> [[X]]
92*87103a01SMomchil Velikov //
93*87103a01SMomchil Velikov int8x16_t testq_s8_f8(mfloat8x16_t x) {
94*87103a01SMomchil Velikov     return (int8x16_t) x;
95*87103a01SMomchil Velikov }
96*87103a01SMomchil Velikov 
97*87103a01SMomchil Velikov // Bitcast between FP8 and float32 Neon vectors
98*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_f32(
99*87103a01SMomchil Velikov // CHECK-SAME: <2 x float> noundef [[X:%.*]]) #[[ATTR0]] {
100*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
101*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <8 x i8>
102*87103a01SMomchil Velikov // CHECK-NEXT:    ret <8 x i8> [[TMP0]]
103*87103a01SMomchil Velikov //
104*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z11test_f8_f3213__Float32x2_t(
105*87103a01SMomchil Velikov // CHECK-CXX-SAME: <2 x float> noundef [[X:%.*]]) #[[ATTR0]] {
106*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
107*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <8 x i8>
108*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <8 x i8> [[TMP0]]
109*87103a01SMomchil Velikov //
110*87103a01SMomchil Velikov mfloat8x8_t test_f8_f32(float32x2_t x) {
111*87103a01SMomchil Velikov     return (mfloat8x8_t) x;
112*87103a01SMomchil Velikov }
113*87103a01SMomchil Velikov 
114*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <2 x float> @test_f32_f8(
115*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] {
116*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
117*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast <8 x i8> [[X]] to <2 x float>
118*87103a01SMomchil Velikov // CHECK-NEXT:    ret <2 x float> [[TMP0]]
119*87103a01SMomchil Velikov //
120*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <2 x float> @_Z11test_f32_f813__Mfloat8x8_t(
121*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] {
122*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
123*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast <8 x i8> [[X]] to <2 x float>
124*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <2 x float> [[TMP0]]
125*87103a01SMomchil Velikov //
126*87103a01SMomchil Velikov float32x2_t test_f32_f8(mfloat8x8_t x) {
127*87103a01SMomchil Velikov     return (float32x2_t) x;
128*87103a01SMomchil Velikov }
129*87103a01SMomchil Velikov 
130*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_f32(
131*87103a01SMomchil Velikov // CHECK-SAME: <4 x float> noundef [[X:%.*]]) #[[ATTR0]] {
132*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
133*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[X]] to <16 x i8>
134*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[TMP0]]
135*87103a01SMomchil Velikov //
136*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z12testq_f8_f3213__Float32x4_t(
137*87103a01SMomchil Velikov // CHECK-CXX-SAME: <4 x float> noundef [[X:%.*]]) #[[ATTR0]] {
138*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
139*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast <4 x float> [[X]] to <16 x i8>
140*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <16 x i8> [[TMP0]]
141*87103a01SMomchil Velikov //
142*87103a01SMomchil Velikov mfloat8x16_t testq_f8_f32(float32x4_t x) {
143*87103a01SMomchil Velikov     return (mfloat8x16_t) x;
144*87103a01SMomchil Velikov }
145*87103a01SMomchil Velikov 
146*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <4 x float> @testq_f32_f8(
147*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
148*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
149*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to <4 x float>
150*87103a01SMomchil Velikov // CHECK-NEXT:    ret <4 x float> [[TMP0]]
151*87103a01SMomchil Velikov //
152*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <4 x float> @_Z12testq_f32_f814__Mfloat8x16_t(
153*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
154*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
155*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to <4 x float>
156*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <4 x float> [[TMP0]]
157*87103a01SMomchil Velikov //
158*87103a01SMomchil Velikov float32x4_t testq_f32_f8(mfloat8x16_t x) {
159*87103a01SMomchil Velikov     return (float32x4_t) x;
160*87103a01SMomchil Velikov }
161*87103a01SMomchil Velikov 
162*87103a01SMomchil Velikov // Bitcast between FP8 and poly128_t (which is integral)
163*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_p128(
164*87103a01SMomchil Velikov // CHECK-SAME: i128 noundef [[X:%.*]]) #[[ATTR0]] {
165*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
166*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast i128 [[X]] to <16 x i8>
167*87103a01SMomchil Velikov // CHECK-NEXT:    ret <16 x i8> [[TMP0]]
168*87103a01SMomchil Velikov //
169*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z13testq_f8_p128o(
170*87103a01SMomchil Velikov // CHECK-CXX-SAME: i128 noundef [[X:%.*]]) #[[ATTR0]] {
171*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
172*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast i128 [[X]] to <16 x i8>
173*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret <16 x i8> [[TMP0]]
174*87103a01SMomchil Velikov //
175*87103a01SMomchil Velikov mfloat8x16_t testq_f8_p128(poly128_t x) {
176*87103a01SMomchil Velikov     return (mfloat8x16_t) x;
177*87103a01SMomchil Velikov }
178*87103a01SMomchil Velikov 
179*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local i128 @testq_p128_f8(
180*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
181*87103a01SMomchil Velikov // CHECK-NEXT:  [[ENTRY:.*:]]
182*87103a01SMomchil Velikov // CHECK-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to i128
183*87103a01SMomchil Velikov // CHECK-NEXT:    ret i128 [[TMP0]]
184*87103a01SMomchil Velikov //
185*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef i128 @_Z13testq_p128_f814__Mfloat8x16_t(
186*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] {
187*87103a01SMomchil Velikov // CHECK-CXX-NEXT:  [[ENTRY:.*:]]
188*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to i128
189*87103a01SMomchil Velikov // CHECK-CXX-NEXT:    ret i128 [[TMP0]]
190*87103a01SMomchil Velikov //
191*87103a01SMomchil Velikov poly128_t testq_p128_f8(mfloat8x16_t x) {
192*87103a01SMomchil Velikov     return (poly128_t) x;
193*87103a01SMomchil Velikov }
194