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