Skip to content

Commit 4f0ec22

Browse files
committed
Add tests.
1 parent 10c3894 commit 4f0ec22

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed

llvm/test/CodeGen/AArch64/aarch64-split-and-bitmask-immediate.ll renamed to llvm/test/CodeGen/AArch64/aarch64-split-logic-bitmask-immediate.ll

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,3 +370,181 @@ entry:
370370
%r = select i1 %c, i64 %a, i64 %ands
371371
ret i64 %r
372372
}
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

Comments
 (0)