@@ -370,3 +370,181 @@ entry:
370
370
%r = select i1 %c , i64 %a , i64 %ands
371
371
ret i64 %r
372
372
}
373
+
374
+ ; Test EOR.
375
+ define i32 @test1_eor (i32 %a ) {
376
+ ; CHECK-LABEL: test1_eor:
377
+ ; CHECK: // %bb.0: // %entry
378
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
379
+ ; CHECK-NEXT: movk w8, #32, lsl #16
380
+ ; CHECK-NEXT: eor w0, w0, w8
381
+ ; CHECK-NEXT: ret
382
+ entry:
383
+ %eor = xor i32 %a , 2098176
384
+ ret i32 %eor
385
+ }
386
+
387
+ ; This constant should not be split because it can be handled by one mov.
388
+ define i32 @test2_eor (i32 %a ) {
389
+ ; CHECK-LABEL: test2_eor:
390
+ ; CHECK: // %bb.0: // %entry
391
+ ; CHECK-NEXT: mov w8, #135 // =0x87
392
+ ; CHECK-NEXT: eor w0, w0, w8
393
+ ; CHECK-NEXT: ret
394
+ entry:
395
+ %eor = xor i32 %a , 135
396
+ ret i32 %eor
397
+ }
398
+
399
+ ; This constant should not be split because the split immediate is not valid
400
+ ; bitmask immediate.
401
+ define i32 @test3_eor (i32 %a ) {
402
+ ; CHECK-LABEL: test3_eor:
403
+ ; CHECK: // %bb.0: // %entry
404
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
405
+ ; CHECK-NEXT: movk w8, #33, lsl #16
406
+ ; CHECK-NEXT: eor w0, w0, w8
407
+ ; CHECK-NEXT: ret
408
+ entry:
409
+ %eor = xor i32 %a , 2163712
410
+ ret i32 %eor
411
+ }
412
+
413
+ define i64 @test4_eor (i64 %a ) {
414
+ ; CHECK-LABEL: test4_eor:
415
+ ; CHECK: // %bb.0: // %entry
416
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
417
+ ; CHECK-NEXT: movk w8, #32, lsl #16
418
+ ; CHECK-NEXT: eor x0, x0, x8
419
+ ; CHECK-NEXT: ret
420
+ entry:
421
+ %eor = xor i64 %a , 2098176
422
+ ret i64 %eor
423
+ }
424
+
425
+ define i64 @test5_eor (i64 %a ) {
426
+ ; CHECK-LABEL: test5_eor:
427
+ ; CHECK: // %bb.0: // %entry
428
+ ; CHECK-NEXT: mov x8, #16384 // =0x4000
429
+ ; CHECK-NEXT: movk x8, #2, lsl #32
430
+ ; CHECK-NEXT: eor x0, x0, x8
431
+ ; CHECK-NEXT: ret
432
+ entry:
433
+ %eor = xor i64 %a , 8589950976
434
+ ret i64 %eor
435
+ }
436
+
437
+ ; This constant should not be split because it can be handled by one mov.
438
+ define i64 @test6_eor (i64 %a ) {
439
+ ; CHECK-LABEL: test6_eor:
440
+ ; CHECK: // %bb.0: // %entry
441
+ ; CHECK-NEXT: mov w8, #135 // =0x87
442
+ ; CHECK-NEXT: eor x0, x0, x8
443
+ ; CHECK-NEXT: ret
444
+ entry:
445
+ %eor = xor i64 %a , 135
446
+ ret i64 %eor
447
+ }
448
+
449
+ ; This constant should not be split because the split immediate is not valid
450
+ ; bitmask immediate.
451
+ define i64 @test7_eor (i64 %a ) {
452
+ ; CHECK-LABEL: test7_eor:
453
+ ; CHECK: // %bb.0: // %entry
454
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
455
+ ; CHECK-NEXT: movk w8, #33, lsl #16
456
+ ; CHECK-NEXT: eor x0, x0, x8
457
+ ; CHECK-NEXT: ret
458
+ entry:
459
+ %eor = xor i64 %a , 2163712
460
+ ret i64 %eor
461
+ }
462
+
463
+ ; Test ORR.
464
+ define i32 @test1_orr (i32 %a ) {
465
+ ; CHECK-LABEL: test1_orr:
466
+ ; CHECK: // %bb.0: // %entry
467
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
468
+ ; CHECK-NEXT: movk w8, #32, lsl #16
469
+ ; CHECK-NEXT: orr w0, w0, w8
470
+ ; CHECK-NEXT: ret
471
+ entry:
472
+ %orr = or i32 %a , 2098176
473
+ ret i32 %orr
474
+ }
475
+
476
+ ; This constant should not be split because it can be handled by one mov.
477
+ define i32 @test2_orr (i32 %a ) {
478
+ ; CHECK-LABEL: test2_orr:
479
+ ; CHECK: // %bb.0: // %entry
480
+ ; CHECK-NEXT: mov w8, #135 // =0x87
481
+ ; CHECK-NEXT: orr w0, w0, w8
482
+ ; CHECK-NEXT: ret
483
+ entry:
484
+ %orr = or i32 %a , 135
485
+ ret i32 %orr
486
+ }
487
+
488
+ ; This constant should not be split because the split immediate is not valid
489
+ ; bitmask immediate.
490
+ define i32 @test3_orr (i32 %a ) {
491
+ ; CHECK-LABEL: test3_orr:
492
+ ; CHECK: // %bb.0: // %entry
493
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
494
+ ; CHECK-NEXT: movk w8, #33, lsl #16
495
+ ; CHECK-NEXT: orr w0, w0, w8
496
+ ; CHECK-NEXT: ret
497
+ entry:
498
+ %orr = or i32 %a , 2163712
499
+ ret i32 %orr
500
+ }
501
+
502
+ define i64 @test4_orr (i64 %a ) {
503
+ ; CHECK-LABEL: test4_orr:
504
+ ; CHECK: // %bb.0: // %entry
505
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
506
+ ; CHECK-NEXT: movk w8, #32, lsl #16
507
+ ; CHECK-NEXT: orr x0, x0, x8
508
+ ; CHECK-NEXT: ret
509
+ entry:
510
+ %orr = or i64 %a , 2098176
511
+ ret i64 %orr
512
+ }
513
+
514
+ define i64 @test5_orr (i64 %a ) {
515
+ ; CHECK-LABEL: test5_orr:
516
+ ; CHECK: // %bb.0: // %entry
517
+ ; CHECK-NEXT: mov x8, #16384 // =0x4000
518
+ ; CHECK-NEXT: movk x8, #2, lsl #32
519
+ ; CHECK-NEXT: orr x0, x0, x8
520
+ ; CHECK-NEXT: ret
521
+ entry:
522
+ %orr = or i64 %a , 8589950976
523
+ ret i64 %orr
524
+ }
525
+
526
+ ; This constant should not be split because it can be handled by one mov.
527
+ define i64 @test6_orr (i64 %a ) {
528
+ ; CHECK-LABEL: test6_orr:
529
+ ; CHECK: // %bb.0: // %entry
530
+ ; CHECK-NEXT: mov w8, #135 // =0x87
531
+ ; CHECK-NEXT: orr x0, x0, x8
532
+ ; CHECK-NEXT: ret
533
+ entry:
534
+ %orr = or i64 %a , 135
535
+ ret i64 %orr
536
+ }
537
+
538
+ ; This constant should not be split because the split immediate is not valid
539
+ ; bitmask immediate.
540
+ define i64 @test7_orr (i64 %a ) {
541
+ ; CHECK-LABEL: test7_orr:
542
+ ; CHECK: // %bb.0: // %entry
543
+ ; CHECK-NEXT: mov w8, #1024 // =0x400
544
+ ; CHECK-NEXT: movk w8, #33, lsl #16
545
+ ; CHECK-NEXT: orr x0, x0, x8
546
+ ; CHECK-NEXT: ret
547
+ entry:
548
+ %orr = or i64 %a , 2163712
549
+ ret i64 %orr
550
+ }
0 commit comments