1; Test an i32 0/-1 SELECTCCC for every floating-point condition. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5; Test CC in { 0 } 6define i32 @f1(float %a, float %b) { 7; CHECK-LABEL: f1: 8; CHECK: ipm %r2 9; CHECK-NEXT: afi %r2, -268435456 10; CHECK-NEXT: sra %r2, 31 11; CHECK: br %r14 12 %cond = fcmp oeq float %a, %b 13 %res = select i1 %cond, i32 -1, i32 0 14 ret i32 %res 15} 16 17; Test CC in { 1 } 18define i32 @f2(float %a, float %b) { 19; CHECK-LABEL: f2: 20; CHECK: ipm %r2 21; CHECK-NEXT: xilf %r2, 268435456 22; CHECK-NEXT: afi %r2, -268435456 23; CHECK-NEXT: sra %r2, 31 24; CHECK: br %r14 25 %cond = fcmp olt float %a, %b 26 %res = select i1 %cond, i32 -1, i32 0 27 ret i32 %res 28} 29 30; Test CC in { 0, 1 } 31define i32 @f3(float %a, float %b) { 32; CHECK-LABEL: f3: 33; CHECK: ipm %r2 34; CHECK-NEXT: afi %r2, -536870912 35; CHECK-NEXT: sra %r2, 31 36; CHECK: br %r14 37 %cond = fcmp ole float %a, %b 38 %res = select i1 %cond, i32 -1, i32 0 39 ret i32 %res 40} 41 42; Test CC in { 2 } 43define i32 @f4(float %a, float %b) { 44; CHECK-LABEL: f4: 45; CHECK: ipm %r2 46; CHECK-NEXT: xilf %r2, 268435456 47; CHECK-NEXT: afi %r2, 1342177280 48; CHECK-NEXT: sra %r2, 31 49; CHECK: br %r14 50 %cond = fcmp ogt float %a, %b 51 %res = select i1 %cond, i32 -1, i32 0 52 ret i32 %res 53} 54 55; Test CC in { 0, 2 } 56define i32 @f5(float %a, float %b) { 57; CHECK-LABEL: f5: 58; CHECK: ipm %r2 59; CHECK-NEXT: xilf %r2, 4294967295 60; CHECK-NEXT: sll %r2, 3 61; CHECK-NEXT: sra %r2, 31 62; CHECK: br %r14 63 %cond = fcmp oge float %a, %b 64 %res = select i1 %cond, i32 -1, i32 0 65 ret i32 %res 66} 67 68; Test CC in { 1, 2 } 69define i32 @f6(float %a, float %b) { 70; CHECK-LABEL: f6: 71; CHECK: ipm %r2 72; CHECK-NEXT: afi %r2, 268435456 73; CHECK-NEXT: sll %r2, 2 74; CHECK-NEXT: sra %r2, 31 75; CHECK: br %r14 76 %cond = fcmp one float %a, %b 77 %res = select i1 %cond, i32 -1, i32 0 78 ret i32 %res 79} 80 81; Test CC in { 0, 1, 2 } 82define i32 @f7(float %a, float %b) { 83; CHECK-LABEL: f7: 84; CHECK: ipm %r2 85; CHECK-NEXT: afi %r2, -805306368 86; CHECK-NEXT: sra %r2, 31 87; CHECK: br %r14 88 %cond = fcmp ord float %a, %b 89 %res = select i1 %cond, i32 -1, i32 0 90 ret i32 %res 91} 92 93; Test CC in { 3 } 94define i32 @f8(float %a, float %b) { 95; CHECK-LABEL: f8: 96; CHECK: ipm %r2 97; CHECK-NEXT: afi %r2, 1342177280 98; CHECK-NEXT: sra %r2, 31 99; CHECK: br %r14 100 %cond = fcmp uno float %a, %b 101 %res = select i1 %cond, i32 -1, i32 0 102 ret i32 %res 103} 104 105; Test CC in { 0, 3 } 106define i32 @f9(float %a, float %b) { 107; CHECK-LABEL: f9: 108; CHECK: ipm %r2 109; CHECK-NEXT: afi %r2, -268435456 110; CHECK-NEXT: sll %r2, 2 111; CHECK-NEXT: sra %r2, 31 112; CHECK: br %r14 113 %cond = fcmp ueq float %a, %b 114 %res = select i1 %cond, i32 -1, i32 0 115 ret i32 %res 116} 117 118; Test CC in { 1, 3 } 119define i32 @f10(float %a, float %b) { 120; CHECK-LABEL: f10: 121; CHECK: ipm %r2 122; CHECK-NEXT: sll %r2, 3 123; CHECK-NEXT: sra %r2, 31 124; CHECK: br %r14 125 %cond = fcmp ult float %a, %b 126 %res = select i1 %cond, i32 -1, i32 0 127 ret i32 %res 128} 129 130; Test CC in { 0, 1, 3 } 131define i32 @f11(float %a, float %b) { 132; CHECK-LABEL: f11: 133; CHECK: ipm %r2 134; CHECK-NEXT: xilf %r2, 268435456 135; CHECK-NEXT: afi %r2, -805306368 136; CHECK-NEXT: sra %r2, 31 137; CHECK: br %r14 138 %cond = fcmp ule float %a, %b 139 %res = select i1 %cond, i32 -1, i32 0 140 ret i32 %res 141} 142 143; Test CC in { 2, 3 } 144define i32 @f12(float %a, float %b) { 145; CHECK-LABEL: f12: 146; CHECK: ipm %r2 147; CHECK-NEXT: sll %r2, 2 148; CHECK-NEXT: sra %r2, 31 149; CHECK: br %r14 150 %cond = fcmp ugt float %a, %b 151 %res = select i1 %cond, i32 -1, i32 0 152 ret i32 %res 153} 154 155; Test CC in { 0, 2, 3 } 156define i32 @f13(float %a, float %b) { 157; CHECK-LABEL: f13: 158; CHECK: ipm %r2 159; CHECK-NEXT: xilf %r2, 268435456 160; CHECK-NEXT: afi %r2, 1879048192 161; CHECK-NEXT: sra %r2, 31 162; CHECK: br %r14 163 %cond = fcmp uge float %a, %b 164 %res = select i1 %cond, i32 -1, i32 0 165 ret i32 %res 166} 167 168; Test CC in { 1, 2, 3 } 169define i32 @f14(float %a, float %b) { 170; CHECK-LABEL: f14: 171; CHECK: ipm %r2 172; CHECK-NEXT: afi %r2, 1879048192 173; CHECK-NEXT: sra %r2, 31 174; CHECK: br %r14 175 %cond = fcmp une float %a, %b 176 %res = select i1 %cond, i32 -1, i32 0 177 ret i32 %res 178} 179