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