| ; 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 | |
| } |