xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/fp-conv-01.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test floating-point truncations.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \
4*9880d681SAndroid Build Coastguard Worker; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 \
6*9880d681SAndroid Build Coastguard Worker; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Test f64->f32.
9*9880d681SAndroid Build Coastguard Workerdefine float @f1(double %d1, double %d2) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
11*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: ledbr %f0, %f2
12*9880d681SAndroid Build Coastguard Worker; CHECK-VECTOR: ledbra %f0, 0, %f2, 0
13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
14*9880d681SAndroid Build Coastguard Worker  %res = fptrunc double %d2 to float
15*9880d681SAndroid Build Coastguard Worker  ret float %res
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; Test f128->f32.
19*9880d681SAndroid Build Coastguard Workerdefine float @f2(fp128 *%ptr) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
21*9880d681SAndroid Build Coastguard Worker; CHECK: lexbr %f0, %f0
22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
23*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *%ptr
24*9880d681SAndroid Build Coastguard Worker  %res = fptrunc fp128 %val to float
25*9880d681SAndroid Build Coastguard Worker  ret float %res
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; Make sure that we don't use %f0 as the destination of LEXBR when %f2
29*9880d681SAndroid Build Coastguard Worker; is still live.
30*9880d681SAndroid Build Coastguard Workerdefine void @f3(float *%dst, fp128 *%ptr, float %d1, float %d2) {
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
32*9880d681SAndroid Build Coastguard Worker; CHECK: lexbr %f1, %f1
33*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f1, %f2
34*9880d681SAndroid Build Coastguard Worker; CHECK: ste %f1, 0(%r2)
35*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
36*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *%ptr
37*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc fp128 %val to float
38*9880d681SAndroid Build Coastguard Worker  %res = fadd float %conv, %d2
39*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dst
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; Test f128->f64.
44*9880d681SAndroid Build Coastguard Workerdefine double @f4(fp128 *%ptr) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
46*9880d681SAndroid Build Coastguard Worker; CHECK: ldxbr %f0, %f0
47*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
48*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *%ptr
49*9880d681SAndroid Build Coastguard Worker  %res = fptrunc fp128 %val to double
50*9880d681SAndroid Build Coastguard Worker  ret double %res
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; Like f3, but for f128->f64.
54*9880d681SAndroid Build Coastguard Workerdefine void @f5(double *%dst, fp128 *%ptr, double %d1, double %d2) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
56*9880d681SAndroid Build Coastguard Worker; CHECK: ldxbr %f1, %f1
57*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: adbr %f1, %f2
58*9880d681SAndroid Build Coastguard Worker; CHECK-SCALAR: std %f1, 0(%r2)
59*9880d681SAndroid Build Coastguard Worker; CHECK-VECTOR: wfadb [[REG:%f[0-9]+]], %f1, %f2
60*9880d681SAndroid Build Coastguard Worker; CHECK-VECTOR: std [[REG]], 0(%r2)
61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
62*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *%ptr
63*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc fp128 %val to double
64*9880d681SAndroid Build Coastguard Worker  %res = fadd double %conv, %d2
65*9880d681SAndroid Build Coastguard Worker  store double %res, double *%dst
66*9880d681SAndroid Build Coastguard Worker  ret void
67*9880d681SAndroid Build Coastguard Worker}
68