| ; Test the Test Data Class instruction, selected manually via the intrinsic. |
| ; |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s |
| |
| declare i32 @llvm.s390.tdc.f32(float, i64) |
| declare i32 @llvm.s390.tdc.f64(double, i64) |
| declare i32 @llvm.s390.tdc.f128(fp128, i64) |
| |
| ; Check using as i32 - f32 |
| define i32 @f1(float %x) { |
| ; CHECK-LABEL: f1 |
| ; CHECK: tceb %f0, 123 |
| ; CHECK: ipm %r2 |
| ; CHECK: srl %r2, 28 |
| %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) |
| ret i32 %res |
| } |
| |
| ; Check using as i32 - f64 |
| define i32 @f2(double %x) { |
| ; CHECK-LABEL: f2 |
| ; CHECK: tcdb %f0, 123 |
| ; CHECK: ipm %r2 |
| ; CHECK: srl %r2, 28 |
| %res = call i32 @llvm.s390.tdc.f64(double %x, i64 123) |
| ret i32 %res |
| } |
| |
| ; Check using as i32 - f128 |
| define i32 @f3(fp128 %x) { |
| ; CHECK-LABEL: f3 |
| ; CHECK: ld %f0, 0(%r2) |
| ; CHECK: ld %f2, 8(%r2) |
| ; CHECK: tcxb %f0, 123 |
| ; CHECK: ipm %r2 |
| ; CHECK: srl %r2, 28 |
| %res = call i32 @llvm.s390.tdc.f128(fp128 %x, i64 123) |
| ret i32 %res |
| } |
| |
| declare void @g() |
| |
| ; Check branch |
| define void @f4(float %x) { |
| ; CHECK-LABEL: f4 |
| ; CHECK: tceb %f0, 123 |
| ; CHECK: jgl g |
| ; CHECK: br %r14 |
| %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) |
| %cond = icmp ne i32 %res, 0 |
| br i1 %cond, label %call, label %exit |
| |
| call: |
| tail call void @g() |
| br label %exit |
| |
| exit: |
| ret void |
| } |
| |
| ; Check branch negated |
| define void @f5(float %x) { |
| ; CHECK-LABEL: f5 |
| ; CHECK: tceb %f0, 123 |
| ; CHECK: jge g |
| ; CHECK: br %r14 |
| %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) |
| %cond = icmp eq i32 %res, 0 |
| br i1 %cond, label %call, label %exit |
| |
| call: |
| tail call void @g() |
| br label %exit |
| |
| exit: |
| ret void |
| } |
| |
| ; Check non-const mask |
| define void @f6(float %x, i64 %y) { |
| ; CHECK-LABEL: f6 |
| ; CHECK: tceb %f0, 0(%r2) |
| ; CHECK: jge g |
| ; CHECK: br %r14 |
| %res = call i32 @llvm.s390.tdc.f32(float %x, i64 %y) |
| %cond = icmp eq i32 %res, 0 |
| br i1 %cond, label %call, label %exit |
| |
| call: |
| tail call void @g() |
| br label %exit |
| |
| exit: |
| ret void |
| } |