1; Test 64-bit equality comparisons in which the second operand is a constant. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5; Check comparisons with 0. 6define double @f1(double %a, double %b, i64 %i1) { 7; CHECK: f1: 8; CHECK: cghi %r2, 0 9; CHECK-NEXT: je 10; CHECK: ldr %f0, %f2 11; CHECK: br %r14 12 %cond = icmp eq i64 %i1, 0 13 %res = select i1 %cond, double %a, double %b 14 ret double %res 15} 16 17; Check the high end of the CGHI range. 18define double @f2(double %a, double %b, i64 %i1) { 19; CHECK: f2: 20; CHECK: cghi %r2, 32767 21; CHECK-NEXT: je 22; CHECK: ldr %f0, %f2 23; CHECK: br %r14 24 %cond = icmp eq i64 %i1, 32767 25 %res = select i1 %cond, double %a, double %b 26 ret double %res 27} 28 29; Check the next value up, which must use CGFI. 30define double @f3(double %a, double %b, i64 %i1) { 31; CHECK: f3: 32; CHECK: cgfi %r2, 32768 33; CHECK-NEXT: je 34; CHECK: ldr %f0, %f2 35; CHECK: br %r14 36 %cond = icmp eq i64 %i1, 32768 37 %res = select i1 %cond, double %a, double %b 38 ret double %res 39} 40 41; Check the high end of the CGFI range. 42define double @f4(double %a, double %b, i64 %i1) { 43; CHECK: f4: 44; CHECK: cgfi %r2, 2147483647 45; CHECK-NEXT: je 46; CHECK: ldr %f0, %f2 47; CHECK: br %r14 48 %cond = icmp eq i64 %i1, 2147483647 49 %res = select i1 %cond, double %a, double %b 50 ret double %res 51} 52 53; Check the next value up, which should use CLGFI instead. 54define double @f5(double %a, double %b, i64 %i1) { 55; CHECK: f5: 56; CHECK: clgfi %r2, 2147483648 57; CHECK-NEXT: je 58; CHECK: ldr %f0, %f2 59; CHECK: br %r14 60 %cond = icmp eq i64 %i1, 2147483648 61 %res = select i1 %cond, double %a, double %b 62 ret double %res 63} 64 65; Check the high end of the CLGFI range. 66define double @f6(double %a, double %b, i64 %i1) { 67; CHECK: f6: 68; CHECK: clgfi %r2, 4294967295 69; CHECK-NEXT: je 70; CHECK: ldr %f0, %f2 71; CHECK: br %r14 72 %cond = icmp eq i64 %i1, 4294967295 73 %res = select i1 %cond, double %a, double %b 74 ret double %res 75} 76 77; Check the next value up, which must use a register comparison. 78define double @f7(double %a, double %b, i64 %i1) { 79; CHECK: f7: 80; CHECK: cgrje %r2, 81; CHECK: ldr %f0, %f2 82; CHECK: br %r14 83 %cond = icmp eq i64 %i1, 4294967296 84 %res = select i1 %cond, double %a, double %b 85 ret double %res 86} 87 88; Check the high end of the negative CGHI range. 89define double @f8(double %a, double %b, i64 %i1) { 90; CHECK: f8: 91; CHECK: cghi %r2, -1 92; CHECK-NEXT: je 93; CHECK: ldr %f0, %f2 94; CHECK: br %r14 95 %cond = icmp eq i64 %i1, -1 96 %res = select i1 %cond, double %a, double %b 97 ret double %res 98} 99 100; Check the low end of the CGHI range. 101define double @f9(double %a, double %b, i64 %i1) { 102; CHECK: f9: 103; CHECK: cghi %r2, -32768 104; CHECK-NEXT: je 105; CHECK: ldr %f0, %f2 106; CHECK: br %r14 107 %cond = icmp eq i64 %i1, -32768 108 %res = select i1 %cond, double %a, double %b 109 ret double %res 110} 111 112; Check the next value down, which must use CGFI instead. 113define double @f10(double %a, double %b, i64 %i1) { 114; CHECK: f10: 115; CHECK: cgfi %r2, -32769 116; CHECK-NEXT: je 117; CHECK: ldr %f0, %f2 118; CHECK: br %r14 119 %cond = icmp eq i64 %i1, -32769 120 %res = select i1 %cond, double %a, double %b 121 ret double %res 122} 123 124; Check the low end of the CGFI range. 125define double @f11(double %a, double %b, i64 %i1) { 126; CHECK: f11: 127; CHECK: cgfi %r2, -2147483648 128; CHECK-NEXT: je 129; CHECK: ldr %f0, %f2 130; CHECK: br %r14 131 %cond = icmp eq i64 %i1, -2147483648 132 %res = select i1 %cond, double %a, double %b 133 ret double %res 134} 135 136; Check the next value down, which must use register comparison. 137define double @f12(double %a, double %b, i64 %i1) { 138; CHECK: f12: 139; CHECK: cgrje 140; CHECK: ldr %f0, %f2 141; CHECK: br %r14 142 %cond = icmp eq i64 %i1, -2147483649 143 %res = select i1 %cond, double %a, double %b 144 ret double %res 145} 146