1 ; Test the Test Data Class instruction logic operation conversion from 2 ; compares. 3 ; 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6 declare float @llvm.fabs.f32(float) 7 declare double @llvm.fabs.f64(double) 8 declare fp128 @llvm.fabs.f128(fp128) 9 10 ; Compare with 0 (unworthy) 11 define i32 @f1(float %x) { 12 ; CHECK-LABEL: f1 13 ; CHECK-NOT: tceb 14 ; CHECK: ltebr {{%f[0-9]+}}, %f0 15 ; CHECK-NOT: tceb 16 %res = fcmp ugt float %x, 0.0 17 %xres = zext i1 %res to i32 18 ret i32 %xres 19 } 20 21 ; Compare fabs with 0 (unworthy) 22 define i32 @f2(float %x) { 23 ; CHECK-LABEL: f2 24 ; CHECK-NOT: tceb 25 ; CHECK: lpebr {{%f[0-9]+}}, %f0 26 ; CHECK-NOT: tceb 27 %y = call float @llvm.fabs.f32(float %x) 28 %res = fcmp ugt float %y, 0.0 29 %xres = zext i1 %res to i32 30 ret i32 %xres 31 } 32 33 ; Compare with inf (unworthy) 34 define i32 @f3(float %x) { 35 ; CHECK-LABEL: f3 36 ; CHECK-NOT: tceb 37 ; CHECK: ceb %f0, 0(%r{{[0-9]+}}) 38 ; CHECK-NOT: tceb 39 %res = fcmp ult float %x, 0x7ff0000000000000 40 %xres = zext i1 %res to i32 41 ret i32 %xres 42 } 43 44 ; Compare fabs with inf 45 define i32 @f4(float %x) { 46 ; CHECK-LABEL: f4 47 ; CHECK: tceb %f0, 4047 48 %y = call float @llvm.fabs.f32(float %x) 49 %res = fcmp ult float %y, 0x7ff0000000000000 50 %xres = zext i1 %res to i32 51 ret i32 %xres 52 } 53 54 ; Compare with minnorm (unworthy) 55 define i32 @f5(float %x) { 56 ; CHECK-LABEL: f5 57 ; CHECK-NOT: tceb 58 ; CHECK: ceb %f0, 0(%r{{[0-9]+}}) 59 ; CHECK-NOT: tceb 60 %res = fcmp ult float %x, 0x3810000000000000 61 %xres = zext i1 %res to i32 62 ret i32 %xres 63 } 64 65 ; Compare fabs with minnorm 66 define i32 @f6(float %x) { 67 ; CHECK-LABEL: f6 68 ; CHECK: tceb %f0, 3279 69 %y = call float @llvm.fabs.f32(float %x) 70 %res = fcmp ult float %y, 0x3810000000000000 71 %xres = zext i1 %res to i32 72 ret i32 %xres 73 } 74 75 ; Compare fabs with minnorm, unsupported condition 76 define i32 @f7(float %x) { 77 ; CHECK-LABEL: f7 78 ; CHECK-NOT: tceb 79 ; CHECK: lpdfr [[REG:%f[0-9]+]], %f0 80 ; CHECK: ceb [[REG]], 0(%r{{[0-9]+}}) 81 ; CHECK-NOT: tceb 82 %y = call float @llvm.fabs.f32(float %x) 83 %res = fcmp ugt float %y, 0x3810000000000000 84 %xres = zext i1 %res to i32 85 ret i32 %xres 86 } 87 88 ; Compare fabs with unsupported constant 89 define i32 @f8(float %x) { 90 ; CHECK-LABEL: f8 91 ; CHECK-NOT: tceb 92 ; CHECK: lpdfr [[REG:%f[0-9]+]], %f0 93 ; CHECK: ceb [[REG]], 0(%r{{[0-9]+}}) 94 ; CHECK-NOT: tceb 95 %y = call float @llvm.fabs.f32(float %x) 96 %res = fcmp ult float %y, 0x3ff0000000000000 97 %xres = zext i1 %res to i32 98 ret i32 %xres 99 } 100 101 ; Compare fabs with minnorm - double 102 define i32 @f9(double %x) { 103 ; CHECK-LABEL: f9 104 ; CHECK: tcdb %f0, 3279 105 %y = call double @llvm.fabs.f64(double %x) 106 %res = fcmp ult double %y, 0x0010000000000000 107 %xres = zext i1 %res to i32 108 ret i32 %xres 109 } 110 111 ; Compare fabs with minnorm - long double 112 define i32 @f10(fp128 %x) { 113 ; CHECK-LABEL: f10 114 ; CHECK: tcxb %f0, 3279 115 %y = call fp128 @llvm.fabs.f128(fp128 %x) 116 %res = fcmp ult fp128 %y, 0xL00000000000000000001000000000000 117 %xres = zext i1 %res to i32 118 ret i32 %xres 119 } 120 121 ; Compare fabs for one with inf - clang's isfinite 122 define i32 @f11(double %x) { 123 ; CHECK-LABEL: f11 124 ; CHECK: tcdb %f0, 4032 125 %y = call double @llvm.fabs.f64(double %x) 126 %res = fcmp one double %y, 0x7ff0000000000000 127 %xres = zext i1 %res to i32 128 ret i32 %xres 129 } 130 131 ; Compare fabs for oeq with inf - clang's isinf 132 define i32 @f12(double %x) { 133 ; CHECK-LABEL: f12 134 ; CHECK: tcdb %f0, 48 135 %y = call double @llvm.fabs.f64(double %x) 136 %res = fcmp oeq double %y, 0x7ff0000000000000 137 %xres = zext i1 %res to i32 138 ret i32 %xres 139 } 140