xref: /llvm-project/llvm/test/CodeGen/SystemZ/fp-strict-conv-15.ll (revision a1710eb3cd5823c5d14899112ca3086acbdbe9cb)
1; Test f128 floating-point strict truncations/extensions on z14.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
4
5declare float @llvm.experimental.constrained.fptrunc.f32.f128(fp128, metadata, metadata)
6declare double @llvm.experimental.constrained.fptrunc.f64.f128(fp128, metadata, metadata)
7
8declare fp128 @llvm.experimental.constrained.fpext.f128.f32(float, metadata)
9declare fp128 @llvm.experimental.constrained.fpext.f128.f64(double, metadata)
10
11; Test f128->f64.
12define double @f1(ptr %ptr) #0 {
13; CHECK-LABEL: f1:
14; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)
15; CHECK: wflrx %f0, [[REG]], 0, 0
16; CHECK: br %r14
17  %val = load fp128, ptr %ptr
18  %res = call double @llvm.experimental.constrained.fptrunc.f64.f128(
19                                               fp128 %val,
20                                               metadata !"round.dynamic",
21                                               metadata !"fpexcept.strict") #0
22  ret double %res
23}
24
25; Test f128->f32.
26define float @f2(ptr %ptr) #0 {
27; CHECK-LABEL: f2:
28; CHECK: vl [[REG:%v[0-9]+]], 0(%r2)
29; CHECK: wflrx %f0, [[REG]], 0, 3
30; CHECK: ledbra %f0, 0, %f0, 0
31; CHECK: br %r14
32  %val = load fp128, ptr %ptr
33  %res = call float @llvm.experimental.constrained.fptrunc.f32.f128(
34                                               fp128 %val,
35                                               metadata !"round.dynamic",
36                                               metadata !"fpexcept.strict") #0
37  ret float %res
38}
39
40; Test f64->f128.
41define void @f3(ptr %dst, double %val) #0 {
42; CHECK-LABEL: f3:
43; CHECK: wflld [[RES:%v[0-9]+]], %f0
44; CHECK: vst [[RES]], 0(%r2)
45; CHECK: br %r14
46  %res = call fp128 @llvm.experimental.constrained.fpext.f128.f64(double %val,
47                                               metadata !"fpexcept.strict") #0
48  store fp128 %res, ptr %dst
49  ret void
50}
51
52; Test f32->f128.
53define void @f4(ptr %dst, float %val) #0 {
54; CHECK-LABEL: f4:
55; CHECK: ldebr %f0, %f0
56; CHECK: wflld [[RES:%v[0-9]+]], %f0
57; CHECK: vst [[RES]], 0(%r2)
58; CHECK: br %r14
59  %res = call fp128 @llvm.experimental.constrained.fpext.f128.f32(float %val,
60                                               metadata !"fpexcept.strict") #0
61  store fp128 %res, ptr %dst
62  ret void
63}
64
65attributes #0 = { strictfp }
66