1 ; Test floating-point truncations.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6 define float @f1(double %d1, double %d2) {
8 ; CHECK: ledbr %f0, %f2
10 %res = fptrunc double %d2 to float
15 define float @f2(fp128 *%ptr) {
17 ; CHECK: lexbr %f0, %f0
19 %val = load fp128 *%ptr
20 %res = fptrunc fp128 %val to float
24 ; Make sure that we don't use %f0 as the destination of LEXBR when %f2
26 define void @f3(float *%dst, fp128 *%ptr, float %d1, float %d2) {
28 ; CHECK: lexbr %f1, %f1
29 ; CHECK: aebr %f1, %f2
30 ; CHECK: ste %f1, 0(%r2)
32 %val = load fp128 *%ptr
33 %conv = fptrunc fp128 %val to float
34 %res = fadd float %conv, %d2
35 store float %res, float *%dst
40 define double @f4(fp128 *%ptr) {
42 ; CHECK: ldxbr %f0, %f0
44 %val = load fp128 *%ptr
45 %res = fptrunc fp128 %val to double
49 ; Like f3, but for f128->f64.
50 define void @f5(double *%dst, fp128 *%ptr, double %d1, double %d2) {
52 ; CHECK: ldxbr %f1, %f1
53 ; CHECK: adbr %f1, %f2
54 ; CHECK: std %f1, 0(%r2)
56 %val = load fp128 *%ptr
57 %conv = fptrunc fp128 %val to double
58 %res = fadd double %conv, %d2
59 store double %res, double *%dst