1 ; Test the Test Data Class instruction logic operation conversion from 2 ; compares, combined with signbit or other compares to ensure worthiness. 3 ; 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 ; 6 7 declare float @llvm.fabs.f32(float) 8 declare double @llvm.fabs.f64(double) 9 declare fp128 @llvm.fabs.f128(fp128) 10 11 ; Compare with 0, extract sign bit 12 define i32 @f1(float %x) { 13 ; CHECK-LABEL: f1 14 ; CHECK: tceb %f0, 2047 15 %cast = bitcast float %x to i32 16 %sign = icmp slt i32 %cast, 0 17 %fcmp = fcmp ugt float %x, 0.0 18 %res = or i1 %sign, %fcmp 19 %xres = zext i1 %res to i32 20 ret i32 %xres 21 } 22 23 ; Compare with inf, extract negated sign bit 24 define i32 @f2(float %x) { 25 ; CHECK-LABEL: f2 26 ; CHECK: tceb %f0, 2698 27 %cast = bitcast float %x to i32 28 %sign = icmp sgt i32 %cast, -1 29 %fcmp = fcmp ult float %x, 0x7ff0000000000000 30 %res = and i1 %sign, %fcmp 31 %xres = zext i1 %res to i32 32 ret i32 %xres 33 } 34 35 ; Compare with minnorm, extract negated sign bit 36 define i32 @f3(float %x) { 37 ; CHECK-LABEL: f3 38 ; CHECK: tceb %f0, 2176 39 %cast = bitcast float %x to i32 40 %sign = icmp sgt i32 %cast, -1 41 %fcmp = fcmp olt float %x, 0x3810000000000000 42 %res = and i1 %sign, %fcmp 43 %xres = zext i1 %res to i32 44 ret i32 %xres 45 } 46 47 ; Test float isnormal, from clang. 48 define i32 @f4(float %x) { 49 ; CHECK-LABEL: f4 50 ; CHECK: tceb %f0, 768 51 %y = call float @llvm.fabs.f32(float %x) 52 %ord = fcmp ord float %x, 0.0 53 %a = fcmp ult float %y, 0x7ff0000000000000 54 %b = fcmp uge float %y, 0x3810000000000000 55 %c = and i1 %a, %b 56 %res = and i1 %ord, %c 57 %xres = zext i1 %res to i32 58 ret i32 %xres 59 } 60 61 ; Check for negative 0. 62 define i32 @f5(float %x) { 63 ; CHECK-LABEL: f5 64 ; CHECK: tceb %f0, 1024 65 %cast = bitcast float %x to i32 66 %sign = icmp slt i32 %cast, 0 67 %fcmp = fcmp oeq float %x, 0.0 68 %res = and i1 %sign, %fcmp 69 %xres = zext i1 %res to i32 70 ret i32 %xres 71 } 72 73 ; Test isnormal, from clang. 74 define i32 @f6(double %x) { 75 ; CHECK-LABEL: f6 76 ; CHECK: tcdb %f0, 768 77 %y = call double @llvm.fabs.f64(double %x) 78 %ord = fcmp ord double %x, 0.0 79 %a = fcmp ult double %y, 0x7ff0000000000000 80 %b = fcmp uge double %y, 0x0010000000000000 81 %c = and i1 %ord, %a 82 %res = and i1 %b, %c 83 %xres = zext i1 %res to i32 84 ret i32 %xres 85 } 86 87 ; Test isinf || isnan, from clang. 88 define i32 @f7(double %x) { 89 ; CHECK-LABEL: f7 90 ; CHECK: tcdb %f0, 63 91 %y = call double @llvm.fabs.f64(double %x) 92 %a = fcmp oeq double %y, 0x7ff0000000000000 93 %b = fcmp uno double %x, 0.0 94 %res = or i1 %a, %b 95 %xres = zext i1 %res to i32 96 ret i32 %xres 97 } 98