1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s \
3 ; RUN: | FileCheck --check-prefix=LA32 %s
4 ; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s \
5 ; RUN: | FileCheck --check-prefix=LA64 %s
7 ;; These test that we can use architectural names ($r*) refer to registers in
8 ;; inline asm constraint lists. In each case, the named register should be used
9 ;; for the source register of the `addi.w`. It is very likely that `$a0` will
10 ;; be chosen as the designation register, but this is left to the compiler to
13 ;; Parenthesised registers in comments are the other aliases for this register.
15 ;; NOTE: This test has to pass in 0 to the inline asm, because that's the only
16 ;; value `$r0` (`$zero`) can take.
17 define i32 @register_r0() nounwind {
18 ; LA32-LABEL: register_r0:
21 ; LA32-NEXT: addi.w $a0, $zero, 0
25 ; LA64-LABEL: register_r0:
28 ; LA64-NEXT: addi.w $a0, $zero, 0
31 %1 = tail call i32 asm "addi.w $0, $1, 0", "=r,{$r0}"(i32 0)
35 define i32 @register_r4(i32 %a) nounwind {
36 ; LA32-LABEL: register_r4:
39 ; LA32-NEXT: addi.w $a0, $a0, 1
43 ; LA64-LABEL: register_r4:
46 ; LA64-NEXT: addi.w $a0, $a0, 1
49 %1 = tail call i32 asm "addi.w $0, $1, 1", "=r,{$r4}"(i32 %a)
53 ;; NOTE: This test uses `$r22` (`$s9`, `$fp`) as an input, so it should be saved.
54 define i32 @register_r22(i32 %a) nounwind {
55 ; LA32-LABEL: register_r22:
57 ; LA32-NEXT: addi.w $sp, $sp, -16
58 ; LA32-NEXT: st.w $fp, $sp, 12 # 4-byte Folded Spill
59 ; LA32-NEXT: move $fp, $a0
61 ; LA32-NEXT: addi.w $a0, $fp, 1
63 ; LA32-NEXT: ld.w $fp, $sp, 12 # 4-byte Folded Reload
64 ; LA32-NEXT: addi.w $sp, $sp, 16
67 ; LA64-LABEL: register_r22:
69 ; LA64-NEXT: addi.d $sp, $sp, -16
70 ; LA64-NEXT: st.d $fp, $sp, 8 # 8-byte Folded Spill
71 ; LA64-NEXT: move $fp, $a0
73 ; LA64-NEXT: addi.w $a0, $fp, 1
75 ; LA64-NEXT: ld.d $fp, $sp, 8 # 8-byte Folded Reload
76 ; LA64-NEXT: addi.d $sp, $sp, 16
78 %1 = tail call i32 asm "addi.w $0, $1, 1", "=r,{$r22}"(i32 %a)
82 ;; NOTE: This test uses `$r31` (`$s8`) as an input, so it should be saved.
83 define i32 @register_r31(i32 %a) nounwind {
84 ; LA32-LABEL: register_r31:
86 ; LA32-NEXT: addi.w $sp, $sp, -16
87 ; LA32-NEXT: st.w $s8, $sp, 12 # 4-byte Folded Spill
88 ; LA32-NEXT: move $s8, $a0
90 ; LA32-NEXT: addi.w $a0, $s8, 1
92 ; LA32-NEXT: ld.w $s8, $sp, 12 # 4-byte Folded Reload
93 ; LA32-NEXT: addi.w $sp, $sp, 16
96 ; LA64-LABEL: register_r31:
98 ; LA64-NEXT: addi.d $sp, $sp, -16
99 ; LA64-NEXT: st.d $s8, $sp, 8 # 8-byte Folded Spill
100 ; LA64-NEXT: move $s8, $a0
102 ; LA64-NEXT: addi.w $a0, $s8, 1
104 ; LA64-NEXT: ld.d $s8, $sp, 8 # 8-byte Folded Reload
105 ; LA64-NEXT: addi.d $sp, $sp, 16
107 %1 = tail call i32 asm "addi.w $0, $1, 1", "=r,{$r31}"(i32 %a)