xref: /llvm-project/llvm/test/CodeGen/CSKY/inline-asm.ll (revision 423ac3d9ee82ff48da91b35ec80497089bc55b9e)
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
4
5@gi = external global i32
6@mi = external global i64
7
8define 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, ptr @gi
25  %2 = tail call i32 asm "add $0, $1, $2", "=r,r,r"(i32 %a, i32 %1)
26  ret i32 %2
27}
28
29define 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, ptr @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
51}
52
53define 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, ptr @gi
70  %2 = tail call i32 asm "add $0, $1, $2", "=a,a,a"(i32 %a, i32 %1)
71  ret i32 %2
72}
73
74define 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, ptr @gi
91  %2 = tail call i32 asm "add $0, $1, $2", "=b,b,b"(i32 %a, i32 %1)
92  ret i32 %2
93}
94
95define 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, ptr @gi
113  %2 = tail call i32 asm "add $0, $1, $2", "=r,z,r"(i32 %a, i32 %1)
114  ret i32 %2
115}
116
117define 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, ptr @gi
134  %2 = tail call i32 asm "addc $0, $1, $2", "=r,r,r,~{c}"(i32 %a, i32 %1)
135  ret i32 %2
136}
137
138define 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
147
148  %1 = load i32, ptr @gi
149  %2 = tail call i32 asm "addi $0, $1, $2", "=r,r,i"(i32 %a, i32 113)
150  ret i32 %2
151}
152
153define void @constraint_m(ptr %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
161
162  call void asm sideeffect "", "=*m"(ptr elementtype(i32) %a)
163  ret void
164}
165
166define i32 @constraint_m2(ptr %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
175
176  %1 = tail call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %a)
177  ret i32 %1
178}
179
180define 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
191}
192
193define 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
202
203  tail call void asm sideeffect ".4byte $0", "i"(ptr @gi)
204  ret void
205}
206
207define 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
218
219  call void asm sideeffect "br32 $0", "i"(ptr blockaddress(@operand_block_address, %bb))
220  br label %bb
221bb:
222  ret void
223}
224
225; TODO: expand tests for more complex constraints, out of range immediates etc
226