1 ; Test all condition-code masks that are relevant for CGRJ. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 declare i64 @foo() 6 7 ; Test EQ. 8 define void @f1(i64 %target) { 9 ; CHECK-LABEL: f1: 10 ; CHECK: .cfi_def_cfa_offset 11 ; CHECK: .L[[LABEL:.*]]: 12 ; CHECK: cgrje %r2, {{%r[0-9]+}}, .L[[LABEL]] 13 br label %loop 14 loop: 15 %val = call i64 @foo() 16 %cond = icmp eq i64 %val, %target 17 br i1 %cond, label %loop, label %exit 18 exit: 19 ret void 20 } 21 22 ; Test NE. 23 define void @f2(i64 %target) { 24 ; CHECK-LABEL: f2: 25 ; CHECK: .cfi_def_cfa_offset 26 ; CHECK: .L[[LABEL:.*]]: 27 ; CHECK: cgrjlh %r2, {{%r[0-9]+}}, .L[[LABEL]] 28 br label %loop 29 loop: 30 %val = call i64 @foo() 31 %cond = icmp ne i64 %val, %target 32 br i1 %cond, label %loop, label %exit 33 exit: 34 ret void 35 } 36 37 ; Test SLE. 38 define void @f3(i64 %target) { 39 ; CHECK-LABEL: f3: 40 ; CHECK: .cfi_def_cfa_offset 41 ; CHECK: .L[[LABEL:.*]]: 42 ; CHECK: cgrjle %r2, {{%r[0-9]+}}, .L[[LABEL]] 43 br label %loop 44 loop: 45 %val = call i64 @foo() 46 %cond = icmp sle i64 %val, %target 47 br i1 %cond, label %loop, label %exit 48 exit: 49 ret void 50 } 51 52 ; Test SLT. 53 define void @f4(i64 %target) { 54 ; CHECK-LABEL: f4: 55 ; CHECK: .cfi_def_cfa_offset 56 ; CHECK: .L[[LABEL:.*]]: 57 ; CHECK: cgrjl %r2, {{%r[0-9]+}}, .L[[LABEL]] 58 br label %loop 59 loop: 60 %val = call i64 @foo() 61 %cond = icmp slt i64 %val, %target 62 br i1 %cond, label %loop, label %exit 63 exit: 64 ret void 65 } 66 67 ; Test SGT. 68 define void @f5(i64 %target) { 69 ; CHECK-LABEL: f5: 70 ; CHECK: .cfi_def_cfa_offset 71 ; CHECK: .L[[LABEL:.*]]: 72 ; CHECK: cgrjh %r2, {{%r[0-9]+}}, .L[[LABEL]] 73 br label %loop 74 loop: 75 %val = call i64 @foo() 76 %cond = icmp sgt i64 %val, %target 77 br i1 %cond, label %loop, label %exit 78 exit: 79 ret void 80 } 81 82 ; Test SGE. 83 define void @f6(i64 %target) { 84 ; CHECK-LABEL: f6: 85 ; CHECK: .cfi_def_cfa_offset 86 ; CHECK: .L[[LABEL:.*]]: 87 ; CHECK: cgrjhe %r2, {{%r[0-9]+}}, .L[[LABEL]] 88 br label %loop 89 loop: 90 %val = call i64 @foo() 91 %cond = icmp sge i64 %val, %target 92 br i1 %cond, label %loop, label %exit 93 exit: 94 ret void 95 } 96 97 ; Test a vector of 0/-1 results for i32 EQ. 98 define i64 @f7(i64 %a, i64 %b) { 99 ; CHECK-LABEL: f7: 100 ; CHECK: lhi [[REG:%r[0-5]]], -1 101 ; CHECK: crje {{%r[0-5]}} 102 ; CHECK: lhi [[REG]], 0 103 ; CHECK-NOT: sra 104 ; CHECK: br %r14 105 %avec = bitcast i64 %a to <2 x i32> 106 %bvec = bitcast i64 %b to <2 x i32> 107 %cmp = icmp eq <2 x i32> %avec, %bvec 108 %ext = sext <2 x i1> %cmp to <2 x i32> 109 %ret = bitcast <2 x i32> %ext to i64 110 ret i64 %ret 111 } 112 113 ; Test a vector of 0/-1 results for i32 NE. 114 define i64 @f8(i64 %a, i64 %b) { 115 ; CHECK-LABEL: f8: 116 ; CHECK: lhi [[REG:%r[0-5]]], -1 117 ; CHECK: crjlh {{%r[0-5]}} 118 ; CHECK: lhi [[REG]], 0 119 ; CHECK-NOT: sra 120 ; CHECK: br %r14 121 %avec = bitcast i64 %a to <2 x i32> 122 %bvec = bitcast i64 %b to <2 x i32> 123 %cmp = icmp ne <2 x i32> %avec, %bvec 124 %ext = sext <2 x i1> %cmp to <2 x i32> 125 %ret = bitcast <2 x i32> %ext to i64 126 ret i64 %ret 127 } 128 129 ; Test a vector of 0/-1 results for i64 EQ. 130 define void @f9(i64 %a, i64 %b, <2 x i64> *%dest) { 131 ; CHECK-LABEL: f9: 132 ; CHECK: lghi [[REG:%r[0-5]]], -1 133 ; CHECK: crje {{%r[0-5]}} 134 ; CHECK: lghi [[REG]], 0 135 ; CHECK-NOT: sra 136 ; CHECK: br %r14 137 %avec = bitcast i64 %a to <2 x i32> 138 %bvec = bitcast i64 %b to <2 x i32> 139 %cmp = icmp eq <2 x i32> %avec, %bvec 140 %ext = sext <2 x i1> %cmp to <2 x i64> 141 store <2 x i64> %ext, <2 x i64> *%dest 142 ret void 143 } 144 145 ; Test a vector of 0/-1 results for i64 NE. 146 define void @f10(i64 %a, i64 %b, <2 x i64> *%dest) { 147 ; CHECK-LABEL: f10: 148 ; CHECK: lghi [[REG:%r[0-5]]], -1 149 ; CHECK: crjlh {{%r[0-5]}} 150 ; CHECK: lghi [[REG]], 0 151 ; CHECK-NOT: sra 152 ; CHECK: br %r14 153 %avec = bitcast i64 %a to <2 x i32> 154 %bvec = bitcast i64 %b to <2 x i32> 155 %cmp = icmp ne <2 x i32> %avec, %bvec 156 %ext = sext <2 x i1> %cmp to <2 x i64> 157 store <2 x i64> %ext, <2 x i64> *%dest 158 ret void 159 } 160