| OLD | NEW |
| 1 ; This tries to be a comprehensive test of f32 and f64 compare operations. | 1 ; This tries to be a comprehensive test of f32 and f64 compare operations. |
| 2 ; The CHECK lines are only checking for basic instruction patterns | 2 ; The CHECK lines are only checking for basic instruction patterns |
| 3 ; that should be present regardless of the optimization level, so | 3 ; that should be present regardless of the optimization level, so |
| 4 ; there are no special OPTM1 match lines. | 4 ; there are no special OPTM1 match lines. |
| 5 | 5 |
| 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ | 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ |
| 7 ; RUN: -allow-externally-defined-symbols | FileCheck %s | 7 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
| 8 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ | 8 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ |
| 9 ; RUN: -allow-externally-defined-symbols | FileCheck %s | 9 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
| 10 | 10 |
| 11 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ | 11 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ |
| 12 ; RUN: --target arm32 -i %s --args -O2 --skip-unimplemented \ | 12 ; RUN: --target arm32 -i %s --args -O2 \ |
| 13 ; RUN: -allow-externally-defined-symbols \ | 13 ; RUN: -allow-externally-defined-symbols \ |
| 14 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ | 14 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ |
| 15 ; RUN: --check-prefix=ARM32 | 15 ; RUN: --check-prefix=ARM32 --check-prefix=ARM32-O2 |
| 16 | 16 |
| 17 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ | 17 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ |
| 18 ; RUN: --target arm32 -i %s --args -Om1 --skip-unimplemented \ | 18 ; RUN: --target arm32 -i %s --args -Om1 \ |
| 19 ; RUN: -allow-externally-defined-symbols \ | 19 ; RUN: -allow-externally-defined-symbols \ |
| 20 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ | 20 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ |
| 21 ; RUN: --check-prefix=ARM32 | 21 ; RUN: --check-prefix=ARM32 --check-prefix=ARM32-OM1 |
| 22 | 22 |
| 23 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { | 23 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { |
| 24 entry: | 24 entry: |
| 25 %cmp = fcmp oeq float %a, %b | 25 %cmp = fcmp oeq float %a, %b |
| 26 br i1 %cmp, label %if.then, label %if.end | 26 br i1 %cmp, label %if.then, label %if.end |
| 27 | 27 |
| 28 if.then: ; preds = %entry | 28 if.then: ; preds = %entry |
| 29 call void @func() | 29 call void @func() |
| 30 br label %if.end | 30 br label %if.end |
| 31 | 31 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 44 ; CHECK: ucomiss | 44 ; CHECK: ucomiss |
| 45 ; CHECK: jne | 45 ; CHECK: jne |
| 46 ; CHECK-NEXT: jp | 46 ; CHECK-NEXT: jp |
| 47 ; CHECK: call {{.*}} R_{{.*}} func | 47 ; CHECK: call {{.*}} R_{{.*}} func |
| 48 ; CHECK: ucomisd | 48 ; CHECK: ucomisd |
| 49 ; CHECK: jne | 49 ; CHECK: jne |
| 50 ; CHECK-NEXT: jp | 50 ; CHECK-NEXT: jp |
| 51 ; CHECK: call {{.*}} R_{{.*}} func | 51 ; CHECK: call {{.*}} R_{{.*}} func |
| 52 ; ARM32-LABEL: fcmpEq | 52 ; ARM32-LABEL: fcmpEq |
| 53 ; ARM32: vcmp.f32 | 53 ; ARM32: vcmp.f32 |
| 54 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 55 ; ARM32: vmrs | 54 ; ARM32: vmrs |
| 56 ; ARM32: moveq [[R0]], #1 | 55 ; ARM32-OM1: movne [[R0:r[0-9]+]], #0 |
| 56 ; ARM32-OM1: moveq [[R0]], #1 |
| 57 ; ARM32-O2: bne |
| 58 ; ARM32: bl func |
| 57 ; ARM32: vcmp.f64 | 59 ; ARM32: vcmp.f64 |
| 58 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 59 ; ARM32: vmrs | 60 ; ARM32: vmrs |
| 60 ; ARM32: moveq [[R1]], #1 | 61 ; ARM32-OM1: movne [[R1:r[0-9]+]], #0 |
| 62 ; ARM32-OM1: moveq [[R1]], #1 |
| 63 ; ARM32-O2: bne |
| 61 | 64 |
| 62 declare void @func() | 65 declare void @func() |
| 63 | 66 |
| 64 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { | 67 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { |
| 65 entry: | 68 entry: |
| 66 %cmp = fcmp une float %a, %b | 69 %cmp = fcmp une float %a, %b |
| 67 br i1 %cmp, label %if.then, label %if.end | 70 br i1 %cmp, label %if.then, label %if.end |
| 68 | 71 |
| 69 if.then: ; preds = %entry | 72 if.then: ; preds = %entry |
| 70 call void @func() | 73 call void @func() |
| (...skipping 14 matching lines...) Expand all Loading... |
| 85 ; CHECK: ucomiss | 88 ; CHECK: ucomiss |
| 86 ; CHECK: jne | 89 ; CHECK: jne |
| 87 ; CHECK-NEXT: jp | 90 ; CHECK-NEXT: jp |
| 88 ; CHECK: call {{.*}} R_{{.*}} func | 91 ; CHECK: call {{.*}} R_{{.*}} func |
| 89 ; CHECK: ucomisd | 92 ; CHECK: ucomisd |
| 90 ; CHECK: jne | 93 ; CHECK: jne |
| 91 ; CHECK-NEXT: jp | 94 ; CHECK-NEXT: jp |
| 92 ; CHECK: call {{.*}} R_{{.*}} func | 95 ; CHECK: call {{.*}} R_{{.*}} func |
| 93 ; ARM32-LABEL: fcmpNe | 96 ; ARM32-LABEL: fcmpNe |
| 94 ; ARM32: vcmp.f32 | 97 ; ARM32: vcmp.f32 |
| 95 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 96 ; ARM32: vmrs | 98 ; ARM32: vmrs |
| 97 ; ARM32: movne [[R0]], #1 | 99 ; ARM32-OM1: moveq [[R0:r[0-9]+]], #0 |
| 100 ; ARM32-OM1: movne [[R0]], #1 |
| 101 ; ARM32-O2: beq |
| 98 ; ARM32: vcmp.f64 | 102 ; ARM32: vcmp.f64 |
| 99 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 100 ; ARM32: vmrs | 103 ; ARM32: vmrs |
| 101 ; ARM32: movne [[R1]], #1 | 104 ; ARM32-OM1: moveq [[R1:r[0-9]+]], #0 |
| 105 ; ARM32-OM1: movne [[R1]], #1 |
| 106 ; ARM32-O2: beq |
| 102 | 107 |
| 103 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | 108 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { |
| 104 entry: | 109 entry: |
| 105 %cmp = fcmp ogt float %a, %b | 110 %cmp = fcmp ogt float %a, %b |
| 106 br i1 %cmp, label %if.then, label %if.end | 111 br i1 %cmp, label %if.then, label %if.end |
| 107 | 112 |
| 108 if.then: ; preds = %entry | 113 if.then: ; preds = %entry |
| 109 call void @func() | 114 call void @func() |
| 110 br label %if.end | 115 br label %if.end |
| 111 | 116 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 122 } | 127 } |
| 123 ; CHECK-LABEL: fcmpGt | 128 ; CHECK-LABEL: fcmpGt |
| 124 ; CHECK: ucomiss | 129 ; CHECK: ucomiss |
| 125 ; CHECK: seta | 130 ; CHECK: seta |
| 126 ; CHECK: call {{.*}} R_{{.*}} func | 131 ; CHECK: call {{.*}} R_{{.*}} func |
| 127 ; CHECK: ucomisd | 132 ; CHECK: ucomisd |
| 128 ; CHECK: seta | 133 ; CHECK: seta |
| 129 ; CHECK: call {{.*}} R_{{.*}} func | 134 ; CHECK: call {{.*}} R_{{.*}} func |
| 130 ; ARM32-LABEL: fcmpGt | 135 ; ARM32-LABEL: fcmpGt |
| 131 ; ARM32: vcmp.f32 | 136 ; ARM32: vcmp.f32 |
| 132 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 133 ; ARM32: vmrs | 137 ; ARM32: vmrs |
| 134 ; ARM32: movgt [[R0]], #1 | 138 ; ARM32-OM1: movle [[R0:r[0-9]+]], #0 |
| 139 ; ARM32-OM1: movgt [[R0]], #1 |
| 140 ; ARM32-O2: ble |
| 135 ; ARM32: vcmp.f64 | 141 ; ARM32: vcmp.f64 |
| 136 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 137 ; ARM32: vmrs | 142 ; ARM32: vmrs |
| 138 ; ARM32: movgt [[R1]], #1 | 143 ; ARM32-OM1: movle [[R1:r[0-9]+]], #0 |
| 144 ; ARM32-OM1: movgt [[R1]], #1 |
| 145 ; ARM32-O2: ble |
| 139 | 146 |
| 140 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | 147 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { |
| 141 entry: | 148 entry: |
| 142 %cmp = fcmp ult float %a, %b | 149 %cmp = fcmp ult float %a, %b |
| 143 br i1 %cmp, label %if.end, label %if.then | 150 br i1 %cmp, label %if.end, label %if.then |
| 144 | 151 |
| 145 if.then: ; preds = %entry | 152 if.then: ; preds = %entry |
| 146 call void @func() | 153 call void @func() |
| 147 br label %if.end | 154 br label %if.end |
| 148 | 155 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 159 } | 166 } |
| 160 ; CHECK-LABEL: fcmpGe | 167 ; CHECK-LABEL: fcmpGe |
| 161 ; CHECK: ucomiss | 168 ; CHECK: ucomiss |
| 162 ; CHECK: setb | 169 ; CHECK: setb |
| 163 ; CHECK: call {{.*}} R_{{.*}} func | 170 ; CHECK: call {{.*}} R_{{.*}} func |
| 164 ; CHECK: ucomisd | 171 ; CHECK: ucomisd |
| 165 ; CHECK: setb | 172 ; CHECK: setb |
| 166 ; CHECK: call {{.*}} R_{{.*}} func | 173 ; CHECK: call {{.*}} R_{{.*}} func |
| 167 ; ARM32-LABEL: fcmpGe | 174 ; ARM32-LABEL: fcmpGe |
| 168 ; ARM32: vcmp.f32 | 175 ; ARM32: vcmp.f32 |
| 169 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 170 ; ARM32: vmrs | 176 ; ARM32: vmrs |
| 171 ; ARM32: movlt [[R0]], #1 | 177 ; ARM32-OM1: movge [[R0:r[0-9]+]], #0 |
| 178 ; ARM32-OM1: movlt [[R0]], #1 |
| 179 ; ARM32-O2: blt |
| 172 ; ARM32: vcmp.f64 | 180 ; ARM32: vcmp.f64 |
| 173 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 174 ; ARM32: vmrs | 181 ; ARM32: vmrs |
| 175 ; ARM32: movlt [[R1]], #1 | 182 ; ARM32-OM1: movge [[R1:r[0-9]+]], #0 |
| 183 ; ARM32-OM1: movlt [[R1]], #1 |
| 184 ; ARM32-O2: blt |
| 176 | 185 |
| 177 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | 186 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { |
| 178 entry: | 187 entry: |
| 179 %cmp = fcmp olt float %a, %b | 188 %cmp = fcmp olt float %a, %b |
| 180 br i1 %cmp, label %if.then, label %if.end | 189 br i1 %cmp, label %if.then, label %if.end |
| 181 | 190 |
| 182 if.then: ; preds = %entry | 191 if.then: ; preds = %entry |
| 183 call void @func() | 192 call void @func() |
| 184 br label %if.end | 193 br label %if.end |
| 185 | 194 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 196 } | 205 } |
| 197 ; CHECK-LABEL: fcmpLt | 206 ; CHECK-LABEL: fcmpLt |
| 198 ; CHECK: ucomiss | 207 ; CHECK: ucomiss |
| 199 ; CHECK: seta | 208 ; CHECK: seta |
| 200 ; CHECK: call {{.*}} R_{{.*}} func | 209 ; CHECK: call {{.*}} R_{{.*}} func |
| 201 ; CHECK: ucomisd | 210 ; CHECK: ucomisd |
| 202 ; CHECK: seta | 211 ; CHECK: seta |
| 203 ; CHECK: call {{.*}} R_{{.*}} func | 212 ; CHECK: call {{.*}} R_{{.*}} func |
| 204 ; ARM32-LABEL: fcmpLt | 213 ; ARM32-LABEL: fcmpLt |
| 205 ; ARM32: vcmp.f32 | 214 ; ARM32: vcmp.f32 |
| 206 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 207 ; ARM32: vmrs | 215 ; ARM32: vmrs |
| 208 ; ARM32: movmi [[R0]], #1 | 216 ; ARM32-OM1: movpl [[R0:r[0-9]+]], #0 |
| 217 ; ARM32-OM1: movmi [[R0]], #1 |
| 218 ; ARM32-O2: bpl |
| 209 ; ARM32: vcmp.f64 | 219 ; ARM32: vcmp.f64 |
| 210 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 211 ; ARM32: vmrs | 220 ; ARM32: vmrs |
| 212 ; ARM32: movmi [[R1]], #1 | 221 ; ARM32-OM1: movpl [[R1:r[0-9]+]], #0 |
| 222 ; ARM32-OM1: movmi [[R1]], #1 |
| 223 ; ARM32-O2: bpl |
| 213 | 224 |
| 214 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | 225 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { |
| 215 entry: | 226 entry: |
| 216 %cmp = fcmp ugt float %a, %b | 227 %cmp = fcmp ugt float %a, %b |
| 217 br i1 %cmp, label %if.end, label %if.then | 228 br i1 %cmp, label %if.end, label %if.then |
| 218 | 229 |
| 219 if.then: ; preds = %entry | 230 if.then: ; preds = %entry |
| 220 call void @func() | 231 call void @func() |
| 221 br label %if.end | 232 br label %if.end |
| 222 | 233 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 233 } | 244 } |
| 234 ; CHECK-LABEL: fcmpLe | 245 ; CHECK-LABEL: fcmpLe |
| 235 ; CHECK: ucomiss | 246 ; CHECK: ucomiss |
| 236 ; CHECK: setb | 247 ; CHECK: setb |
| 237 ; CHECK: call {{.*}} R_{{.*}} func | 248 ; CHECK: call {{.*}} R_{{.*}} func |
| 238 ; CHECK: ucomisd | 249 ; CHECK: ucomisd |
| 239 ; CHECK: setb | 250 ; CHECK: setb |
| 240 ; CHECK: call {{.*}} R_{{.*}} func | 251 ; CHECK: call {{.*}} R_{{.*}} func |
| 241 ; ARM32-LABEL: fcmpLe | 252 ; ARM32-LABEL: fcmpLe |
| 242 ; ARM32: vcmp.f32 | 253 ; ARM32: vcmp.f32 |
| 243 ; ARM32: mov [[R0:r[0-9]+]], #0 | |
| 244 ; ARM32: vmrs | 254 ; ARM32: vmrs |
| 245 ; ARM32: movhi [[R0]], #1 | 255 ; ARM32-OM1: movls [[R0:r[0-9]+]], #0 |
| 256 ; ARM32-OM1: movhi [[R0]], #1 |
| 257 ; ARM32-O2: bhi |
| 246 ; ARM32: vcmp.f64 | 258 ; ARM32: vcmp.f64 |
| 247 ; ARM32: mov [[R1:r[0-9]+]], #0 | |
| 248 ; ARM32: vmrs | 259 ; ARM32: vmrs |
| 249 ; ARM32: movhi [[R1]], #1 | 260 ; ARM32-OM1: movls [[R1:r[0-9]+]], #0 |
| 261 ; ARM32-OM1: movhi [[R1]], #1 |
| 262 ; ARM32-O2: bhi |
| 250 | 263 |
| 251 define internal i32 @fcmpFalseFloat(float %a, float %b) { | 264 define internal i32 @fcmpFalseFloat(float %a, float %b) { |
| 252 entry: | 265 entry: |
| 253 %cmp = fcmp false float %a, %b | 266 %cmp = fcmp false float %a, %b |
| 254 %cmp.ret_ext = zext i1 %cmp to i32 | 267 %cmp.ret_ext = zext i1 %cmp to i32 |
| 255 ret i32 %cmp.ret_ext | 268 ret i32 %cmp.ret_ext |
| 256 } | 269 } |
| 257 ; CHECK-LABEL: fcmpFalseFloat | 270 ; CHECK-LABEL: fcmpFalseFloat |
| 258 ; CHECK: mov {{.*}},0x0 | 271 ; CHECK: mov {{.*}},0x0 |
| 259 ; ARM32-LABEL: fcmpFalseFloat | 272 ; ARM32-LABEL: fcmpFalseFloat |
| 260 ; ARM32: vcmp.f32 | |
| 261 ; ARM32: mov [[R:r[0-9]+]], #0 | 273 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 262 | 274 |
| 263 define internal i32 @fcmpFalseDouble(double %a, double %b) { | 275 define internal i32 @fcmpFalseDouble(double %a, double %b) { |
| 264 entry: | 276 entry: |
| 265 %cmp = fcmp false double %a, %b | 277 %cmp = fcmp false double %a, %b |
| 266 %cmp.ret_ext = zext i1 %cmp to i32 | 278 %cmp.ret_ext = zext i1 %cmp to i32 |
| 267 ret i32 %cmp.ret_ext | 279 ret i32 %cmp.ret_ext |
| 268 } | 280 } |
| 269 ; CHECK-LABEL: fcmpFalseDouble | 281 ; CHECK-LABEL: fcmpFalseDouble |
| 270 ; CHECK: mov {{.*}},0x0 | 282 ; CHECK: mov {{.*}},0x0 |
| 271 ; ARM32-LABEL: fcmpFalseDouble | 283 ; ARM32-LABEL: fcmpFalseDouble |
| 272 ; ARM32: vcmp.f64 | |
| 273 ; ARM32: mov [[R:r[0-9]+]], #0 | 284 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 274 | 285 |
| 275 define internal i32 @fcmpOeqFloat(float %a, float %b) { | 286 define internal i32 @fcmpOeqFloat(float %a, float %b) { |
| 276 entry: | 287 entry: |
| 277 %cmp = fcmp oeq float %a, %b | 288 %cmp = fcmp oeq float %a, %b |
| 278 %cmp.ret_ext = zext i1 %cmp to i32 | 289 %cmp.ret_ext = zext i1 %cmp to i32 |
| 279 ret i32 %cmp.ret_ext | 290 ret i32 %cmp.ret_ext |
| 280 } | 291 } |
| 281 ; CHECK-LABEL: fcmpOeqFloat | 292 ; CHECK-LABEL: fcmpOeqFloat |
| 282 ; CHECK: ucomiss | 293 ; CHECK: ucomiss |
| 283 ; CHECK: jne | 294 ; CHECK: jne |
| 284 ; CHECK: jp | 295 ; CHECK: jp |
| 285 ; ARM32-LABEL: fcmpOeqFloat | 296 ; ARM32-LABEL: fcmpOeqFloat |
| 286 ; ARM32: vcmp.f32 | 297 ; ARM32: vcmp.f32 |
| 287 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 288 ; ARM32: vmrs | 298 ; ARM32: vmrs |
| 299 ; ARM32: movne [[R:r[0-9]+]], #0 |
| 289 ; ARM32: moveq [[R]], #1 | 300 ; ARM32: moveq [[R]], #1 |
| 290 | 301 |
| 291 define internal i32 @fcmpOeqDouble(double %a, double %b) { | 302 define internal i32 @fcmpOeqDouble(double %a, double %b) { |
| 292 entry: | 303 entry: |
| 293 %cmp = fcmp oeq double %a, %b | 304 %cmp = fcmp oeq double %a, %b |
| 294 %cmp.ret_ext = zext i1 %cmp to i32 | 305 %cmp.ret_ext = zext i1 %cmp to i32 |
| 295 ret i32 %cmp.ret_ext | 306 ret i32 %cmp.ret_ext |
| 296 } | 307 } |
| 297 ; CHECK-LABEL: fcmpOeqDouble | 308 ; CHECK-LABEL: fcmpOeqDouble |
| 298 ; CHECK: ucomisd | 309 ; CHECK: ucomisd |
| 299 ; CHECK: jne | 310 ; CHECK: jne |
| 300 ; CHECK: jp | 311 ; CHECK: jp |
| 301 ; ARM32-LABEL: fcmpOeqDouble | 312 ; ARM32-LABEL: fcmpOeqDouble |
| 302 ; ARM32: vcmp.f64 | 313 ; ARM32: vcmp.f64 |
| 303 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 304 ; ARM32: vmrs | 314 ; ARM32: vmrs |
| 315 ; ARM32: movne [[R:r[0-9]+]], #0 |
| 305 ; ARM32: moveq [[R]], #1 | 316 ; ARM32: moveq [[R]], #1 |
| 306 | 317 |
| 307 define internal i32 @fcmpOgtFloat(float %a, float %b) { | 318 define internal i32 @fcmpOgtFloat(float %a, float %b) { |
| 308 entry: | 319 entry: |
| 309 %cmp = fcmp ogt float %a, %b | 320 %cmp = fcmp ogt float %a, %b |
| 310 %cmp.ret_ext = zext i1 %cmp to i32 | 321 %cmp.ret_ext = zext i1 %cmp to i32 |
| 311 ret i32 %cmp.ret_ext | 322 ret i32 %cmp.ret_ext |
| 312 } | 323 } |
| 313 ; CHECK-LABEL: fcmpOgtFloat | 324 ; CHECK-LABEL: fcmpOgtFloat |
| 314 ; CHECK: ucomiss | 325 ; CHECK: ucomiss |
| 315 ; CHECK: seta | 326 ; CHECK: seta |
| 316 ; ARM32-LABEL: fcmpOgtFloat | 327 ; ARM32-LABEL: fcmpOgtFloat |
| 317 ; ARM32: vcmp.f32 | 328 ; ARM32: vcmp.f32 |
| 318 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 319 ; ARM32: vmrs | 329 ; ARM32: vmrs |
| 330 ; ARM32: movle [[R:r[0-9]+]], #0 |
| 320 ; ARM32: movgt [[R]], #1 | 331 ; ARM32: movgt [[R]], #1 |
| 321 | 332 |
| 322 define internal i32 @fcmpOgtDouble(double %a, double %b) { | 333 define internal i32 @fcmpOgtDouble(double %a, double %b) { |
| 323 entry: | 334 entry: |
| 324 %cmp = fcmp ogt double %a, %b | 335 %cmp = fcmp ogt double %a, %b |
| 325 %cmp.ret_ext = zext i1 %cmp to i32 | 336 %cmp.ret_ext = zext i1 %cmp to i32 |
| 326 ret i32 %cmp.ret_ext | 337 ret i32 %cmp.ret_ext |
| 327 } | 338 } |
| 328 ; CHECK-LABEL: fcmpOgtDouble | 339 ; CHECK-LABEL: fcmpOgtDouble |
| 329 ; CHECK: ucomisd | 340 ; CHECK: ucomisd |
| 330 ; CHECK: seta | 341 ; CHECK: seta |
| 331 ; ARM32-LABEL: fcmpOgtDouble | 342 ; ARM32-LABEL: fcmpOgtDouble |
| 332 ; ARM32: vcmp.f64 | 343 ; ARM32: vcmp.f64 |
| 333 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 334 ; ARM32: vmrs | 344 ; ARM32: vmrs |
| 345 ; ARM32: movle [[R:r[0-9]+]], #0 |
| 335 ; ARM32: movgt [[R]], #1 | 346 ; ARM32: movgt [[R]], #1 |
| 336 | 347 |
| 337 define internal i32 @fcmpOgeFloat(float %a, float %b) { | 348 define internal i32 @fcmpOgeFloat(float %a, float %b) { |
| 338 entry: | 349 entry: |
| 339 %cmp = fcmp oge float %a, %b | 350 %cmp = fcmp oge float %a, %b |
| 340 %cmp.ret_ext = zext i1 %cmp to i32 | 351 %cmp.ret_ext = zext i1 %cmp to i32 |
| 341 ret i32 %cmp.ret_ext | 352 ret i32 %cmp.ret_ext |
| 342 } | 353 } |
| 343 ; CHECK-LABEL: fcmpOgeFloat | 354 ; CHECK-LABEL: fcmpOgeFloat |
| 344 ; CHECK: ucomiss | 355 ; CHECK: ucomiss |
| 345 ; CHECK: setae | 356 ; CHECK: setae |
| 346 ; ARM32-LABEL: fcmpOgeFloat | 357 ; ARM32-LABEL: fcmpOgeFloat |
| 347 ; ARM32: vcmp.f32 | 358 ; ARM32: vcmp.f32 |
| 348 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 349 ; ARM32: vmrs | 359 ; ARM32: vmrs |
| 360 ; ARM32: movlt [[R:r[0-9]+]], #0 |
| 350 ; ARM32: movge [[R]], #1 | 361 ; ARM32: movge [[R]], #1 |
| 351 | 362 |
| 352 define internal i32 @fcmpOgeDouble(double %a, double %b) { | 363 define internal i32 @fcmpOgeDouble(double %a, double %b) { |
| 353 entry: | 364 entry: |
| 354 %cmp = fcmp oge double %a, %b | 365 %cmp = fcmp oge double %a, %b |
| 355 %cmp.ret_ext = zext i1 %cmp to i32 | 366 %cmp.ret_ext = zext i1 %cmp to i32 |
| 356 ret i32 %cmp.ret_ext | 367 ret i32 %cmp.ret_ext |
| 357 } | 368 } |
| 358 ; CHECK-LABEL: fcmpOgeDouble | 369 ; CHECK-LABEL: fcmpOgeDouble |
| 359 ; CHECK: ucomisd | 370 ; CHECK: ucomisd |
| 360 ; CHECK: setae | 371 ; CHECK: setae |
| 361 ; ARM32-LABEL: fcmpOgeDouble | 372 ; ARM32-LABEL: fcmpOgeDouble |
| 362 ; ARM32: vcmp.f64 | 373 ; ARM32: vcmp.f64 |
| 363 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 364 ; ARM32: vmrs | 374 ; ARM32: vmrs |
| 375 ; ARM32: movlt [[R:r[0-9]+]], #0 |
| 365 ; ARM32: movge [[R]], #1 | 376 ; ARM32: movge [[R]], #1 |
| 366 | 377 |
| 367 define internal i32 @fcmpOltFloat(float %a, float %b) { | 378 define internal i32 @fcmpOltFloat(float %a, float %b) { |
| 368 entry: | 379 entry: |
| 369 %cmp = fcmp olt float %a, %b | 380 %cmp = fcmp olt float %a, %b |
| 370 %cmp.ret_ext = zext i1 %cmp to i32 | 381 %cmp.ret_ext = zext i1 %cmp to i32 |
| 371 ret i32 %cmp.ret_ext | 382 ret i32 %cmp.ret_ext |
| 372 } | 383 } |
| 373 ; CHECK-LABEL: fcmpOltFloat | 384 ; CHECK-LABEL: fcmpOltFloat |
| 374 ; CHECK: ucomiss | 385 ; CHECK: ucomiss |
| 375 ; CHECK: seta | 386 ; CHECK: seta |
| 376 ; ARM32-LABEL: fcmpOltFloat | 387 ; ARM32-LABEL: fcmpOltFloat |
| 377 ; ARM32: vcmp.f32 | 388 ; ARM32: vcmp.f32 |
| 378 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 379 ; ARM32: vmrs | 389 ; ARM32: vmrs |
| 390 ; ARM32: movpl [[R:r[0-9]+]], #0 |
| 380 ; ARM32: movmi [[R]], #1 | 391 ; ARM32: movmi [[R]], #1 |
| 381 | 392 |
| 382 define internal i32 @fcmpOltDouble(double %a, double %b) { | 393 define internal i32 @fcmpOltDouble(double %a, double %b) { |
| 383 entry: | 394 entry: |
| 384 %cmp = fcmp olt double %a, %b | 395 %cmp = fcmp olt double %a, %b |
| 385 %cmp.ret_ext = zext i1 %cmp to i32 | 396 %cmp.ret_ext = zext i1 %cmp to i32 |
| 386 ret i32 %cmp.ret_ext | 397 ret i32 %cmp.ret_ext |
| 387 } | 398 } |
| 388 ; CHECK-LABEL: fcmpOltDouble | 399 ; CHECK-LABEL: fcmpOltDouble |
| 389 ; CHECK: ucomisd | 400 ; CHECK: ucomisd |
| 390 ; CHECK: seta | 401 ; CHECK: seta |
| 391 ; ARM32-LABEL: fcmpOltDouble | 402 ; ARM32-LABEL: fcmpOltDouble |
| 392 ; ARM32: vcmp.f64 | 403 ; ARM32: vcmp.f64 |
| 393 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 394 ; ARM32: vmrs | 404 ; ARM32: vmrs |
| 405 ; ARM32: movpl [[R:r[0-9]+]], #0 |
| 395 ; ARM32: movmi [[R]], #1 | 406 ; ARM32: movmi [[R]], #1 |
| 396 | 407 |
| 397 define internal i32 @fcmpOleFloat(float %a, float %b) { | 408 define internal i32 @fcmpOleFloat(float %a, float %b) { |
| 398 entry: | 409 entry: |
| 399 %cmp = fcmp ole float %a, %b | 410 %cmp = fcmp ole float %a, %b |
| 400 %cmp.ret_ext = zext i1 %cmp to i32 | 411 %cmp.ret_ext = zext i1 %cmp to i32 |
| 401 ret i32 %cmp.ret_ext | 412 ret i32 %cmp.ret_ext |
| 402 } | 413 } |
| 403 ; CHECK-LABEL: fcmpOleFloat | 414 ; CHECK-LABEL: fcmpOleFloat |
| 404 ; CHECK: ucomiss | 415 ; CHECK: ucomiss |
| 405 ; CHECK: setae | 416 ; CHECK: setae |
| 406 ; ARM32-LABEL: fcmpOleFloat | 417 ; ARM32-LABEL: fcmpOleFloat |
| 407 ; ARM32: vcmp.f32 | 418 ; ARM32: vcmp.f32 |
| 408 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 409 ; ARM32: vmrs | 419 ; ARM32: vmrs |
| 420 ; ARM32: movhi [[R:r[0-9]+]], #0 |
| 410 ; ARM32: movls [[R]], #1 | 421 ; ARM32: movls [[R]], #1 |
| 411 | 422 |
| 412 define internal i32 @fcmpOleDouble(double %a, double %b) { | 423 define internal i32 @fcmpOleDouble(double %a, double %b) { |
| 413 entry: | 424 entry: |
| 414 %cmp = fcmp ole double %a, %b | 425 %cmp = fcmp ole double %a, %b |
| 415 %cmp.ret_ext = zext i1 %cmp to i32 | 426 %cmp.ret_ext = zext i1 %cmp to i32 |
| 416 ret i32 %cmp.ret_ext | 427 ret i32 %cmp.ret_ext |
| 417 } | 428 } |
| 418 ; CHECK-LABEL: fcmpOleDouble | 429 ; CHECK-LABEL: fcmpOleDouble |
| 419 ; CHECK: ucomisd | 430 ; CHECK: ucomisd |
| 420 ; CHECK: setae | 431 ; CHECK: setae |
| 421 ; ARM32-LABEL: fcmpOleDouble | 432 ; ARM32-LABEL: fcmpOleDouble |
| 422 ; ARM32: vcmp.f64 | 433 ; ARM32: vcmp.f64 |
| 423 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 424 ; ARM32: vmrs | 434 ; ARM32: vmrs |
| 435 ; ARM32: movhi [[R:r[0-9]+]], #0 |
| 425 ; ARM32: movls [[R]], #1 | 436 ; ARM32: movls [[R]], #1 |
| 426 | 437 |
| 427 define internal i32 @fcmpOneFloat(float %a, float %b) { | 438 define internal i32 @fcmpOneFloat(float %a, float %b) { |
| 428 entry: | 439 entry: |
| 429 %cmp = fcmp one float %a, %b | 440 %cmp = fcmp one float %a, %b |
| 430 %cmp.ret_ext = zext i1 %cmp to i32 | 441 %cmp.ret_ext = zext i1 %cmp to i32 |
| 431 ret i32 %cmp.ret_ext | 442 ret i32 %cmp.ret_ext |
| 432 } | 443 } |
| 433 ; CHECK-LABEL: fcmpOneFloat | 444 ; CHECK-LABEL: fcmpOneFloat |
| 434 ; CHECK: ucomiss | 445 ; CHECK: ucomiss |
| 435 ; CHECK: setne | 446 ; CHECK: setne |
| 436 ; ARM32-LABEL: fcmpOneFloat | 447 ; ARM32-LABEL: fcmpOneFloat |
| 437 ; ARM32: vcmp.f32 | 448 ; ARM32: vcmp.f32 |
| 449 ; ARM32: vmrs |
| 438 ; ARM32: mov [[R:r[0-9]+]], #0 | 450 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 439 ; ARM32: vmrs | |
| 440 ; ARM32: movmi [[R]], #1 | 451 ; ARM32: movmi [[R]], #1 |
| 441 ; ARM32: movgt [[R]], #1 | 452 ; ARM32: movgt [[R]], #1 |
| 442 | 453 |
| 443 define internal i32 @fcmpOneDouble(double %a, double %b) { | 454 define internal i32 @fcmpOneDouble(double %a, double %b) { |
| 444 entry: | 455 entry: |
| 445 %cmp = fcmp one double %a, %b | 456 %cmp = fcmp one double %a, %b |
| 446 %cmp.ret_ext = zext i1 %cmp to i32 | 457 %cmp.ret_ext = zext i1 %cmp to i32 |
| 447 ret i32 %cmp.ret_ext | 458 ret i32 %cmp.ret_ext |
| 448 } | 459 } |
| 449 ; CHECK-LABEL: fcmpOneDouble | 460 ; CHECK-LABEL: fcmpOneDouble |
| 450 ; CHECK: ucomisd | 461 ; CHECK: ucomisd |
| 451 ; CHECK: setne | 462 ; CHECK: setne |
| 452 ; ARM32-LABEL: fcmpOneDouble | 463 ; ARM32-LABEL: fcmpOneDouble |
| 453 ; ARM32: vcmp.f64 | 464 ; ARM32: vcmp.f64 |
| 465 ; ARM32: vmrs |
| 454 ; ARM32: mov [[R:r[0-9]+]], #0 | 466 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 455 ; ARM32: vmrs | |
| 456 ; ARM32: movmi [[R]], #1 | 467 ; ARM32: movmi [[R]], #1 |
| 457 ; ARM32: movgt [[R]], #1 | 468 ; ARM32: movgt [[R]], #1 |
| 458 | 469 |
| 459 define internal i32 @fcmpOrdFloat(float %a, float %b) { | 470 define internal i32 @fcmpOrdFloat(float %a, float %b) { |
| 460 entry: | 471 entry: |
| 461 %cmp = fcmp ord float %a, %b | 472 %cmp = fcmp ord float %a, %b |
| 462 %cmp.ret_ext = zext i1 %cmp to i32 | 473 %cmp.ret_ext = zext i1 %cmp to i32 |
| 463 ret i32 %cmp.ret_ext | 474 ret i32 %cmp.ret_ext |
| 464 } | 475 } |
| 465 ; CHECK-LABEL: fcmpOrdFloat | 476 ; CHECK-LABEL: fcmpOrdFloat |
| 466 ; CHECK: ucomiss | 477 ; CHECK: ucomiss |
| 467 ; CHECK: setnp | 478 ; CHECK: setnp |
| 468 ; ARM32-LABEL: fcmpOrdFloat | 479 ; ARM32-LABEL: fcmpOrdFloat |
| 469 ; ARM32: vcmp.f32 | 480 ; ARM32: vcmp.f32 |
| 470 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 471 ; ARM32: vmrs | 481 ; ARM32: vmrs |
| 482 ; ARM32: movvs [[R:r[0-9]+]], #0 |
| 472 ; ARM32: movvc [[R]], #1 | 483 ; ARM32: movvc [[R]], #1 |
| 473 | 484 |
| 474 define internal i32 @fcmpOrdDouble(double %a, double %b) { | 485 define internal i32 @fcmpOrdDouble(double %a, double %b) { |
| 475 entry: | 486 entry: |
| 476 %cmp = fcmp ord double %a, %b | 487 %cmp = fcmp ord double %a, %b |
| 477 %cmp.ret_ext = zext i1 %cmp to i32 | 488 %cmp.ret_ext = zext i1 %cmp to i32 |
| 478 ret i32 %cmp.ret_ext | 489 ret i32 %cmp.ret_ext |
| 479 } | 490 } |
| 480 ; CHECK-LABEL: fcmpOrdDouble | 491 ; CHECK-LABEL: fcmpOrdDouble |
| 481 ; CHECK: ucomisd | 492 ; CHECK: ucomisd |
| 482 ; CHECK: setnp | 493 ; CHECK: setnp |
| 483 ; ARM32-LABEL: fcmpOrdDouble | 494 ; ARM32-LABEL: fcmpOrdDouble |
| 484 ; ARM32: vcmp.f64 | 495 ; ARM32: vcmp.f64 |
| 485 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 486 ; ARM32: vmrs | 496 ; ARM32: vmrs |
| 497 ; ARM32: movvs [[R:r[0-9]+]], #0 |
| 487 ; ARM32: movvc [[R]], #1 | 498 ; ARM32: movvc [[R]], #1 |
| 488 | 499 |
| 489 define internal i32 @fcmpUeqFloat(float %a, float %b) { | 500 define internal i32 @fcmpUeqFloat(float %a, float %b) { |
| 490 entry: | 501 entry: |
| 491 %cmp = fcmp ueq float %a, %b | 502 %cmp = fcmp ueq float %a, %b |
| 492 %cmp.ret_ext = zext i1 %cmp to i32 | 503 %cmp.ret_ext = zext i1 %cmp to i32 |
| 493 ret i32 %cmp.ret_ext | 504 ret i32 %cmp.ret_ext |
| 494 } | 505 } |
| 495 ; CHECK-LABEL: fcmpUeqFloat | 506 ; CHECK-LABEL: fcmpUeqFloat |
| 496 ; CHECK: ucomiss | 507 ; CHECK: ucomiss |
| 497 ; CHECK: sete | 508 ; CHECK: sete |
| 498 ; ARM32-LABEL: fcmpUeqFloat | 509 ; ARM32-LABEL: fcmpUeqFloat |
| 499 ; ARM32: vcmp.f32 | 510 ; ARM32: vcmp.f32 |
| 511 ; ARM32: vmrs |
| 500 ; ARM32: mov [[R:r[0-9]+]], #0 | 512 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 501 ; ARM32: vmrs | |
| 502 ; ARM32: moveq [[R]], #1 | 513 ; ARM32: moveq [[R]], #1 |
| 503 ; ARM32: movvs [[R]], #1 | 514 ; ARM32: movvs [[R]], #1 |
| 504 | 515 |
| 505 define internal i32 @fcmpUeqDouble(double %a, double %b) { | 516 define internal i32 @fcmpUeqDouble(double %a, double %b) { |
| 506 entry: | 517 entry: |
| 507 %cmp = fcmp ueq double %a, %b | 518 %cmp = fcmp ueq double %a, %b |
| 508 %cmp.ret_ext = zext i1 %cmp to i32 | 519 %cmp.ret_ext = zext i1 %cmp to i32 |
| 509 ret i32 %cmp.ret_ext | 520 ret i32 %cmp.ret_ext |
| 510 } | 521 } |
| 511 ; CHECK-LABEL: fcmpUeqDouble | 522 ; CHECK-LABEL: fcmpUeqDouble |
| 512 ; CHECK: ucomisd | 523 ; CHECK: ucomisd |
| 513 ; CHECK: sete | 524 ; CHECK: sete |
| 514 ; ARM32-LABEL: fcmpUeqDouble | 525 ; ARM32-LABEL: fcmpUeqDouble |
| 515 ; ARM32: vcmp.f64 | 526 ; ARM32: vcmp.f64 |
| 527 ; ARM32: vmrs |
| 516 ; ARM32: mov [[R:r[0-9]+]], #0 | 528 ; ARM32: mov [[R:r[0-9]+]], #0 |
| 517 ; ARM32: vmrs | |
| 518 ; ARM32: moveq [[R]], #1 | 529 ; ARM32: moveq [[R]], #1 |
| 519 ; ARM32: movvs [[R]], #1 | 530 ; ARM32: movvs [[R]], #1 |
| 520 | 531 |
| 521 define internal i32 @fcmpUgtFloat(float %a, float %b) { | 532 define internal i32 @fcmpUgtFloat(float %a, float %b) { |
| 522 entry: | 533 entry: |
| 523 %cmp = fcmp ugt float %a, %b | 534 %cmp = fcmp ugt float %a, %b |
| 524 %cmp.ret_ext = zext i1 %cmp to i32 | 535 %cmp.ret_ext = zext i1 %cmp to i32 |
| 525 ret i32 %cmp.ret_ext | 536 ret i32 %cmp.ret_ext |
| 526 } | 537 } |
| 527 ; CHECK-LABEL: fcmpUgtFloat | 538 ; CHECK-LABEL: fcmpUgtFloat |
| 528 ; CHECK: ucomiss | 539 ; CHECK: ucomiss |
| 529 ; CHECK: setb | 540 ; CHECK: setb |
| 530 ; ARM32-LABEL: fcmpUgtFloat | 541 ; ARM32-LABEL: fcmpUgtFloat |
| 531 ; ARM32: vcmp.f32 | 542 ; ARM32: vcmp.f32 |
| 532 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 533 ; ARM32: vmrs | 543 ; ARM32: vmrs |
| 544 ; ARM32: movls [[R:r[0-9]+]], #0 |
| 534 ; ARM32: movhi [[R]], #1 | 545 ; ARM32: movhi [[R]], #1 |
| 535 | 546 |
| 536 define internal i32 @fcmpUgtDouble(double %a, double %b) { | 547 define internal i32 @fcmpUgtDouble(double %a, double %b) { |
| 537 entry: | 548 entry: |
| 538 %cmp = fcmp ugt double %a, %b | 549 %cmp = fcmp ugt double %a, %b |
| 539 %cmp.ret_ext = zext i1 %cmp to i32 | 550 %cmp.ret_ext = zext i1 %cmp to i32 |
| 540 ret i32 %cmp.ret_ext | 551 ret i32 %cmp.ret_ext |
| 541 } | 552 } |
| 542 ; CHECK-LABEL: fcmpUgtDouble | 553 ; CHECK-LABEL: fcmpUgtDouble |
| 543 ; CHECK: ucomisd | 554 ; CHECK: ucomisd |
| 544 ; CHECK: setb | 555 ; CHECK: setb |
| 545 ; ARM32-LABEL: fcmpUgtDouble | 556 ; ARM32-LABEL: fcmpUgtDouble |
| 546 ; ARM32: vcmp.f64 | 557 ; ARM32: vcmp.f64 |
| 547 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 548 ; ARM32: vmrs | 558 ; ARM32: vmrs |
| 559 ; ARM32: movls [[R:r[0-9]+]], #0 |
| 549 ; ARM32: movhi [[R]], #1 | 560 ; ARM32: movhi [[R]], #1 |
| 550 | 561 |
| 551 define internal i32 @fcmpUgeFloat(float %a, float %b) { | 562 define internal i32 @fcmpUgeFloat(float %a, float %b) { |
| 552 entry: | 563 entry: |
| 553 %cmp = fcmp uge float %a, %b | 564 %cmp = fcmp uge float %a, %b |
| 554 %cmp.ret_ext = zext i1 %cmp to i32 | 565 %cmp.ret_ext = zext i1 %cmp to i32 |
| 555 ret i32 %cmp.ret_ext | 566 ret i32 %cmp.ret_ext |
| 556 } | 567 } |
| 557 ; CHECK-LABEL: fcmpUgeFloat | 568 ; CHECK-LABEL: fcmpUgeFloat |
| 558 ; CHECK: ucomiss | 569 ; CHECK: ucomiss |
| 559 ; CHECK: setbe | 570 ; CHECK: setbe |
| 560 ; ARM32-LABEL: fcmpUgeFloat | 571 ; ARM32-LABEL: fcmpUgeFloat |
| 561 ; ARM32: vcmp.f32 | 572 ; ARM32: vcmp.f32 |
| 562 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 563 ; ARM32: vmrs | 573 ; ARM32: vmrs |
| 574 ; ARM32: movmi [[R:r[0-9]+]], #0 |
| 564 ; ARM32: movpl [[R]], #1 | 575 ; ARM32: movpl [[R]], #1 |
| 565 | 576 |
| 566 define internal i32 @fcmpUgeDouble(double %a, double %b) { | 577 define internal i32 @fcmpUgeDouble(double %a, double %b) { |
| 567 entry: | 578 entry: |
| 568 %cmp = fcmp uge double %a, %b | 579 %cmp = fcmp uge double %a, %b |
| 569 %cmp.ret_ext = zext i1 %cmp to i32 | 580 %cmp.ret_ext = zext i1 %cmp to i32 |
| 570 ret i32 %cmp.ret_ext | 581 ret i32 %cmp.ret_ext |
| 571 } | 582 } |
| 572 ; CHECK-LABEL: fcmpUgeDouble | 583 ; CHECK-LABEL: fcmpUgeDouble |
| 573 ; CHECK: ucomisd | 584 ; CHECK: ucomisd |
| 574 ; CHECK: setbe | 585 ; CHECK: setbe |
| 575 ; ARM32-LABEL: fcmpUgeDouble | 586 ; ARM32-LABEL: fcmpUgeDouble |
| 576 ; ARM32: vcmp.f64 | 587 ; ARM32: vcmp.f64 |
| 577 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 578 ; ARM32: vmrs | 588 ; ARM32: vmrs |
| 589 ; ARM32: movmi [[R:r[0-9]+]], #0 |
| 579 ; ARM32: movpl [[R]], #1 | 590 ; ARM32: movpl [[R]], #1 |
| 580 | 591 |
| 581 define internal i32 @fcmpUltFloat(float %a, float %b) { | 592 define internal i32 @fcmpUltFloat(float %a, float %b) { |
| 582 entry: | 593 entry: |
| 583 %cmp = fcmp ult float %a, %b | 594 %cmp = fcmp ult float %a, %b |
| 584 %cmp.ret_ext = zext i1 %cmp to i32 | 595 %cmp.ret_ext = zext i1 %cmp to i32 |
| 585 ret i32 %cmp.ret_ext | 596 ret i32 %cmp.ret_ext |
| 586 } | 597 } |
| 587 ; CHECK-LABEL: fcmpUltFloat | 598 ; CHECK-LABEL: fcmpUltFloat |
| 588 ; CHECK: ucomiss | 599 ; CHECK: ucomiss |
| 589 ; CHECK: setb | 600 ; CHECK: setb |
| 590 ; ARM32-LABEL: fcmpUltFloat | 601 ; ARM32-LABEL: fcmpUltFloat |
| 591 ; ARM32: vcmp.f32 | 602 ; ARM32: vcmp.f32 |
| 592 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 593 ; ARM32: vmrs | 603 ; ARM32: vmrs |
| 604 ; ARM32: movge [[R:r[0-9]+]], #0 |
| 594 ; ARM32: movlt [[R]], #1 | 605 ; ARM32: movlt [[R]], #1 |
| 595 | 606 |
| 596 define internal i32 @fcmpUltDouble(double %a, double %b) { | 607 define internal i32 @fcmpUltDouble(double %a, double %b) { |
| 597 entry: | 608 entry: |
| 598 %cmp = fcmp ult double %a, %b | 609 %cmp = fcmp ult double %a, %b |
| 599 %cmp.ret_ext = zext i1 %cmp to i32 | 610 %cmp.ret_ext = zext i1 %cmp to i32 |
| 600 ret i32 %cmp.ret_ext | 611 ret i32 %cmp.ret_ext |
| 601 } | 612 } |
| 602 ; CHECK-LABEL: fcmpUltDouble | 613 ; CHECK-LABEL: fcmpUltDouble |
| 603 ; CHECK: ucomisd | 614 ; CHECK: ucomisd |
| 604 ; CHECK: setb | 615 ; CHECK: setb |
| 605 ; ARM32-LABEL: fcmpUltDouble | 616 ; ARM32-LABEL: fcmpUltDouble |
| 606 ; ARM32: vcmp.f64 | 617 ; ARM32: vcmp.f64 |
| 607 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 608 ; ARM32: vmrs | 618 ; ARM32: vmrs |
| 619 ; ARM32: movge [[R:r[0-9]+]], #0 |
| 609 ; ARM32: movlt [[R]], #1 | 620 ; ARM32: movlt [[R]], #1 |
| 610 | 621 |
| 611 define internal i32 @fcmpUleFloat(float %a, float %b) { | 622 define internal i32 @fcmpUleFloat(float %a, float %b) { |
| 612 entry: | 623 entry: |
| 613 %cmp = fcmp ule float %a, %b | 624 %cmp = fcmp ule float %a, %b |
| 614 %cmp.ret_ext = zext i1 %cmp to i32 | 625 %cmp.ret_ext = zext i1 %cmp to i32 |
| 615 ret i32 %cmp.ret_ext | 626 ret i32 %cmp.ret_ext |
| 616 } | 627 } |
| 617 ; CHECK-LABEL: fcmpUleFloat | 628 ; CHECK-LABEL: fcmpUleFloat |
| 618 ; CHECK: ucomiss | 629 ; CHECK: ucomiss |
| 619 ; CHECK: setbe | 630 ; CHECK: setbe |
| 620 ; ARM32-LABEL: fcmpUleFloat | 631 ; ARM32-LABEL: fcmpUleFloat |
| 621 ; ARM32: vcmp.f32 | 632 ; ARM32: vcmp.f32 |
| 622 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 623 ; ARM32: vmrs | 633 ; ARM32: vmrs |
| 634 ; ARM32: movgt [[R:r[0-9]+]], #0 |
| 624 ; ARM32: movle [[R]], #1 | 635 ; ARM32: movle [[R]], #1 |
| 625 | 636 |
| 626 define internal i32 @fcmpUleDouble(double %a, double %b) { | 637 define internal i32 @fcmpUleDouble(double %a, double %b) { |
| 627 entry: | 638 entry: |
| 628 %cmp = fcmp ule double %a, %b | 639 %cmp = fcmp ule double %a, %b |
| 629 %cmp.ret_ext = zext i1 %cmp to i32 | 640 %cmp.ret_ext = zext i1 %cmp to i32 |
| 630 ret i32 %cmp.ret_ext | 641 ret i32 %cmp.ret_ext |
| 631 } | 642 } |
| 632 ; CHECK-LABEL: fcmpUleDouble | 643 ; CHECK-LABEL: fcmpUleDouble |
| 633 ; CHECK: ucomisd | 644 ; CHECK: ucomisd |
| 634 ; CHECK: setbe | 645 ; CHECK: setbe |
| 635 ; ARM32-LABEL: fcmpUleDouble | 646 ; ARM32-LABEL: fcmpUleDouble |
| 636 ; ARM32: vcmp.f64 | 647 ; ARM32: vcmp.f64 |
| 637 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 638 ; ARM32: vmrs | 648 ; ARM32: vmrs |
| 649 ; ARM32: movgt [[R:r[0-9]+]], #0 |
| 639 ; ARM32: movle [[R]], #1 | 650 ; ARM32: movle [[R]], #1 |
| 640 | 651 |
| 641 define internal i32 @fcmpUneFloat(float %a, float %b) { | 652 define internal i32 @fcmpUneFloat(float %a, float %b) { |
| 642 entry: | 653 entry: |
| 643 %cmp = fcmp une float %a, %b | 654 %cmp = fcmp une float %a, %b |
| 644 %cmp.ret_ext = zext i1 %cmp to i32 | 655 %cmp.ret_ext = zext i1 %cmp to i32 |
| 645 ret i32 %cmp.ret_ext | 656 ret i32 %cmp.ret_ext |
| 646 } | 657 } |
| 647 ; CHECK-LABEL: fcmpUneFloat | 658 ; CHECK-LABEL: fcmpUneFloat |
| 648 ; CHECK: ucomiss | 659 ; CHECK: ucomiss |
| 649 ; CHECK: jne | 660 ; CHECK: jne |
| 650 ; CHECK: jp | 661 ; CHECK: jp |
| 651 ; ARM32-LABEL: fcmpUneFloat | 662 ; ARM32-LABEL: fcmpUneFloat |
| 652 ; ARM32: vcmp.f32 | 663 ; ARM32: vcmp.f32 |
| 653 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 654 ; ARM32: vmrs | 664 ; ARM32: vmrs |
| 665 ; ARM32: moveq [[R:r[0-9]+]], #0 |
| 655 ; ARM32: movne [[R]], #1 | 666 ; ARM32: movne [[R]], #1 |
| 656 | 667 |
| 657 define internal i32 @fcmpUneDouble(double %a, double %b) { | 668 define internal i32 @fcmpUneDouble(double %a, double %b) { |
| 658 entry: | 669 entry: |
| 659 %cmp = fcmp une double %a, %b | 670 %cmp = fcmp une double %a, %b |
| 660 %cmp.ret_ext = zext i1 %cmp to i32 | 671 %cmp.ret_ext = zext i1 %cmp to i32 |
| 661 ret i32 %cmp.ret_ext | 672 ret i32 %cmp.ret_ext |
| 662 } | 673 } |
| 663 ; CHECK-LABEL: fcmpUneDouble | 674 ; CHECK-LABEL: fcmpUneDouble |
| 664 ; CHECK: ucomisd | 675 ; CHECK: ucomisd |
| 665 ; CHECK: jne | 676 ; CHECK: jne |
| 666 ; CHECK: jp | 677 ; CHECK: jp |
| 667 ; ARM32-LABEL: fcmpUneDouble | 678 ; ARM32-LABEL: fcmpUneDouble |
| 668 ; ARM32: vcmp.f64 | 679 ; ARM32: vcmp.f64 |
| 669 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 670 ; ARM32: vmrs | 680 ; ARM32: vmrs |
| 681 ; ARM32: moveq [[R:r[0-9]+]], #0 |
| 671 ; ARM32: movne [[R]], #1 | 682 ; ARM32: movne [[R]], #1 |
| 672 | 683 |
| 673 define internal i32 @fcmpUnoFloat(float %a, float %b) { | 684 define internal i32 @fcmpUnoFloat(float %a, float %b) { |
| 674 entry: | 685 entry: |
| 675 %cmp = fcmp uno float %a, %b | 686 %cmp = fcmp uno float %a, %b |
| 676 %cmp.ret_ext = zext i1 %cmp to i32 | 687 %cmp.ret_ext = zext i1 %cmp to i32 |
| 677 ret i32 %cmp.ret_ext | 688 ret i32 %cmp.ret_ext |
| 678 } | 689 } |
| 679 ; CHECK-LABEL: fcmpUnoFloat | 690 ; CHECK-LABEL: fcmpUnoFloat |
| 680 ; CHECK: ucomiss | 691 ; CHECK: ucomiss |
| 681 ; CHECK: setp | 692 ; CHECK: setp |
| 682 ; ARM32-LABEL: fcmpUnoFloat | 693 ; ARM32-LABEL: fcmpUnoFloat |
| 683 ; ARM32: vcmp.f32 | 694 ; ARM32: vcmp.f32 |
| 684 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 685 ; ARM32: vmrs | 695 ; ARM32: vmrs |
| 696 ; ARM32: movvc [[R:r[0-9]+]], #0 |
| 686 ; ARM32: movvs [[R]], #1 | 697 ; ARM32: movvs [[R]], #1 |
| 687 | 698 |
| 688 define internal i32 @fcmpUnoDouble(double %a, double %b) { | 699 define internal i32 @fcmpUnoDouble(double %a, double %b) { |
| 689 entry: | 700 entry: |
| 690 %cmp = fcmp uno double %a, %b | 701 %cmp = fcmp uno double %a, %b |
| 691 %cmp.ret_ext = zext i1 %cmp to i32 | 702 %cmp.ret_ext = zext i1 %cmp to i32 |
| 692 ret i32 %cmp.ret_ext | 703 ret i32 %cmp.ret_ext |
| 693 } | 704 } |
| 694 ; CHECK-LABEL: fcmpUnoDouble | 705 ; CHECK-LABEL: fcmpUnoDouble |
| 695 ; CHECK: ucomisd | 706 ; CHECK: ucomisd |
| 696 ; CHECK: setp | 707 ; CHECK: setp |
| 697 ; ARM32-LABEL: fcmpUnoDouble | 708 ; ARM32-LABEL: fcmpUnoDouble |
| 698 ; ARM32: vcmp.f64 | 709 ; ARM32: vcmp.f64 |
| 699 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 700 ; ARM32: vmrs | 710 ; ARM32: vmrs |
| 711 ; ARM32: movvc [[R:r[0-9]+]], #0 |
| 701 ; ARM32: movvs [[R]], #1 | 712 ; ARM32: movvs [[R]], #1 |
| 702 | 713 |
| 703 define internal i32 @fcmpTrueFloat(float %a, float %b) { | 714 define internal i32 @fcmpTrueFloat(float %a, float %b) { |
| 704 entry: | 715 entry: |
| 705 %cmp = fcmp true float %a, %b | 716 %cmp = fcmp true float %a, %b |
| 706 %cmp.ret_ext = zext i1 %cmp to i32 | 717 %cmp.ret_ext = zext i1 %cmp to i32 |
| 707 ret i32 %cmp.ret_ext | 718 ret i32 %cmp.ret_ext |
| 708 } | 719 } |
| 709 ; CHECK-LABEL: fcmpTrueFloat | 720 ; CHECK-LABEL: fcmpTrueFloat |
| 710 ; CHECK: mov {{.*}},0x1 | 721 ; CHECK: mov {{.*}},0x1 |
| 711 ; ARM32-LABEL: fcmpTrueFloat | 722 ; ARM32-LABEL: fcmpTrueFloat |
| 712 ; ARM32: vcmp.f32 | 723 ; ARM32: mov {{r[0-9]+}}, #1 |
| 713 ; ARM32: mov [[R]], #1 | |
| 714 | 724 |
| 715 define internal i32 @fcmpTrueDouble(double %a, double %b) { | 725 define internal i32 @fcmpTrueDouble(double %a, double %b) { |
| 716 entry: | 726 entry: |
| 717 %cmp = fcmp true double %a, %b | 727 %cmp = fcmp true double %a, %b |
| 718 %cmp.ret_ext = zext i1 %cmp to i32 | 728 %cmp.ret_ext = zext i1 %cmp to i32 |
| 719 ret i32 %cmp.ret_ext | 729 ret i32 %cmp.ret_ext |
| 720 } | 730 } |
| 721 ; CHECK-LABEL: fcmpTrueDouble | 731 ; CHECK-LABEL: fcmpTrueDouble |
| 722 ; CHECK: mov {{.*}},0x1 | 732 ; CHECK: mov {{.*}},0x1 |
| 723 ; ARM32-LABEL: fcmpTrueDouble | 733 ; ARM32-LABEL: fcmpTrueDouble |
| 724 ; ARM32: vcmp.f64 | 734 ; ARM32: mov {{r[0-9]+}}, #1 |
| 725 ; ARM32: mov [[R]], #1 | |
| 726 | 735 |
| 727 define internal float @selectFloatVarVar(float %a, float %b) { | 736 define internal float @selectFloatVarVar(float %a, float %b) { |
| 728 entry: | 737 entry: |
| 729 %cmp = fcmp olt float %a, %b | 738 %cmp = fcmp olt float %a, %b |
| 730 %cond = select i1 %cmp, float %a, float %b | 739 %cond = select i1 %cmp, float %a, float %b |
| 731 ret float %cond | 740 ret float %cond |
| 732 } | 741 } |
| 733 ; CHECK-LABEL: selectFloatVarVar | 742 ; CHECK-LABEL: selectFloatVarVar |
| 734 ; CHECK: ucomiss | 743 ; CHECK: ucomiss |
| 735 ; CHECK: seta | 744 ; CHECK: seta |
| 736 ; CHECK: fld | 745 ; CHECK: fld |
| 737 ; ARM32-LABEL: selectFloatVarVar | 746 ; ARM32-LABEL: selectFloatVarVar |
| 738 ; ARM32: vcmp.f32 | 747 ; ARM32: vcmp.f32 |
| 739 ; ARM32: vmovne.f32 s{{[0-9]+}} | 748 ; ARM32-OM1: vmovne.f32 s{{[0-9]+}} |
| 749 ; ARM32-O2: vmovmi.f32 s{{[0-9]+}} |
| 740 ; ARM32: bx | 750 ; ARM32: bx |
| 741 | 751 |
| 742 define internal double @selectDoubleVarVar(double %a, double %b) { | 752 define internal double @selectDoubleVarVar(double %a, double %b) { |
| 743 entry: | 753 entry: |
| 744 %cmp = fcmp olt double %a, %b | 754 %cmp = fcmp olt double %a, %b |
| 745 %cond = select i1 %cmp, double %a, double %b | 755 %cond = select i1 %cmp, double %a, double %b |
| 746 ret double %cond | 756 ret double %cond |
| 747 } | 757 } |
| 748 ; CHECK-LABEL: selectDoubleVarVar | 758 ; CHECK-LABEL: selectDoubleVarVar |
| 749 ; CHECK: ucomisd | 759 ; CHECK: ucomisd |
| 750 ; CHECK: seta | 760 ; CHECK: seta |
| 751 ; CHECK: fld | 761 ; CHECK: fld |
| 752 ; ARM32-LABEL: selectDoubleVarVar | 762 ; ARM32-LABEL: selectDoubleVarVar |
| 753 ; ARM32: vcmp.f64 | 763 ; ARM32: vcmp.f64 |
| 754 ; ARM32: vmovne.f64 d{{[0-9]+}} | 764 ; ARM32-OM1: vmovne.f64 d{{[0-9]+}} |
| 765 ; ARM32-O2: vmovmi.f64 d{{[0-9]+}} |
| 755 ; ARM32: bx | 766 ; ARM32: bx |
| OLD | NEW |