1 ; Test the Test Data Class instruction, selected manually via the intrinsic. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 declare i32 @llvm.s390.tdc.f32(float, i64) 6 declare i32 @llvm.s390.tdc.f64(double, i64) 7 declare i32 @llvm.s390.tdc.f128(fp128, i64) 8 9 ; Check using as i32 - f32 10 define i32 @f1(float %x) { 11 ; CHECK-LABEL: f1 12 ; CHECK: tceb %f0, 123 13 ; CHECK: ipm %r2 14 ; CHECK: srl %r2, 28 15 %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) 16 ret i32 %res 17 } 18 19 ; Check using as i32 - f64 20 define i32 @f2(double %x) { 21 ; CHECK-LABEL: f2 22 ; CHECK: tcdb %f0, 123 23 ; CHECK: ipm %r2 24 ; CHECK: srl %r2, 28 25 %res = call i32 @llvm.s390.tdc.f64(double %x, i64 123) 26 ret i32 %res 27 } 28 29 ; Check using as i32 - f128 30 define i32 @f3(fp128 %x) { 31 ; CHECK-LABEL: f3 32 ; CHECK: ld %f0, 0(%r2) 33 ; CHECK: ld %f2, 8(%r2) 34 ; CHECK: tcxb %f0, 123 35 ; CHECK: ipm %r2 36 ; CHECK: srl %r2, 28 37 %res = call i32 @llvm.s390.tdc.f128(fp128 %x, i64 123) 38 ret i32 %res 39 } 40 41 declare void @g() 42 43 ; Check branch 44 define void @f4(float %x) { 45 ; CHECK-LABEL: f4 46 ; CHECK: tceb %f0, 123 47 ; CHECK: jgl g 48 ; CHECK: br %r14 49 %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) 50 %cond = icmp ne i32 %res, 0 51 br i1 %cond, label %call, label %exit 52 53 call: 54 tail call void @g() 55 br label %exit 56 57 exit: 58 ret void 59 } 60 61 ; Check branch negated 62 define void @f5(float %x) { 63 ; CHECK-LABEL: f5 64 ; CHECK: tceb %f0, 123 65 ; CHECK: jge g 66 ; CHECK: br %r14 67 %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) 68 %cond = icmp eq i32 %res, 0 69 br i1 %cond, label %call, label %exit 70 71 call: 72 tail call void @g() 73 br label %exit 74 75 exit: 76 ret void 77 } 78 79 ; Check non-const mask 80 define void @f6(float %x, i64 %y) { 81 ; CHECK-LABEL: f6 82 ; CHECK: tceb %f0, 0(%r2) 83 ; CHECK: jge g 84 ; CHECK: br %r14 85 %res = call i32 @llvm.s390.tdc.f32(float %x, i64 %y) 86 %cond = icmp eq i32 %res, 0 87 br i1 %cond, label %call, label %exit 88 89 call: 90 tail call void @g() 91 br label %exit 92 93 exit: 94 ret void 95 } 96