[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / CSKY / inline-asm.ll
blob4e7cb8e98e7482ef4800c53481d095464f67ab44
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -no-integrated-as < %s \
3 ; RUN:   | FileCheck -check-prefix=CSKY %s
5 @gi = external global i32
6 @mi = external global i64
8 define i32 @constraint_r(i32 %a) nounwind {
9 ; CSKY-LABEL: constraint_r:
10 ; CSKY:       # %bb.0:
11 ; CSKY-NEXT:    subi16 sp, sp, 4
12 ; CSKY-NEXT:    lrw32 a1, [.LCPI0_0]
13 ; CSKY-NEXT:    ld16.w a1, (a1, 0)
14 ; CSKY-NEXT:    #APP
15 ; CSKY-NEXT:    add a0, a0, a1
16 ; CSKY-NEXT:    #NO_APP
17 ; CSKY-NEXT:    addi16 sp, sp, 4
18 ; CSKY-NEXT:    rts16
19 ; CSKY-NEXT:    .p2align 1
20 ; CSKY-NEXT:  # %bb.1:
21 ; CSKY-NEXT:    .p2align 2
22 ; CSKY-NEXT:  .LCPI0_0:
23 ; CSKY-NEXT:    .long gi
24   %1 = load i32, i32* @gi
25   %2 = tail call i32 asm "add $0, $1, $2", "=r,r,r"(i32 %a, i32 %1)
26   ret i32 %2
29 define i64 @constraint_r_i64(i32 %a) nounwind {
30 ; CSKY-LABEL: constraint_r_i64:
31 ; CSKY:       # %bb.0:
32 ; CSKY-NEXT:    subi16 sp, sp, 4
33 ; CSKY-NEXT:    lrw32 a3, [.LCPI1_0]
34 ; CSKY-NEXT:    ld16.w a1, (a3, 0)
35 ; CSKY-NEXT:    ld16.w a2, (a3, 4)
36 ; CSKY-NEXT:    #APP
37 ; CSKY-NEXT:    mula.s32 a1, a0, a0
38 ; CSKY-NEXT:    #NO_APP
39 ; CSKY-NEXT:    mov16 a0, a1
40 ; CSKY-NEXT:    mov16 a1, a2
41 ; CSKY-NEXT:    addi16 sp, sp, 4
42 ; CSKY-NEXT:    rts16
43 ; CSKY-NEXT:    .p2align 1
44 ; CSKY-NEXT:  # %bb.1:
45 ; CSKY-NEXT:    .p2align 2
46 ; CSKY-NEXT:  .LCPI1_0:
47 ; CSKY-NEXT:    .long mi
48   %1 = load i64, i64* @mi
49   %2 = call i64 asm "mula.s32 $0, $1, $2", "=r,r,r,0"(i32 %a, i32 %a, i64 %1)
50   ret i64 %2
53 define i32 @constraint_a(i32 %a) nounwind {
54 ; CSKY-LABEL: constraint_a:
55 ; CSKY:       # %bb.0:
56 ; CSKY-NEXT:    subi16 sp, sp, 4
57 ; CSKY-NEXT:    lrw32 a1, [.LCPI2_0]
58 ; CSKY-NEXT:    ld16.w a1, (a1, 0)
59 ; CSKY-NEXT:    #APP
60 ; CSKY-NEXT:    add a0, a0, a1
61 ; CSKY-NEXT:    #NO_APP
62 ; CSKY-NEXT:    addi16 sp, sp, 4
63 ; CSKY-NEXT:    rts16
64 ; CSKY-NEXT:    .p2align 1
65 ; CSKY-NEXT:  # %bb.1:
66 ; CSKY-NEXT:    .p2align 2
67 ; CSKY-NEXT:  .LCPI2_0:
68 ; CSKY-NEXT:    .long gi
69   %1 = load i32, i32* @gi
70   %2 = tail call i32 asm "add $0, $1, $2", "=a,a,a"(i32 %a, i32 %1)
71   ret i32 %2
74 define i32 @constraint_b(i32 %a) nounwind {
75 ; CSKY-LABEL: constraint_b:
76 ; CSKY:       # %bb.0:
77 ; CSKY-NEXT:    subi16 sp, sp, 4
78 ; CSKY-NEXT:    lrw32 a1, [.LCPI3_0]
79 ; CSKY-NEXT:    ld16.w a1, (a1, 0)
80 ; CSKY-NEXT:    #APP
81 ; CSKY-NEXT:    add a0, a0, a1
82 ; CSKY-NEXT:    #NO_APP
83 ; CSKY-NEXT:    addi16 sp, sp, 4
84 ; CSKY-NEXT:    rts16
85 ; CSKY-NEXT:    .p2align 1
86 ; CSKY-NEXT:  # %bb.1:
87 ; CSKY-NEXT:    .p2align 2
88 ; CSKY-NEXT:  .LCPI3_0:
89 ; CSKY-NEXT:    .long gi
90   %1 = load i32, i32* @gi
91   %2 = tail call i32 asm "add $0, $1, $2", "=b,b,b"(i32 %a, i32 %1)
92   ret i32 %2
95 define i32 @constraint_z(i32 %a) nounwind {
96 ; CSKY-LABEL: constraint_z:
97 ; CSKY:       # %bb.0:
98 ; CSKY-NEXT:    subi16 sp, sp, 4
99 ; CSKY-NEXT:    mov16 sp, a0
100 ; CSKY-NEXT:    lrw32 a0, [.LCPI4_0]
101 ; CSKY-NEXT:    ld16.w a0, (a0, 0)
102 ; CSKY-NEXT:    #APP
103 ; CSKY-NEXT:    add a0, sp, a0
104 ; CSKY-NEXT:    #NO_APP
105 ; CSKY-NEXT:    addi16 sp, sp, 4
106 ; CSKY-NEXT:    rts16
107 ; CSKY-NEXT:    .p2align 1
108 ; CSKY-NEXT:  # %bb.1:
109 ; CSKY-NEXT:    .p2align 2
110 ; CSKY-NEXT:  .LCPI4_0:
111 ; CSKY-NEXT:    .long gi
112   %1 = load i32, i32* @gi
113   %2 = tail call i32 asm "add $0, $1, $2", "=r,z,r"(i32 %a, i32 %1)
114   ret i32 %2
117 define i32 @constraint_c(i32 %a, i32 %b) nounwind {
118 ; CSKY-LABEL: constraint_c:
119 ; CSKY:       # %bb.0:
120 ; CSKY-NEXT:    subi16 sp, sp, 4
121 ; CSKY-NEXT:    lrw32 a1, [.LCPI5_0]
122 ; CSKY-NEXT:    ld16.w a1, (a1, 0)
123 ; CSKY-NEXT:    #APP
124 ; CSKY-NEXT:    addc a0, a0, a1
125 ; CSKY-NEXT:    #NO_APP
126 ; CSKY-NEXT:    addi16 sp, sp, 4
127 ; CSKY-NEXT:    rts16
128 ; CSKY-NEXT:    .p2align 1
129 ; CSKY-NEXT:  # %bb.1:
130 ; CSKY-NEXT:    .p2align 2
131 ; CSKY-NEXT:  .LCPI5_0:
132 ; CSKY-NEXT:    .long gi
133   %1 = load i32, i32* @gi
134   %2 = tail call i32 asm "addc $0, $1, $2", "=r,r,r,~{c}"(i32 %a, i32 %1)
135   ret i32 %2
138 define i32 @constraint_i(i32 %a) nounwind {
139 ; CSKY-LABEL: constraint_i:
140 ; CSKY:       # %bb.0:
141 ; CSKY-NEXT:    subi16 sp, sp, 4
142 ; CSKY-NEXT:    #APP
143 ; CSKY-NEXT:    addi a0, a0, 113
144 ; CSKY-NEXT:    #NO_APP
145 ; CSKY-NEXT:    addi16 sp, sp, 4
146 ; CSKY-NEXT:    rts16
148   %1 = load i32, i32* @gi
149   %2 = tail call i32 asm "addi $0, $1, $2", "=r,r,i"(i32 %a, i32 113)
150   ret i32 %2
153 define void @constraint_m(i32* %a) nounwind {
154 ; CSKY-LABEL: constraint_m:
155 ; CSKY:       # %bb.0:
156 ; CSKY-NEXT:    subi16 sp, sp, 4
157 ; CSKY-NEXT:    #APP
158 ; CSKY-NEXT:    #NO_APP
159 ; CSKY-NEXT:    addi16 sp, sp, 4
160 ; CSKY-NEXT:    rts16
162   call void asm sideeffect "", "=*m"(i32* elementtype(i32) %a)
163   ret void
166 define i32 @constraint_m2(i32* %a) nounwind {
167 ; CSKY-LABEL: constraint_m2:
168 ; CSKY:       # %bb.0:
169 ; CSKY-NEXT:    subi16 sp, sp, 4
170 ; CSKY-NEXT:    #APP
171 ; CSKY-NEXT:    ld.w a0, (a0, 0)
172 ; CSKY-NEXT:    #NO_APP
173 ; CSKY-NEXT:    addi16 sp, sp, 4
174 ; CSKY-NEXT:    rts16
176   %1 = tail call i32 asm "ld.w $0, $1", "=r,*m"(i32* elementtype(i32) %a)
177   ret i32 %1
180 define i32 @modifier_i_imm(i32 %a) nounwind {
181 ; CSKY-LABEL: modifier_i_imm:
182 ; CSKY:       # %bb.0:
183 ; CSKY-NEXT:    subi16 sp, sp, 4
184 ; CSKY-NEXT:    #APP
185 ; CSKY-NEXT:    addi a0, a0, 1
186 ; CSKY-NEXT:    #NO_APP
187 ; CSKY-NEXT:    addi16 sp, sp, 4
188 ; CSKY-NEXT:    rts16
189   %1 = tail call i32 asm "addi $0, $1, $2", "=r,r,ri"(i32 %a, i32 1)
190   ret i32 %1
193 define void @operand_global() nounwind {
194 ; CSKY-LABEL: operand_global:
195 ; CSKY:       # %bb.0:
196 ; CSKY-NEXT:    subi16 sp, sp, 4
197 ; CSKY-NEXT:    #APP
198 ; CSKY-NEXT:    .4byte gi
199 ; CSKY-NEXT:    #NO_APP
200 ; CSKY-NEXT:    addi16 sp, sp, 4
201 ; CSKY-NEXT:    rts16
203   tail call void asm sideeffect ".4byte $0", "i"(i32* @gi)
204   ret void
207 define void @operand_block_address() nounwind {
208 ; CSKY-LABEL: operand_block_address:
209 ; CSKY:       # %bb.0:
210 ; CSKY-NEXT:    subi16 sp, sp, 4
211 ; CSKY-NEXT:    #APP
212 ; CSKY-NEXT:    br32 .Ltmp0
213 ; CSKY-NEXT:    #NO_APP
214 ; CSKY-NEXT:  .Ltmp0: # Block address taken
215 ; CSKY-NEXT:  # %bb.1: # %bb
216 ; CSKY-NEXT:    addi16 sp, sp, 4
217 ; CSKY-NEXT:    rts16
219   call void asm sideeffect "br32 $0", "i"(i8* blockaddress(@operand_block_address, %bb))
220   br label %bb
222   ret void
225 ; TODO: expand tests for more complex constraints, out of range immediates etc