xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/f16c-intrinsics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown   -mattr=+avx,+f16c | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+f16c | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_x86_vcvtph2ps_128(<8 x i16> %a0) {
5*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtph2ps_128:
6*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
7*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtph2ps
8*9880d681SAndroid Build Coastguard Worker  %res = call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %a0) ; <<4 x float>> [#uses=1]
9*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %res
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16>) nounwind readonly
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test_x86_vcvtph2ps_256(<8 x i16> %a0) {
15*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtph2ps_256:
16*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
17*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtph2ps
18*9880d681SAndroid Build Coastguard Worker  %res = call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> %a0) ; <<8 x float>> [#uses=1]
19*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %res
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) nounwind readonly
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test_x86_vcvtph2ps_256_m(<8 x i16>* nocapture %a) nounwind {
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtph2ps_256_m:
26*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
27*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtph2ps  (%
28*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <8 x i16>, <8 x i16>* %a, align 16
29*9880d681SAndroid Build Coastguard Worker  %0 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> %tmp1)
30*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %0
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_x86_vcvtps2ph_128(<4 x float> %a0) {
34*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_128:
35*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
36*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph
37*9880d681SAndroid Build Coastguard Worker  %res = call <8 x i16> @llvm.x86.vcvtps2ph.128(<4 x float> %a0, i32 0) ; <<8 x i16>> [#uses=1]
38*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.vcvtps2ph.128(<4 x float>, i32) nounwind readonly
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_x86_vcvtps2ph_256(<8 x float> %a0) {
43*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_256:
44*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
45*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph
46*9880d681SAndroid Build Coastguard Worker  %res = call <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float> %a0, i32 0) ; <<8 x i16>> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %res
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float>, i32) nounwind readonly
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_x86_vcvtps2ph_128_scalar(i64* %ptr) {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_x86_vcvtps2ph_128_scalar:
53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov
54*9880d681SAndroid Build Coastguard Worker; CHECK: vcvtph2ps (%
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  %load = load i64, i64* %ptr
57*9880d681SAndroid Build Coastguard Worker  %ins1 = insertelement <2 x i64> undef, i64 %load, i32 0
58*9880d681SAndroid Build Coastguard Worker  %ins2 = insertelement <2 x i64> %ins1, i64 0, i32 1
59*9880d681SAndroid Build Coastguard Worker  %bc = bitcast <2 x i64> %ins2 to <8 x i16>
60*9880d681SAndroid Build Coastguard Worker  %res = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %bc) #2
61*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %res
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_x86_vcvtps2ph_128_scalar2(i64* %ptr) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_x86_vcvtps2ph_128_scalar2:
66*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov
67*9880d681SAndroid Build Coastguard Worker; CHECK: vcvtph2ps (%
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  %load = load i64, i64* %ptr
70*9880d681SAndroid Build Coastguard Worker  %ins = insertelement <2 x i64> undef, i64 %load, i32 0
71*9880d681SAndroid Build Coastguard Worker  %bc = bitcast <2 x i64> %ins to <8 x i16>
72*9880d681SAndroid Build Coastguard Worker  %res = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %bc)
73*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %res
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine void @test_x86_vcvtps2ph_256_m(<8 x i16>* nocapture %d, <8 x float> %a) nounwind {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_256_m:
79*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
80*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph  $3, %ymm0, (%
81*9880d681SAndroid Build Coastguard Worker  %0 = tail call <8 x i16> @llvm.x86.vcvtps2ph.256(<8 x float> %a, i32 3)
82*9880d681SAndroid Build Coastguard Worker  store <8 x i16> %0, <8 x i16>* %d, align 16
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine void @test_x86_vcvtps2ph_128_m(<4 x i16>* nocapture %d, <4 x float> %a) nounwind {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_128_m:
89*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
90*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph  $3, %xmm0, (%
91*9880d681SAndroid Build Coastguard Worker  %0 = tail call <8 x i16> @llvm.x86.vcvtps2ph.128(<4 x float> %a, i32 3)
92*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <8 x i16> %0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
93*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %1, <4 x i16>* %d, align 8
94*9880d681SAndroid Build Coastguard Worker  ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine void @test_x86_vcvtps2ph_128_m2(double* nocapture %hf4x16, <4 x float> %f4x32) #0 {
98*9880d681SAndroid Build Coastguard Workerentry:
99*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_128_m2:
100*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
101*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph  $3, %xmm0, (%
102*9880d681SAndroid Build Coastguard Worker  %0 = tail call <8 x i16> @llvm.x86.vcvtps2ph.128(<4 x float> %f4x32, i32 3)
103*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i16> %0 to <2 x double>
104*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x double> %1, i32 0
105*9880d681SAndroid Build Coastguard Worker  store double %vecext, double* %hf4x16, align 8
106*9880d681SAndroid Build Coastguard Worker  ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine void @test_x86_vcvtps2ph_128_m3(i64* nocapture %hf4x16, <4 x float> %f4x32) #0 {
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_x86_vcvtps2ph_128_m3:
112*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vmov
113*9880d681SAndroid Build Coastguard Worker  ; CHECK: vcvtps2ph  $3, %xmm0, (%
114*9880d681SAndroid Build Coastguard Worker  %0 = tail call <8 x i16> @llvm.x86.vcvtps2ph.128(<4 x float> %f4x32, i32 3)
115*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <8 x i16> %0 to <2 x i64>
116*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %1, i32 0
117*9880d681SAndroid Build Coastguard Worker  store i64 %vecext, i64* %hf4x16, align 8
118*9880d681SAndroid Build Coastguard Worker  ret void
119*9880d681SAndroid Build Coastguard Worker}
120