1 ; Test all condition-code masks that are relevant for floating-point 2 ; comparisons. 3 ; 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6 define void @f1(float *%src, float %target) { 7 ; CHECK-LABEL: f1: 8 ; CHECK: .cfi_startproc 9 ; CHECK: .L[[LABEL:.*]]: 10 ; CHECK: ceb %f0, 0(%r2) 11 ; CHECK-NEXT: je .L[[LABEL]] 12 br label %loop 13 loop: 14 %val = load volatile float *%src 15 %cond = fcmp oeq float %target, %val 16 br i1 %cond, label %loop, label %exit 17 exit: 18 ret void 19 } 20 21 define void @f2(float *%src, float %target) { 22 ; CHECK-LABEL: f2: 23 ; CHECK: .cfi_startproc 24 ; CHECK: .L[[LABEL:.*]]: 25 ; CHECK: ceb %f0, 0(%r2) 26 ; CHECK-NEXT: jlh .L[[LABEL]] 27 br label %loop 28 loop: 29 %val = load volatile float *%src 30 %cond = fcmp one float %target, %val 31 br i1 %cond, label %loop, label %exit 32 exit: 33 ret void 34 } 35 36 define void @f3(float *%src, float %target) { 37 ; CHECK-LABEL: f3: 38 ; CHECK: .cfi_startproc 39 ; CHECK: .L[[LABEL:.*]]: 40 ; CHECK: ceb %f0, 0(%r2) 41 ; CHECK-NEXT: jle .L[[LABEL]] 42 br label %loop 43 loop: 44 %val = load volatile float *%src 45 %cond = fcmp ole float %target, %val 46 br i1 %cond, label %loop, label %exit 47 exit: 48 ret void 49 } 50 51 define void @f4(float *%src, float %target) { 52 ; CHECK-LABEL: f4: 53 ; CHECK: .cfi_startproc 54 ; CHECK: .L[[LABEL:.*]]: 55 ; CHECK: ceb %f0, 0(%r2) 56 ; CHECK-NEXT: jl .L[[LABEL]] 57 br label %loop 58 loop: 59 %val = load volatile float *%src 60 %cond = fcmp olt float %target, %val 61 br i1 %cond, label %loop, label %exit 62 exit: 63 ret void 64 } 65 66 define void @f5(float *%src, float %target) { 67 ; CHECK-LABEL: f5: 68 ; CHECK: .cfi_startproc 69 ; CHECK: .L[[LABEL:.*]]: 70 ; CHECK: ceb %f0, 0(%r2) 71 ; CHECK-NEXT: jh .L[[LABEL]] 72 br label %loop 73 loop: 74 %val = load volatile float *%src 75 %cond = fcmp ogt float %target, %val 76 br i1 %cond, label %loop, label %exit 77 exit: 78 ret void 79 } 80 81 define void @f6(float *%src, float %target) { 82 ; CHECK-LABEL: f6: 83 ; CHECK: .cfi_startproc 84 ; CHECK: .L[[LABEL:.*]]: 85 ; CHECK: ceb %f0, 0(%r2) 86 ; CHECK-NEXT: jhe .L[[LABEL]] 87 br label %loop 88 loop: 89 %val = load volatile float *%src 90 %cond = fcmp oge float %target, %val 91 br i1 %cond, label %loop, label %exit 92 exit: 93 ret void 94 } 95 96 define void @f7(float *%src, float %target) { 97 ; CHECK-LABEL: f7: 98 ; CHECK: .cfi_startproc 99 ; CHECK: .L[[LABEL:.*]]: 100 ; CHECK: ceb %f0, 0(%r2) 101 ; CHECK-NEXT: jnlh .L[[LABEL]] 102 br label %loop 103 loop: 104 %val = load volatile float *%src 105 %cond = fcmp ueq float %target, %val 106 br i1 %cond, label %loop, label %exit 107 exit: 108 ret void 109 } 110 111 define void @f8(float *%src, float %target) { 112 ; CHECK-LABEL: f8: 113 ; CHECK: .cfi_startproc 114 ; CHECK: .L[[LABEL:.*]]: 115 ; CHECK: ceb %f0, 0(%r2) 116 ; CHECK-NEXT: jne .L[[LABEL]] 117 br label %loop 118 loop: 119 %val = load volatile float *%src 120 %cond = fcmp une float %target, %val 121 br i1 %cond, label %loop, label %exit 122 exit: 123 ret void 124 } 125 126 define void @f9(float *%src, float %target) { 127 ; CHECK-LABEL: f9: 128 ; CHECK: .cfi_startproc 129 ; CHECK: .L[[LABEL:.*]]: 130 ; CHECK: ceb %f0, 0(%r2) 131 ; CHECK-NEXT: jnh .L[[LABEL]] 132 br label %loop 133 loop: 134 %val = load volatile float *%src 135 %cond = fcmp ule float %target, %val 136 br i1 %cond, label %loop, label %exit 137 exit: 138 ret void 139 } 140 141 define void @f10(float *%src, float %target) { 142 ; CHECK-LABEL: f10: 143 ; CHECK: .cfi_startproc 144 ; CHECK: .L[[LABEL:.*]]: 145 ; CHECK: ceb %f0, 0(%r2) 146 ; CHECK-NEXT: jnhe .L[[LABEL]] 147 br label %loop 148 loop: 149 %val = load volatile float *%src 150 %cond = fcmp ult float %target, %val 151 br i1 %cond, label %loop, label %exit 152 exit: 153 ret void 154 } 155 156 define void @f11(float *%src, float %target) { 157 ; CHECK-LABEL: f11: 158 ; CHECK: .cfi_startproc 159 ; CHECK: .L[[LABEL:.*]]: 160 ; CHECK: ceb %f0, 0(%r2) 161 ; CHECK-NEXT: jnle .L[[LABEL]] 162 br label %loop 163 loop: 164 %val = load volatile float *%src 165 %cond = fcmp ugt float %target, %val 166 br i1 %cond, label %loop, label %exit 167 exit: 168 ret void 169 } 170 171 define void @f12(float *%src, float %target) { 172 ; CHECK-LABEL: f12: 173 ; CHECK: .cfi_startproc 174 ; CHECK: .L[[LABEL:.*]]: 175 ; CHECK: ceb %f0, 0(%r2) 176 ; CHECK-NEXT: jnl .L[[LABEL]] 177 br label %loop 178 loop: 179 %val = load volatile float *%src 180 %cond = fcmp uge float %target, %val 181 br i1 %cond, label %loop, label %exit 182 exit: 183 ret void 184 } 185 186 ; "jno" == "jump if no overflow", which corresponds to "jump if ordered" 187 ; rather than "jump if not ordered" after a floating-point comparison. 188 define void @f13(float *%src, float %target) { 189 ; CHECK-LABEL: f13: 190 ; CHECK: .cfi_startproc 191 ; CHECK: .L[[LABEL:.*]]: 192 ; CHECK: ceb %f0, 0(%r2) 193 ; CHECK-NEXT: jno .L[[LABEL]] 194 br label %loop 195 loop: 196 %val = load volatile float *%src 197 %cond = fcmp ord float %target, %val 198 br i1 %cond, label %loop, label %exit 199 exit: 200 ret void 201 } 202 203 ; "jo" == "jump if overflow", which corresponds to "jump if not ordered" 204 ; rather than "jump if ordered" after a floating-point comparison. 205 define void @f14(float *%src, float %target) { 206 ; CHECK-LABEL: f14: 207 ; CHECK: .cfi_startproc 208 ; CHECK: .L[[LABEL:.*]]: 209 ; CHECK: ceb %f0, 0(%r2) 210 ; CHECK-NEXT: jo .L[[LABEL]] 211 br label %loop 212 loop: 213 %val = load volatile float *%src 214 %cond = fcmp uno float %target, %val 215 br i1 %cond, label %loop, label %exit 216 exit: 217 ret void 218 } 219