| 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 | 2 |
| 3 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ | 3 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ |
| 4 ; RUN: -allow-externally-defined-symbols | FileCheck %s | 4 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
| 5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ | 5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ |
| 6 ; RUN: -allow-externally-defined-symbols | FileCheck %s \ | 6 ; RUN: -allow-externally-defined-symbols | FileCheck %s \ |
| 7 ; RUN: --check-prefix=CHECK-OM1 | 7 ; RUN: --check-prefix=CHECK-OM1 |
| 8 | 8 |
| 9 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ | 9 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ |
| 10 ; RUN: --target arm32 -i %s --args -O2 \ | 10 ; RUN: --target arm32 -i %s --args -O2 \ |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 ; CHECK-OM1: ucomiss | 51 ; CHECK-OM1: ucomiss |
| 52 ; CHECK-OM1: jne | 52 ; CHECK-OM1: jne |
| 53 ; CHECK-OM1-NEXT: jp | 53 ; CHECK-OM1-NEXT: jp |
| 54 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 54 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 55 ; CHECK-OM1: ucomisd | 55 ; CHECK-OM1: ucomisd |
| 56 ; CHECK-OM1: jne | 56 ; CHECK-OM1: jne |
| 57 ; CHECK-NEXT-OM1: jp | 57 ; CHECK-NEXT-OM1: jp |
| 58 ; ARM32-LABEL: fcmpEq | 58 ; ARM32-LABEL: fcmpEq |
| 59 ; ARM32: vcmp.f32 | 59 ; ARM32: vcmp.f32 |
| 60 ; ARM32: vmrs | 60 ; ARM32: vmrs |
| 61 ; ARM32-OM1: movne [[R0:r[0-9]+]], #0 | 61 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 62 ; ARM32-OM1: moveq [[R0]], #1 | 62 ; ARM32-OM1: moveq [[R0]], #1 |
| 63 ; ARM32-O2: bne | 63 ; ARM32-O2: bne |
| 64 ; ARM32: bl func | 64 ; ARM32: bl func |
| 65 ; ARM32: vcmp.f64 | 65 ; ARM32: vcmp.f64 |
| 66 ; ARM32: vmrs | 66 ; ARM32: vmrs |
| 67 ; ARM32-OM1: movne [[R1:r[0-9]+]], #0 | 67 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 68 ; ARM32-OM1: moveq [[R1]], #1 | 68 ; ARM32-OM1: moveq [[R1]], #1 |
| 69 ; ARM32-O2: bne | 69 ; ARM32-O2: bne |
| 70 | 70 |
| 71 declare void @func() | 71 declare void @func() |
| 72 | 72 |
| 73 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { | 73 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { |
| 74 entry: | 74 entry: |
| 75 %cmp = fcmp une float %a, %b | 75 %cmp = fcmp une float %a, %b |
| 76 br i1 %cmp, label %if.then, label %if.end | 76 br i1 %cmp, label %if.then, label %if.end |
| 77 | 77 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 108 ; CHECK-OM1: jmp | 108 ; CHECK-OM1: jmp |
| 109 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 109 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 110 ; CHECK-OM1: ucomisd | 110 ; CHECK-OM1: ucomisd |
| 111 ; CHECK-OM1: jne | 111 ; CHECK-OM1: jne |
| 112 ; CHECK-OM1: jp | 112 ; CHECK-OM1: jp |
| 113 ; CHECK-OM1: jmp | 113 ; CHECK-OM1: jmp |
| 114 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 114 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 115 ; ARM32-LABEL: fcmpNe | 115 ; ARM32-LABEL: fcmpNe |
| 116 ; ARM32: vcmp.f32 | 116 ; ARM32: vcmp.f32 |
| 117 ; ARM32: vmrs | 117 ; ARM32: vmrs |
| 118 ; ARM32-OM1: moveq [[R0:r[0-9]+]], #0 | 118 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 119 ; ARM32-OM1: movne [[R0]], #1 | 119 ; ARM32-OM1: movne [[R0]], #1 |
| 120 ; ARM32-O2: beq | 120 ; ARM32-O2: beq |
| 121 ; ARM32: vcmp.f64 | 121 ; ARM32: vcmp.f64 |
| 122 ; ARM32: vmrs | 122 ; ARM32: vmrs |
| 123 ; ARM32-OM1: moveq [[R1:r[0-9]+]], #0 | 123 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 124 ; ARM32-OM1: movne [[R1]], #1 | 124 ; ARM32-OM1: movne [[R1]], #1 |
| 125 ; ARM32-O2: beq | 125 ; ARM32-O2: beq |
| 126 | 126 |
| 127 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | 127 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { |
| 128 entry: | 128 entry: |
| 129 %cmp = fcmp ogt float %a, %b | 129 %cmp = fcmp ogt float %a, %b |
| 130 br i1 %cmp, label %if.then, label %if.end | 130 br i1 %cmp, label %if.then, label %if.end |
| 131 | 131 |
| 132 if.then: ; preds = %entry | 132 if.then: ; preds = %entry |
| 133 call void @func() | 133 call void @func() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 154 ; CHECK-OM1-LABEL: fcmpGt | 154 ; CHECK-OM1-LABEL: fcmpGt |
| 155 ; CHECK-OM1: ucomiss | 155 ; CHECK-OM1: ucomiss |
| 156 ; CHECK-OM1: seta | 156 ; CHECK-OM1: seta |
| 157 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 157 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 158 ; CHECK-OM1: ucomisd | 158 ; CHECK-OM1: ucomisd |
| 159 ; CHECK-OM1: seta | 159 ; CHECK-OM1: seta |
| 160 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 160 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 161 ; ARM32-LABEL: fcmpGt | 161 ; ARM32-LABEL: fcmpGt |
| 162 ; ARM32: vcmp.f32 | 162 ; ARM32: vcmp.f32 |
| 163 ; ARM32: vmrs | 163 ; ARM32: vmrs |
| 164 ; ARM32-OM1: movle [[R0:r[0-9]+]], #0 | 164 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 165 ; ARM32-OM1: movgt [[R0]], #1 | 165 ; ARM32-OM1: movgt [[R0]], #1 |
| 166 ; ARM32-O2: ble | 166 ; ARM32-O2: ble |
| 167 ; ARM32: vcmp.f64 | 167 ; ARM32: vcmp.f64 |
| 168 ; ARM32: vmrs | 168 ; ARM32: vmrs |
| 169 ; ARM32-OM1: movle [[R1:r[0-9]+]], #0 | 169 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 170 ; ARM32-OM1: movgt [[R1]], #1 | 170 ; ARM32-OM1: movgt [[R1]], #1 |
| 171 ; ARM32-O2: ble | 171 ; ARM32-O2: ble |
| 172 | 172 |
| 173 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | 173 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { |
| 174 entry: | 174 entry: |
| 175 %cmp = fcmp ult float %a, %b | 175 %cmp = fcmp ult float %a, %b |
| 176 br i1 %cmp, label %if.end, label %if.then | 176 br i1 %cmp, label %if.end, label %if.then |
| 177 | 177 |
| 178 if.then: ; preds = %entry | 178 if.then: ; preds = %entry |
| 179 call void @func() | 179 call void @func() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 200 ; CHECK-OM1-LABEL: fcmpGe | 200 ; CHECK-OM1-LABEL: fcmpGe |
| 201 ; CHECK-OM1: ucomiss | 201 ; CHECK-OM1: ucomiss |
| 202 ; CHECK-OM1-NEXT: setb | 202 ; CHECK-OM1-NEXT: setb |
| 203 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 203 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 204 ; CHECK-OM1: ucomisd | 204 ; CHECK-OM1: ucomisd |
| 205 ; CHECK-OM1-NEXT: setb | 205 ; CHECK-OM1-NEXT: setb |
| 206 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 206 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 207 ; ARM32-LABEL: fcmpGe | 207 ; ARM32-LABEL: fcmpGe |
| 208 ; ARM32: vcmp.f32 | 208 ; ARM32: vcmp.f32 |
| 209 ; ARM32: vmrs | 209 ; ARM32: vmrs |
| 210 ; ARM32-OM1: movge [[R0:r[0-9]+]], #0 | 210 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 211 ; ARM32-OM1: movlt [[R0]], #1 | 211 ; ARM32-OM1: movlt [[R0]], #1 |
| 212 ; ARM32-O2: blt | 212 ; ARM32-O2: blt |
| 213 ; ARM32: vcmp.f64 | 213 ; ARM32: vcmp.f64 |
| 214 ; ARM32: vmrs | 214 ; ARM32: vmrs |
| 215 ; ARM32-OM1: movge [[R1:r[0-9]+]], #0 | 215 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 216 ; ARM32-OM1: movlt [[R1]], #1 | 216 ; ARM32-OM1: movlt [[R1]], #1 |
| 217 ; ARM32-O2: blt | 217 ; ARM32-O2: blt |
| 218 | 218 |
| 219 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | 219 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { |
| 220 entry: | 220 entry: |
| 221 %cmp = fcmp olt float %a, %b | 221 %cmp = fcmp olt float %a, %b |
| 222 br i1 %cmp, label %if.then, label %if.end | 222 br i1 %cmp, label %if.then, label %if.end |
| 223 | 223 |
| 224 if.then: ; preds = %entry | 224 if.then: ; preds = %entry |
| 225 call void @func() | 225 call void @func() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 246 ; CHECK-OM1-LABEL: fcmpLt | 246 ; CHECK-OM1-LABEL: fcmpLt |
| 247 ; CHECK-OM1: ucomiss | 247 ; CHECK-OM1: ucomiss |
| 248 ; CHECK-OM1-NEXT: seta | 248 ; CHECK-OM1-NEXT: seta |
| 249 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 249 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 250 ; CHECK-OM1: ucomisd | 250 ; CHECK-OM1: ucomisd |
| 251 ; CHECK-OM1-NEXT: seta | 251 ; CHECK-OM1-NEXT: seta |
| 252 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 252 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 253 ; ARM32-LABEL: fcmpLt | 253 ; ARM32-LABEL: fcmpLt |
| 254 ; ARM32: vcmp.f32 | 254 ; ARM32: vcmp.f32 |
| 255 ; ARM32: vmrs | 255 ; ARM32: vmrs |
| 256 ; ARM32-OM1: movpl [[R0:r[0-9]+]], #0 | 256 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 257 ; ARM32-OM1: movmi [[R0]], #1 | 257 ; ARM32-OM1: movmi [[R0]], #1 |
| 258 ; ARM32-O2: bpl | 258 ; ARM32-O2: bpl |
| 259 ; ARM32: vcmp.f64 | 259 ; ARM32: vcmp.f64 |
| 260 ; ARM32: vmrs | 260 ; ARM32: vmrs |
| 261 ; ARM32-OM1: movpl [[R1:r[0-9]+]], #0 | 261 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 262 ; ARM32-OM1: movmi [[R1]], #1 | 262 ; ARM32-OM1: movmi [[R1]], #1 |
| 263 ; ARM32-O2: bpl | 263 ; ARM32-O2: bpl |
| 264 | 264 |
| 265 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | 265 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { |
| 266 entry: | 266 entry: |
| 267 %cmp = fcmp ugt float %a, %b | 267 %cmp = fcmp ugt float %a, %b |
| 268 br i1 %cmp, label %if.end, label %if.then | 268 br i1 %cmp, label %if.end, label %if.then |
| 269 | 269 |
| 270 if.then: ; preds = %entry | 270 if.then: ; preds = %entry |
| 271 call void @func() | 271 call void @func() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 292 ; CHECK-OM1-LABEL: fcmpLe | 292 ; CHECK-OM1-LABEL: fcmpLe |
| 293 ; CHECK-OM1: ucomiss | 293 ; CHECK-OM1: ucomiss |
| 294 ; CHECK-OM1-NEXT: setb | 294 ; CHECK-OM1-NEXT: setb |
| 295 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 295 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 296 ; CHECK-OM1: ucomisd | 296 ; CHECK-OM1: ucomisd |
| 297 ; CHECK-OM1-NEXT: setb | 297 ; CHECK-OM1-NEXT: setb |
| 298 ; CHECK-OM1: call {{.*}} R_{{.*}} func | 298 ; CHECK-OM1: call {{.*}} R_{{.*}} func |
| 299 ; ARM32-LABEL: fcmpLe | 299 ; ARM32-LABEL: fcmpLe |
| 300 ; ARM32: vcmp.f32 | 300 ; ARM32: vcmp.f32 |
| 301 ; ARM32: vmrs | 301 ; ARM32: vmrs |
| 302 ; ARM32-OM1: movls [[R0:r[0-9]+]], #0 | 302 ; ARM32-OM1: mov [[R0:r[0-9]+]], #0 |
| 303 ; ARM32-OM1: movhi [[R0]], #1 | 303 ; ARM32-OM1: movhi [[R0]], #1 |
| 304 ; ARM32-O2: bhi | 304 ; ARM32-O2: bhi |
| 305 ; ARM32: vcmp.f64 | 305 ; ARM32: vcmp.f64 |
| 306 ; ARM32: vmrs | 306 ; ARM32: vmrs |
| 307 ; ARM32-OM1: movls [[R1:r[0-9]+]], #0 | 307 ; ARM32-OM1: mov [[R1:r[0-9]+]], #0 |
| 308 ; ARM32-OM1: movhi [[R1]], #1 | 308 ; ARM32-OM1: movhi [[R1]], #1 |
| 309 ; ARM32-O2: bhi | 309 ; ARM32-O2: bhi |
| 310 | 310 |
| 311 define internal i32 @fcmpFalseFloat(float %a, float %b) { | 311 define internal i32 @fcmpFalseFloat(float %a, float %b) { |
| 312 entry: | 312 entry: |
| 313 %cmp = fcmp false float %a, %b | 313 %cmp = fcmp false float %a, %b |
| 314 %cmp.ret_ext = zext i1 %cmp to i32 | 314 %cmp.ret_ext = zext i1 %cmp to i32 |
| 315 ret i32 %cmp.ret_ext | 315 ret i32 %cmp.ret_ext |
| 316 } | 316 } |
| 317 ; CHECK-LABEL: fcmpFalseFloat | 317 ; CHECK-LABEL: fcmpFalseFloat |
| (...skipping 16 matching lines...) Expand all Loading... |
| 334 entry: | 334 entry: |
| 335 %cmp = fcmp oeq float %a, %b | 335 %cmp = fcmp oeq float %a, %b |
| 336 %cmp.ret_ext = zext i1 %cmp to i32 | 336 %cmp.ret_ext = zext i1 %cmp to i32 |
| 337 ret i32 %cmp.ret_ext | 337 ret i32 %cmp.ret_ext |
| 338 } | 338 } |
| 339 ; CHECK-LABEL: fcmpOeqFloat | 339 ; CHECK-LABEL: fcmpOeqFloat |
| 340 ; CHECK: ucomiss | 340 ; CHECK: ucomiss |
| 341 ; CHECK: jne | 341 ; CHECK: jne |
| 342 ; CHECK: jp | 342 ; CHECK: jp |
| 343 ; ARM32-LABEL: fcmpOeqFloat | 343 ; ARM32-LABEL: fcmpOeqFloat |
| 344 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 344 ; ARM32: vcmp.f32 | 345 ; ARM32: vcmp.f32 |
| 345 ; ARM32: vmrs | 346 ; ARM32: vmrs |
| 346 ; ARM32: movne [[R:r[0-9]+]], #0 | 347 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 347 ; ARM32: moveq [[R]], #1 | 348 ; ARM32: moveq [[R]], #1 |
| 348 | 349 |
| 349 define internal i32 @fcmpOeqDouble(double %a, double %b) { | 350 define internal i32 @fcmpOeqDouble(double %a, double %b) { |
| 350 entry: | 351 entry: |
| 351 %cmp = fcmp oeq double %a, %b | 352 %cmp = fcmp oeq double %a, %b |
| 352 %cmp.ret_ext = zext i1 %cmp to i32 | 353 %cmp.ret_ext = zext i1 %cmp to i32 |
| 353 ret i32 %cmp.ret_ext | 354 ret i32 %cmp.ret_ext |
| 354 } | 355 } |
| 355 ; CHECK-LABEL: fcmpOeqDouble | 356 ; CHECK-LABEL: fcmpOeqDouble |
| 356 ; CHECK: ucomisd | 357 ; CHECK: ucomisd |
| 357 ; CHECK: jne | 358 ; CHECK: jne |
| 358 ; CHECK: jp | 359 ; CHECK: jp |
| 359 ; ARM32-LABEL: fcmpOeqDouble | 360 ; ARM32-LABEL: fcmpOeqDouble |
| 361 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 360 ; ARM32: vcmp.f64 | 362 ; ARM32: vcmp.f64 |
| 361 ; ARM32: vmrs | 363 ; ARM32: vmrs |
| 362 ; ARM32: movne [[R:r[0-9]+]], #0 | 364 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 363 ; ARM32: moveq [[R]], #1 | 365 ; ARM32: moveq [[R]], #1 |
| 364 | 366 |
| 365 define internal i32 @fcmpOgtFloat(float %a, float %b) { | 367 define internal i32 @fcmpOgtFloat(float %a, float %b) { |
| 366 entry: | 368 entry: |
| 367 %cmp = fcmp ogt float %a, %b | 369 %cmp = fcmp ogt float %a, %b |
| 368 %cmp.ret_ext = zext i1 %cmp to i32 | 370 %cmp.ret_ext = zext i1 %cmp to i32 |
| 369 ret i32 %cmp.ret_ext | 371 ret i32 %cmp.ret_ext |
| 370 } | 372 } |
| 371 ; CHECK-LABEL: fcmpOgtFloat | 373 ; CHECK-LABEL: fcmpOgtFloat |
| 372 ; CHECK: ucomiss | 374 ; CHECK: ucomiss |
| 373 ; CHECK: seta | 375 ; CHECK: seta |
| 374 ; ARM32-LABEL: fcmpOgtFloat | 376 ; ARM32-LABEL: fcmpOgtFloat |
| 377 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 375 ; ARM32: vcmp.f32 | 378 ; ARM32: vcmp.f32 |
| 376 ; ARM32: vmrs | 379 ; ARM32: vmrs |
| 377 ; ARM32: movle [[R:r[0-9]+]], #0 | 380 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 378 ; ARM32: movgt [[R]], #1 | 381 ; ARM32: movgt [[R]], #1 |
| 379 | 382 |
| 380 define internal i32 @fcmpOgtDouble(double %a, double %b) { | 383 define internal i32 @fcmpOgtDouble(double %a, double %b) { |
| 381 entry: | 384 entry: |
| 382 %cmp = fcmp ogt double %a, %b | 385 %cmp = fcmp ogt double %a, %b |
| 383 %cmp.ret_ext = zext i1 %cmp to i32 | 386 %cmp.ret_ext = zext i1 %cmp to i32 |
| 384 ret i32 %cmp.ret_ext | 387 ret i32 %cmp.ret_ext |
| 385 } | 388 } |
| 386 ; CHECK-LABEL: fcmpOgtDouble | 389 ; CHECK-LABEL: fcmpOgtDouble |
| 387 ; CHECK: ucomisd | 390 ; CHECK: ucomisd |
| 388 ; CHECK: seta | 391 ; CHECK: seta |
| 389 ; ARM32-LABEL: fcmpOgtDouble | 392 ; ARM32-LABEL: fcmpOgtDouble |
| 393 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 390 ; ARM32: vcmp.f64 | 394 ; ARM32: vcmp.f64 |
| 391 ; ARM32: vmrs | 395 ; ARM32: vmrs |
| 392 ; ARM32: movle [[R:r[0-9]+]], #0 | 396 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 393 ; ARM32: movgt [[R]], #1 | 397 ; ARM32: movgt [[R]], #1 |
| 394 | 398 |
| 395 define internal i32 @fcmpOgeFloat(float %a, float %b) { | 399 define internal i32 @fcmpOgeFloat(float %a, float %b) { |
| 396 entry: | 400 entry: |
| 397 %cmp = fcmp oge float %a, %b | 401 %cmp = fcmp oge float %a, %b |
| 398 %cmp.ret_ext = zext i1 %cmp to i32 | 402 %cmp.ret_ext = zext i1 %cmp to i32 |
| 399 ret i32 %cmp.ret_ext | 403 ret i32 %cmp.ret_ext |
| 400 } | 404 } |
| 401 ; CHECK-LABEL: fcmpOgeFloat | 405 ; CHECK-LABEL: fcmpOgeFloat |
| 402 ; CHECK: ucomiss | 406 ; CHECK: ucomiss |
| 403 ; CHECK: setae | 407 ; CHECK: setae |
| 404 ; ARM32-LABEL: fcmpOgeFloat | 408 ; ARM32-LABEL: fcmpOgeFloat |
| 409 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 405 ; ARM32: vcmp.f32 | 410 ; ARM32: vcmp.f32 |
| 406 ; ARM32: vmrs | 411 ; ARM32: vmrs |
| 407 ; ARM32: movlt [[R:r[0-9]+]], #0 | 412 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 408 ; ARM32: movge [[R]], #1 | 413 ; ARM32: movge [[R]], #1 |
| 409 | 414 |
| 410 define internal i32 @fcmpOgeDouble(double %a, double %b) { | 415 define internal i32 @fcmpOgeDouble(double %a, double %b) { |
| 411 entry: | 416 entry: |
| 412 %cmp = fcmp oge double %a, %b | 417 %cmp = fcmp oge double %a, %b |
| 413 %cmp.ret_ext = zext i1 %cmp to i32 | 418 %cmp.ret_ext = zext i1 %cmp to i32 |
| 414 ret i32 %cmp.ret_ext | 419 ret i32 %cmp.ret_ext |
| 415 } | 420 } |
| 416 ; CHECK-LABEL: fcmpOgeDouble | 421 ; CHECK-LABEL: fcmpOgeDouble |
| 417 ; CHECK: ucomisd | 422 ; CHECK: ucomisd |
| 418 ; CHECK: setae | 423 ; CHECK: setae |
| 419 ; ARM32-LABEL: fcmpOgeDouble | 424 ; ARM32-LABEL: fcmpOgeDouble |
| 425 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 420 ; ARM32: vcmp.f64 | 426 ; ARM32: vcmp.f64 |
| 421 ; ARM32: vmrs | 427 ; ARM32: vmrs |
| 422 ; ARM32: movlt [[R:r[0-9]+]], #0 | 428 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 423 ; ARM32: movge [[R]], #1 | 429 ; ARM32: movge [[R]], #1 |
| 424 | 430 |
| 425 define internal i32 @fcmpOltFloat(float %a, float %b) { | 431 define internal i32 @fcmpOltFloat(float %a, float %b) { |
| 426 entry: | 432 entry: |
| 427 %cmp = fcmp olt float %a, %b | 433 %cmp = fcmp olt float %a, %b |
| 428 %cmp.ret_ext = zext i1 %cmp to i32 | 434 %cmp.ret_ext = zext i1 %cmp to i32 |
| 429 ret i32 %cmp.ret_ext | 435 ret i32 %cmp.ret_ext |
| 430 } | 436 } |
| 431 ; CHECK-LABEL: fcmpOltFloat | 437 ; CHECK-LABEL: fcmpOltFloat |
| 432 ; CHECK: ucomiss | 438 ; CHECK: ucomiss |
| 433 ; CHECK: seta | 439 ; CHECK: seta |
| 434 ; ARM32-LABEL: fcmpOltFloat | 440 ; ARM32-LABEL: fcmpOltFloat |
| 441 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 435 ; ARM32: vcmp.f32 | 442 ; ARM32: vcmp.f32 |
| 436 ; ARM32: vmrs | 443 ; ARM32: vmrs |
| 437 ; ARM32: movpl [[R:r[0-9]+]], #0 | 444 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 438 ; ARM32: movmi [[R]], #1 | 445 ; ARM32: movmi [[R]], #1 |
| 439 | 446 |
| 440 define internal i32 @fcmpOltDouble(double %a, double %b) { | 447 define internal i32 @fcmpOltDouble(double %a, double %b) { |
| 441 entry: | 448 entry: |
| 442 %cmp = fcmp olt double %a, %b | 449 %cmp = fcmp olt double %a, %b |
| 443 %cmp.ret_ext = zext i1 %cmp to i32 | 450 %cmp.ret_ext = zext i1 %cmp to i32 |
| 444 ret i32 %cmp.ret_ext | 451 ret i32 %cmp.ret_ext |
| 445 } | 452 } |
| 446 ; CHECK-LABEL: fcmpOltDouble | 453 ; CHECK-LABEL: fcmpOltDouble |
| 447 ; CHECK: ucomisd | 454 ; CHECK: ucomisd |
| 448 ; CHECK: seta | 455 ; CHECK: seta |
| 449 ; ARM32-LABEL: fcmpOltDouble | 456 ; ARM32-LABEL: fcmpOltDouble |
| 457 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 450 ; ARM32: vcmp.f64 | 458 ; ARM32: vcmp.f64 |
| 451 ; ARM32: vmrs | 459 ; ARM32: vmrs |
| 452 ; ARM32: movpl [[R:r[0-9]+]], #0 | 460 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 453 ; ARM32: movmi [[R]], #1 | 461 ; ARM32: movmi [[R]], #1 |
| 454 | 462 |
| 455 define internal i32 @fcmpOleFloat(float %a, float %b) { | 463 define internal i32 @fcmpOleFloat(float %a, float %b) { |
| 456 entry: | 464 entry: |
| 457 %cmp = fcmp ole float %a, %b | 465 %cmp = fcmp ole float %a, %b |
| 458 %cmp.ret_ext = zext i1 %cmp to i32 | 466 %cmp.ret_ext = zext i1 %cmp to i32 |
| 459 ret i32 %cmp.ret_ext | 467 ret i32 %cmp.ret_ext |
| 460 } | 468 } |
| 461 ; CHECK-LABEL: fcmpOleFloat | 469 ; CHECK-LABEL: fcmpOleFloat |
| 462 ; CHECK: ucomiss | 470 ; CHECK: ucomiss |
| 463 ; CHECK: setae | 471 ; CHECK: setae |
| 464 ; ARM32-LABEL: fcmpOleFloat | 472 ; ARM32-LABEL: fcmpOleFloat |
| 473 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 465 ; ARM32: vcmp.f32 | 474 ; ARM32: vcmp.f32 |
| 466 ; ARM32: vmrs | 475 ; ARM32: vmrs |
| 467 ; ARM32: movhi [[R:r[0-9]+]], #0 | 476 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 468 ; ARM32: movls [[R]], #1 | 477 ; ARM32: movls [[R]], #1 |
| 469 | 478 |
| 470 define internal i32 @fcmpOleDouble(double %a, double %b) { | 479 define internal i32 @fcmpOleDouble(double %a, double %b) { |
| 471 entry: | 480 entry: |
| 472 %cmp = fcmp ole double %a, %b | 481 %cmp = fcmp ole double %a, %b |
| 473 %cmp.ret_ext = zext i1 %cmp to i32 | 482 %cmp.ret_ext = zext i1 %cmp to i32 |
| 474 ret i32 %cmp.ret_ext | 483 ret i32 %cmp.ret_ext |
| 475 } | 484 } |
| 476 ; CHECK-LABEL: fcmpOleDouble | 485 ; CHECK-LABEL: fcmpOleDouble |
| 477 ; CHECK: ucomisd | 486 ; CHECK: ucomisd |
| 478 ; CHECK: setae | 487 ; CHECK: setae |
| 479 ; ARM32-LABEL: fcmpOleDouble | 488 ; ARM32-LABEL: fcmpOleDouble |
| 489 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 480 ; ARM32: vcmp.f64 | 490 ; ARM32: vcmp.f64 |
| 481 ; ARM32: vmrs | 491 ; ARM32: vmrs |
| 482 ; ARM32: movhi [[R:r[0-9]+]], #0 | 492 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 483 ; ARM32: movls [[R]], #1 | 493 ; ARM32: movls [[R]], #1 |
| 484 | 494 |
| 485 define internal i32 @fcmpOneFloat(float %a, float %b) { | 495 define internal i32 @fcmpOneFloat(float %a, float %b) { |
| 486 entry: | 496 entry: |
| 487 %cmp = fcmp one float %a, %b | 497 %cmp = fcmp one float %a, %b |
| 488 %cmp.ret_ext = zext i1 %cmp to i32 | 498 %cmp.ret_ext = zext i1 %cmp to i32 |
| 489 ret i32 %cmp.ret_ext | 499 ret i32 %cmp.ret_ext |
| 490 } | 500 } |
| 491 ; CHECK-LABEL: fcmpOneFloat | 501 ; CHECK-LABEL: fcmpOneFloat |
| 492 ; CHECK: ucomiss | 502 ; CHECK: ucomiss |
| 493 ; CHECK: setne | 503 ; CHECK: setne |
| 494 ; ARM32-LABEL: fcmpOneFloat | 504 ; ARM32-LABEL: fcmpOneFloat |
| 505 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 495 ; ARM32: vcmp.f32 | 506 ; ARM32: vcmp.f32 |
| 496 ; ARM32: vmrs | 507 ; ARM32: vmrs |
| 497 ; ARM32: mov [[R:r[0-9]+]], #0 | 508 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 498 ; ARM32: movmi [[R]], #1 | 509 ; ARM32: movmi [[R]], #1 |
| 499 ; ARM32: movgt [[R]], #1 | 510 ; ARM32: movgt [[R]], #1 |
| 500 | 511 |
| 501 define internal i32 @fcmpOneDouble(double %a, double %b) { | 512 define internal i32 @fcmpOneDouble(double %a, double %b) { |
| 502 entry: | 513 entry: |
| 503 %cmp = fcmp one double %a, %b | 514 %cmp = fcmp one double %a, %b |
| 504 %cmp.ret_ext = zext i1 %cmp to i32 | 515 %cmp.ret_ext = zext i1 %cmp to i32 |
| 505 ret i32 %cmp.ret_ext | 516 ret i32 %cmp.ret_ext |
| 506 } | 517 } |
| 507 ; CHECK-LABEL: fcmpOneDouble | 518 ; CHECK-LABEL: fcmpOneDouble |
| 508 ; CHECK: ucomisd | 519 ; CHECK: ucomisd |
| 509 ; CHECK: setne | 520 ; CHECK: setne |
| 510 ; ARM32-LABEL: fcmpOneDouble | 521 ; ARM32-LABEL: fcmpOneDouble |
| 522 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 511 ; ARM32: vcmp.f64 | 523 ; ARM32: vcmp.f64 |
| 512 ; ARM32: vmrs | 524 ; ARM32: vmrs |
| 513 ; ARM32: mov [[R:r[0-9]+]], #0 | 525 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 514 ; ARM32: movmi [[R]], #1 | 526 ; ARM32: movmi [[R]], #1 |
| 515 ; ARM32: movgt [[R]], #1 | 527 ; ARM32: movgt [[R]], #1 |
| 516 | 528 |
| 517 define internal i32 @fcmpOrdFloat(float %a, float %b) { | 529 define internal i32 @fcmpOrdFloat(float %a, float %b) { |
| 518 entry: | 530 entry: |
| 519 %cmp = fcmp ord float %a, %b | 531 %cmp = fcmp ord float %a, %b |
| 520 %cmp.ret_ext = zext i1 %cmp to i32 | 532 %cmp.ret_ext = zext i1 %cmp to i32 |
| 521 ret i32 %cmp.ret_ext | 533 ret i32 %cmp.ret_ext |
| 522 } | 534 } |
| 523 ; CHECK-LABEL: fcmpOrdFloat | 535 ; CHECK-LABEL: fcmpOrdFloat |
| 524 ; CHECK: ucomiss | 536 ; CHECK: ucomiss |
| 525 ; CHECK: setnp | 537 ; CHECK: setnp |
| 526 ; ARM32-LABEL: fcmpOrdFloat | 538 ; ARM32-LABEL: fcmpOrdFloat |
| 539 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 527 ; ARM32: vcmp.f32 | 540 ; ARM32: vcmp.f32 |
| 528 ; ARM32: vmrs | 541 ; ARM32: vmrs |
| 529 ; ARM32: movvs [[R:r[0-9]+]], #0 | 542 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 530 ; ARM32: movvc [[R]], #1 | 543 ; ARM32: movvc [[R]], #1 |
| 531 | 544 |
| 532 define internal i32 @fcmpOrdDouble(double %a, double %b) { | 545 define internal i32 @fcmpOrdDouble(double %a, double %b) { |
| 533 entry: | 546 entry: |
| 534 %cmp = fcmp ord double %a, %b | 547 %cmp = fcmp ord double %a, %b |
| 535 %cmp.ret_ext = zext i1 %cmp to i32 | 548 %cmp.ret_ext = zext i1 %cmp to i32 |
| 536 ret i32 %cmp.ret_ext | 549 ret i32 %cmp.ret_ext |
| 537 } | 550 } |
| 538 ; CHECK-LABEL: fcmpOrdDouble | 551 ; CHECK-LABEL: fcmpOrdDouble |
| 539 ; CHECK: ucomisd | 552 ; CHECK: ucomisd |
| 540 ; CHECK: setnp | 553 ; CHECK: setnp |
| 541 ; ARM32-LABEL: fcmpOrdDouble | 554 ; ARM32-LABEL: fcmpOrdDouble |
| 555 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 542 ; ARM32: vcmp.f64 | 556 ; ARM32: vcmp.f64 |
| 543 ; ARM32: vmrs | 557 ; ARM32: vmrs |
| 544 ; ARM32: movvs [[R:r[0-9]+]], #0 | 558 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 545 ; ARM32: movvc [[R]], #1 | 559 ; ARM32: movvc [[R]], #1 |
| 546 | 560 |
| 547 define internal i32 @fcmpUeqFloat(float %a, float %b) { | 561 define internal i32 @fcmpUeqFloat(float %a, float %b) { |
| 548 entry: | 562 entry: |
| 549 %cmp = fcmp ueq float %a, %b | 563 %cmp = fcmp ueq float %a, %b |
| 550 %cmp.ret_ext = zext i1 %cmp to i32 | 564 %cmp.ret_ext = zext i1 %cmp to i32 |
| 551 ret i32 %cmp.ret_ext | 565 ret i32 %cmp.ret_ext |
| 552 } | 566 } |
| 553 ; CHECK-LABEL: fcmpUeqFloat | 567 ; CHECK-LABEL: fcmpUeqFloat |
| 554 ; CHECK: ucomiss | 568 ; CHECK: ucomiss |
| 555 ; CHECK: sete | 569 ; CHECK: sete |
| 556 ; ARM32-LABEL: fcmpUeqFloat | 570 ; ARM32-LABEL: fcmpUeqFloat |
| 571 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 557 ; ARM32: vcmp.f32 | 572 ; ARM32: vcmp.f32 |
| 558 ; ARM32: vmrs | 573 ; ARM32: vmrs |
| 559 ; ARM32: mov [[R:r[0-9]+]], #0 | 574 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 560 ; ARM32: moveq [[R]], #1 | 575 ; ARM32: moveq [[R]], #1 |
| 561 ; ARM32: movvs [[R]], #1 | 576 ; ARM32: movvs [[R]], #1 |
| 562 | 577 |
| 563 define internal i32 @fcmpUeqDouble(double %a, double %b) { | 578 define internal i32 @fcmpUeqDouble(double %a, double %b) { |
| 564 entry: | 579 entry: |
| 565 %cmp = fcmp ueq double %a, %b | 580 %cmp = fcmp ueq double %a, %b |
| 566 %cmp.ret_ext = zext i1 %cmp to i32 | 581 %cmp.ret_ext = zext i1 %cmp to i32 |
| 567 ret i32 %cmp.ret_ext | 582 ret i32 %cmp.ret_ext |
| 568 } | 583 } |
| 569 ; CHECK-LABEL: fcmpUeqDouble | 584 ; CHECK-LABEL: fcmpUeqDouble |
| 570 ; CHECK: ucomisd | 585 ; CHECK: ucomisd |
| 571 ; CHECK: sete | 586 ; CHECK: sete |
| 572 ; ARM32-LABEL: fcmpUeqDouble | 587 ; ARM32-LABEL: fcmpUeqDouble |
| 588 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 573 ; ARM32: vcmp.f64 | 589 ; ARM32: vcmp.f64 |
| 574 ; ARM32: vmrs | 590 ; ARM32: vmrs |
| 575 ; ARM32: mov [[R:r[0-9]+]], #0 | 591 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 576 ; ARM32: moveq [[R]], #1 | 592 ; ARM32: moveq [[R]], #1 |
| 577 ; ARM32: movvs [[R]], #1 | 593 ; ARM32: movvs [[R]], #1 |
| 578 | 594 |
| 579 define internal i32 @fcmpUgtFloat(float %a, float %b) { | 595 define internal i32 @fcmpUgtFloat(float %a, float %b) { |
| 580 entry: | 596 entry: |
| 581 %cmp = fcmp ugt float %a, %b | 597 %cmp = fcmp ugt float %a, %b |
| 582 %cmp.ret_ext = zext i1 %cmp to i32 | 598 %cmp.ret_ext = zext i1 %cmp to i32 |
| 583 ret i32 %cmp.ret_ext | 599 ret i32 %cmp.ret_ext |
| 584 } | 600 } |
| 585 ; CHECK-LABEL: fcmpUgtFloat | 601 ; CHECK-LABEL: fcmpUgtFloat |
| 586 ; CHECK: ucomiss | 602 ; CHECK: ucomiss |
| 587 ; CHECK: setb | 603 ; CHECK: setb |
| 588 ; ARM32-LABEL: fcmpUgtFloat | 604 ; ARM32-LABEL: fcmpUgtFloat |
| 605 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 589 ; ARM32: vcmp.f32 | 606 ; ARM32: vcmp.f32 |
| 590 ; ARM32: vmrs | 607 ; ARM32: vmrs |
| 591 ; ARM32: movls [[R:r[0-9]+]], #0 | 608 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 592 ; ARM32: movhi [[R]], #1 | 609 ; ARM32: movhi [[R]], #1 |
| 593 | 610 |
| 594 define internal i32 @fcmpUgtDouble(double %a, double %b) { | 611 define internal i32 @fcmpUgtDouble(double %a, double %b) { |
| 595 entry: | 612 entry: |
| 596 %cmp = fcmp ugt double %a, %b | 613 %cmp = fcmp ugt double %a, %b |
| 597 %cmp.ret_ext = zext i1 %cmp to i32 | 614 %cmp.ret_ext = zext i1 %cmp to i32 |
| 598 ret i32 %cmp.ret_ext | 615 ret i32 %cmp.ret_ext |
| 599 } | 616 } |
| 600 ; CHECK-LABEL: fcmpUgtDouble | 617 ; CHECK-LABEL: fcmpUgtDouble |
| 601 ; CHECK: ucomisd | 618 ; CHECK: ucomisd |
| 602 ; CHECK: setb | 619 ; CHECK: setb |
| 603 ; ARM32-LABEL: fcmpUgtDouble | 620 ; ARM32-LABEL: fcmpUgtDouble |
| 621 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 604 ; ARM32: vcmp.f64 | 622 ; ARM32: vcmp.f64 |
| 605 ; ARM32: vmrs | 623 ; ARM32: vmrs |
| 606 ; ARM32: movls [[R:r[0-9]+]], #0 | 624 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 607 ; ARM32: movhi [[R]], #1 | 625 ; ARM32: movhi [[R]], #1 |
| 608 | 626 |
| 609 define internal i32 @fcmpUgeFloat(float %a, float %b) { | 627 define internal i32 @fcmpUgeFloat(float %a, float %b) { |
| 610 entry: | 628 entry: |
| 611 %cmp = fcmp uge float %a, %b | 629 %cmp = fcmp uge float %a, %b |
| 612 %cmp.ret_ext = zext i1 %cmp to i32 | 630 %cmp.ret_ext = zext i1 %cmp to i32 |
| 613 ret i32 %cmp.ret_ext | 631 ret i32 %cmp.ret_ext |
| 614 } | 632 } |
| 615 ; CHECK-LABEL: fcmpUgeFloat | 633 ; CHECK-LABEL: fcmpUgeFloat |
| 616 ; CHECK: ucomiss | 634 ; CHECK: ucomiss |
| 617 ; CHECK: setbe | 635 ; CHECK: setbe |
| 618 ; ARM32-LABEL: fcmpUgeFloat | 636 ; ARM32-LABEL: fcmpUgeFloat |
| 637 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 619 ; ARM32: vcmp.f32 | 638 ; ARM32: vcmp.f32 |
| 620 ; ARM32: vmrs | 639 ; ARM32: vmrs |
| 621 ; ARM32: movmi [[R:r[0-9]+]], #0 | 640 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 622 ; ARM32: movpl [[R]], #1 | 641 ; ARM32: movpl [[R]], #1 |
| 623 | 642 |
| 624 define internal i32 @fcmpUgeDouble(double %a, double %b) { | 643 define internal i32 @fcmpUgeDouble(double %a, double %b) { |
| 625 entry: | 644 entry: |
| 626 %cmp = fcmp uge double %a, %b | 645 %cmp = fcmp uge double %a, %b |
| 627 %cmp.ret_ext = zext i1 %cmp to i32 | 646 %cmp.ret_ext = zext i1 %cmp to i32 |
| 628 ret i32 %cmp.ret_ext | 647 ret i32 %cmp.ret_ext |
| 629 } | 648 } |
| 630 ; CHECK-LABEL: fcmpUgeDouble | 649 ; CHECK-LABEL: fcmpUgeDouble |
| 631 ; CHECK: ucomisd | 650 ; CHECK: ucomisd |
| 632 ; CHECK: setbe | 651 ; CHECK: setbe |
| 633 ; ARM32-LABEL: fcmpUgeDouble | 652 ; ARM32-LABEL: fcmpUgeDouble |
| 653 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 634 ; ARM32: vcmp.f64 | 654 ; ARM32: vcmp.f64 |
| 635 ; ARM32: vmrs | 655 ; ARM32: vmrs |
| 636 ; ARM32: movmi [[R:r[0-9]+]], #0 | 656 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 637 ; ARM32: movpl [[R]], #1 | 657 ; ARM32: movpl [[R]], #1 |
| 638 | 658 |
| 639 define internal i32 @fcmpUltFloat(float %a, float %b) { | 659 define internal i32 @fcmpUltFloat(float %a, float %b) { |
| 640 entry: | 660 entry: |
| 641 %cmp = fcmp ult float %a, %b | 661 %cmp = fcmp ult float %a, %b |
| 642 %cmp.ret_ext = zext i1 %cmp to i32 | 662 %cmp.ret_ext = zext i1 %cmp to i32 |
| 643 ret i32 %cmp.ret_ext | 663 ret i32 %cmp.ret_ext |
| 644 } | 664 } |
| 645 ; CHECK-LABEL: fcmpUltFloat | 665 ; CHECK-LABEL: fcmpUltFloat |
| 646 ; CHECK: ucomiss | 666 ; CHECK: ucomiss |
| 647 ; CHECK: setb | 667 ; CHECK: setb |
| 648 ; ARM32-LABEL: fcmpUltFloat | 668 ; ARM32-LABEL: fcmpUltFloat |
| 669 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 649 ; ARM32: vcmp.f32 | 670 ; ARM32: vcmp.f32 |
| 650 ; ARM32: vmrs | 671 ; ARM32: vmrs |
| 651 ; ARM32: movge [[R:r[0-9]+]], #0 | 672 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 652 ; ARM32: movlt [[R]], #1 | 673 ; ARM32: movlt [[R]], #1 |
| 653 | 674 |
| 654 define internal i32 @fcmpUltDouble(double %a, double %b) { | 675 define internal i32 @fcmpUltDouble(double %a, double %b) { |
| 655 entry: | 676 entry: |
| 656 %cmp = fcmp ult double %a, %b | 677 %cmp = fcmp ult double %a, %b |
| 657 %cmp.ret_ext = zext i1 %cmp to i32 | 678 %cmp.ret_ext = zext i1 %cmp to i32 |
| 658 ret i32 %cmp.ret_ext | 679 ret i32 %cmp.ret_ext |
| 659 } | 680 } |
| 660 ; CHECK-LABEL: fcmpUltDouble | 681 ; CHECK-LABEL: fcmpUltDouble |
| 661 ; CHECK: ucomisd | 682 ; CHECK: ucomisd |
| 662 ; CHECK: setb | 683 ; CHECK: setb |
| 663 ; ARM32-LABEL: fcmpUltDouble | 684 ; ARM32-LABEL: fcmpUltDouble |
| 685 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 664 ; ARM32: vcmp.f64 | 686 ; ARM32: vcmp.f64 |
| 665 ; ARM32: vmrs | 687 ; ARM32: vmrs |
| 666 ; ARM32: movge [[R:r[0-9]+]], #0 | 688 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 667 ; ARM32: movlt [[R]], #1 | 689 ; ARM32: movlt [[R]], #1 |
| 668 | 690 |
| 669 define internal i32 @fcmpUleFloat(float %a, float %b) { | 691 define internal i32 @fcmpUleFloat(float %a, float %b) { |
| 670 entry: | 692 entry: |
| 671 %cmp = fcmp ule float %a, %b | 693 %cmp = fcmp ule float %a, %b |
| 672 %cmp.ret_ext = zext i1 %cmp to i32 | 694 %cmp.ret_ext = zext i1 %cmp to i32 |
| 673 ret i32 %cmp.ret_ext | 695 ret i32 %cmp.ret_ext |
| 674 } | 696 } |
| 675 ; CHECK-LABEL: fcmpUleFloat | 697 ; CHECK-LABEL: fcmpUleFloat |
| 676 ; CHECK: ucomiss | 698 ; CHECK: ucomiss |
| 677 ; CHECK: setbe | 699 ; CHECK: setbe |
| 678 ; ARM32-LABEL: fcmpUleFloat | 700 ; ARM32-LABEL: fcmpUleFloat |
| 701 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 679 ; ARM32: vcmp.f32 | 702 ; ARM32: vcmp.f32 |
| 680 ; ARM32: vmrs | 703 ; ARM32: vmrs |
| 681 ; ARM32: movgt [[R:r[0-9]+]], #0 | 704 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 682 ; ARM32: movle [[R]], #1 | 705 ; ARM32: movle [[R]], #1 |
| 683 | 706 |
| 684 define internal i32 @fcmpUleDouble(double %a, double %b) { | 707 define internal i32 @fcmpUleDouble(double %a, double %b) { |
| 685 entry: | 708 entry: |
| 686 %cmp = fcmp ule double %a, %b | 709 %cmp = fcmp ule double %a, %b |
| 687 %cmp.ret_ext = zext i1 %cmp to i32 | 710 %cmp.ret_ext = zext i1 %cmp to i32 |
| 688 ret i32 %cmp.ret_ext | 711 ret i32 %cmp.ret_ext |
| 689 } | 712 } |
| 690 ; CHECK-LABEL: fcmpUleDouble | 713 ; CHECK-LABEL: fcmpUleDouble |
| 691 ; CHECK: ucomisd | 714 ; CHECK: ucomisd |
| 692 ; CHECK: setbe | 715 ; CHECK: setbe |
| 693 ; ARM32-LABEL: fcmpUleDouble | 716 ; ARM32-LABEL: fcmpUleDouble |
| 717 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 694 ; ARM32: vcmp.f64 | 718 ; ARM32: vcmp.f64 |
| 695 ; ARM32: vmrs | 719 ; ARM32: vmrs |
| 696 ; ARM32: movgt [[R:r[0-9]+]], #0 | 720 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 697 ; ARM32: movle [[R]], #1 | 721 ; ARM32: movle [[R]], #1 |
| 698 | 722 |
| 699 define internal i32 @fcmpUneFloat(float %a, float %b) { | 723 define internal i32 @fcmpUneFloat(float %a, float %b) { |
| 700 entry: | 724 entry: |
| 701 %cmp = fcmp une float %a, %b | 725 %cmp = fcmp une float %a, %b |
| 702 %cmp.ret_ext = zext i1 %cmp to i32 | 726 %cmp.ret_ext = zext i1 %cmp to i32 |
| 703 ret i32 %cmp.ret_ext | 727 ret i32 %cmp.ret_ext |
| 704 } | 728 } |
| 705 ; CHECK-LABEL: fcmpUneFloat | 729 ; CHECK-LABEL: fcmpUneFloat |
| 706 ; CHECK: ucomiss | 730 ; CHECK: ucomiss |
| 707 ; CHECK: jne | 731 ; CHECK: jne |
| 708 ; CHECK: jp | 732 ; CHECK: jp |
| 709 ; ARM32-LABEL: fcmpUneFloat | 733 ; ARM32-LABEL: fcmpUneFloat |
| 734 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 710 ; ARM32: vcmp.f32 | 735 ; ARM32: vcmp.f32 |
| 711 ; ARM32: vmrs | 736 ; ARM32: vmrs |
| 712 ; ARM32: moveq [[R:r[0-9]+]], #0 | 737 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 713 ; ARM32: movne [[R]], #1 | 738 ; ARM32: movne [[R]], #1 |
| 714 | 739 |
| 715 define internal i32 @fcmpUneDouble(double %a, double %b) { | 740 define internal i32 @fcmpUneDouble(double %a, double %b) { |
| 716 entry: | 741 entry: |
| 717 %cmp = fcmp une double %a, %b | 742 %cmp = fcmp une double %a, %b |
| 718 %cmp.ret_ext = zext i1 %cmp to i32 | 743 %cmp.ret_ext = zext i1 %cmp to i32 |
| 719 ret i32 %cmp.ret_ext | 744 ret i32 %cmp.ret_ext |
| 720 } | 745 } |
| 721 ; CHECK-LABEL: fcmpUneDouble | 746 ; CHECK-LABEL: fcmpUneDouble |
| 722 ; CHECK: ucomisd | 747 ; CHECK: ucomisd |
| 723 ; CHECK: jne | 748 ; CHECK: jne |
| 724 ; CHECK: jp | 749 ; CHECK: jp |
| 725 ; ARM32-LABEL: fcmpUneDouble | 750 ; ARM32-LABEL: fcmpUneDouble |
| 751 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 726 ; ARM32: vcmp.f64 | 752 ; ARM32: vcmp.f64 |
| 727 ; ARM32: vmrs | 753 ; ARM32: vmrs |
| 728 ; ARM32: moveq [[R:r[0-9]+]], #0 | 754 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 729 ; ARM32: movne [[R]], #1 | 755 ; ARM32: movne [[R]], #1 |
| 730 | 756 |
| 731 define internal i32 @fcmpUnoFloat(float %a, float %b) { | 757 define internal i32 @fcmpUnoFloat(float %a, float %b) { |
| 732 entry: | 758 entry: |
| 733 %cmp = fcmp uno float %a, %b | 759 %cmp = fcmp uno float %a, %b |
| 734 %cmp.ret_ext = zext i1 %cmp to i32 | 760 %cmp.ret_ext = zext i1 %cmp to i32 |
| 735 ret i32 %cmp.ret_ext | 761 ret i32 %cmp.ret_ext |
| 736 } | 762 } |
| 737 ; CHECK-LABEL: fcmpUnoFloat | 763 ; CHECK-LABEL: fcmpUnoFloat |
| 738 ; CHECK: ucomiss | 764 ; CHECK: ucomiss |
| 739 ; CHECK: setp | 765 ; CHECK: setp |
| 740 ; ARM32-LABEL: fcmpUnoFloat | 766 ; ARM32-LABEL: fcmpUnoFloat |
| 767 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 741 ; ARM32: vcmp.f32 | 768 ; ARM32: vcmp.f32 |
| 742 ; ARM32: vmrs | 769 ; ARM32: vmrs |
| 743 ; ARM32: movvc [[R:r[0-9]+]], #0 | 770 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 744 ; ARM32: movvs [[R]], #1 | 771 ; ARM32: movvs [[R]], #1 |
| 745 | 772 |
| 746 define internal i32 @fcmpUnoDouble(double %a, double %b) { | 773 define internal i32 @fcmpUnoDouble(double %a, double %b) { |
| 747 entry: | 774 entry: |
| 748 %cmp = fcmp uno double %a, %b | 775 %cmp = fcmp uno double %a, %b |
| 749 %cmp.ret_ext = zext i1 %cmp to i32 | 776 %cmp.ret_ext = zext i1 %cmp to i32 |
| 750 ret i32 %cmp.ret_ext | 777 ret i32 %cmp.ret_ext |
| 751 } | 778 } |
| 752 ; CHECK-LABEL: fcmpUnoDouble | 779 ; CHECK-LABEL: fcmpUnoDouble |
| 753 ; CHECK: ucomisd | 780 ; CHECK: ucomisd |
| 754 ; CHECK: setp | 781 ; CHECK: setp |
| 755 ; ARM32-LABEL: fcmpUnoDouble | 782 ; ARM32-LABEL: fcmpUnoDouble |
| 783 ; ARM32-O2: mov [[R:r[0-9]+]], #0 |
| 756 ; ARM32: vcmp.f64 | 784 ; ARM32: vcmp.f64 |
| 757 ; ARM32: vmrs | 785 ; ARM32: vmrs |
| 758 ; ARM32: movvc [[R:r[0-9]+]], #0 | 786 ; ARM32-OM1: mov [[R:r[0-9]+]], #0 |
| 759 ; ARM32: movvs [[R]], #1 | 787 ; ARM32: movvs [[R]], #1 |
| 760 | 788 |
| 761 define internal i32 @fcmpTrueFloat(float %a, float %b) { | 789 define internal i32 @fcmpTrueFloat(float %a, float %b) { |
| 762 entry: | 790 entry: |
| 763 %cmp = fcmp true float %a, %b | 791 %cmp = fcmp true float %a, %b |
| 764 %cmp.ret_ext = zext i1 %cmp to i32 | 792 %cmp.ret_ext = zext i1 %cmp to i32 |
| 765 ret i32 %cmp.ret_ext | 793 ret i32 %cmp.ret_ext |
| 766 } | 794 } |
| 767 ; CHECK-LABEL: fcmpTrueFloat | 795 ; CHECK-LABEL: fcmpTrueFloat |
| 768 ; CHECK: mov {{.*}},0x1 | 796 ; CHECK: mov {{.*}},0x1 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 } | 832 } |
| 805 ; CHECK-LABEL: selectDoubleVarVar | 833 ; CHECK-LABEL: selectDoubleVarVar |
| 806 ; CHECK: ucomisd | 834 ; CHECK: ucomisd |
| 807 ; CHECK: seta | 835 ; CHECK: seta |
| 808 ; CHECK: fld | 836 ; CHECK: fld |
| 809 ; ARM32-LABEL: selectDoubleVarVar | 837 ; ARM32-LABEL: selectDoubleVarVar |
| 810 ; ARM32: vcmp.f64 | 838 ; ARM32: vcmp.f64 |
| 811 ; ARM32-OM1: vmovne.f64 d{{[0-9]+}} | 839 ; ARM32-OM1: vmovne.f64 d{{[0-9]+}} |
| 812 ; ARM32-O2: vmovmi.f64 d{{[0-9]+}} | 840 ; ARM32-O2: vmovmi.f64 d{{[0-9]+}} |
| 813 ; ARM32: bx | 841 ; ARM32: bx |
| OLD | NEW |