blob: 88d0c3af2e88511f3898d54d886755697becadb5 [file] [log] [blame]
Dylan McKay19d95332017-02-22 22:41:13 +00001; RUN: llc < %s -march=avr -mattr=movw -no-integrated-as | FileCheck %s
Dylan McKayd8a603c2016-12-10 11:49:07 +00002
3; CHECK-LABEL: no_operands:
4define void @no_operands() {
5 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
6 call void asm sideeffect "add r24, r22", ""() nounwind
7 ret void
8}
9
10; CHECK-LABEL: input_operand:
11define void @input_operand(i8 %a) {
12 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
13 call void asm sideeffect "add $0, $0", "r"(i8 %a) nounwind
14 ret void
15}
16
17; CHECK-LABEL: simple_upper_regs:
18define void @simple_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3,
19 i8 %p4, i8 %p5, i8 %p6, i8 %p7) {
20 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
21 call void asm sideeffect "some_instr $0, $1, $2, $3, $4, $5, $6, $7",
22 "a,a,a,a,a,a,a,a" (i8 %p0, i8 %p1, i8 %p2, i8 %p3,
23 i8 %p4, i8 %p5, i8 %p6, i8 %p7) nounwind
24 ret void
25}
26
27; CHECK-LABEL: upper_regs:
28define void @upper_regs(i8 %p0) {
29 ; CHECK: some_instr {{r[0-9]+}}
30 call void asm sideeffect "some_instr $0", "d" (i8 %p0) nounwind
31 ret void
32}
33
34; CHECK-LABEL: lower_regs:
35define void @lower_regs(i8 %p0) {
36 ; CHECK: some_instr {{r[0-9]+}}
37 call void asm sideeffect "some_instr $0", "l" (i8 %p0) nounwind
38 ret void
39}
40
41; CHECK-LABEL: special_upper_regs:
42define void @special_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3) {
43 ; CHECK: some_instr {{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}}
44 call void asm sideeffect "some_instr $0,$1,$2,$3", "w,w,w,w" (i8 %p0, i8 %p1, i8 %p2, i8 %p3) nounwind
45 ret void
46}
47
48; CHECK-LABEL: xyz_reg:
49define void @xyz_reg(i16 %var) {
50 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
51 call void asm sideeffect "some_instr $0, $1, $2", "x,y,z" (i16 %var, i16 %var, i16 %var) nounwind
52 ret void
53}
54
55;TODO
56; How to use SP reg properly in inline asm??
57; define void @sp_reg(i16 %var)
58
59; CHECK-LABEL: ptr_reg:
60define void @ptr_reg(i16 %var0, i16 %var1, i16 %var2) {
61 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
62 call void asm sideeffect "some_instr $0, $1, $2", "e,e,e" (i16 %var0, i16 %var1, i16 %var2) nounwind
63 ret void
64}
65
66; CHECK-LABEL: base_ptr_reg:
67define void @base_ptr_reg(i16 %var0, i16 %var1) {
68 ; CHECK: some_instr r28, r30
69 call void asm sideeffect "some_instr $0, $1", "b,b" (i16 %var0, i16 %var1) nounwind
70 ret void
71}
72
73; CHECK-LABEL: input_output_operand:
74define i8 @input_output_operand(i8 %a, i8 %b) {
75 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
76 %1 = call i8 asm "add $0, $1", "=r,r"(i8 %a) nounwind
77 ret i8 %1
78}
79
80; CHECK-LABEL: temp_reg:
81define void @temp_reg(i8 %a) {
82 ; CHECK: some_instr {{r[0-9]+}}
83 call void asm sideeffect "some_instr $0", "t" (i8 %a) nounwind
84 ret void
85}
86
87; CHECK-LABEL: int_0_63:
88define void @int_0_63() {
89 ; CHECK: some_instr 5
90 call void asm sideeffect "some_instr $0", "I" (i8 5) nounwind
91 ret void
92}
93
94; CHECK-LABEL: int_minus63_0:
95define void @int_minus63_0() {
96 ; CHECK: some_instr -5
97 call void asm sideeffect "some_instr $0", "J" (i8 -5) nounwind
98 ret void
99}
100
101; CHECK-LABEL: int_2_2:
102define void @int_2_2() {
103 ; CHECK: some_instr 2
104 call void asm sideeffect "some_instr $0", "K" (i8 2) nounwind
105 ret void
106}
107
108; CHECK-LABEL: int_0_0:
109define void @int_0_0() {
110 ; CHECK: some_instr 0
111 call void asm sideeffect "some_instr $0", "L" (i8 0) nounwind
112 ret void
113}
114
115; CHECK-LABEL: int_0_255:
116define void @int_0_255() {
117 ; CHECK: some_instr 254
118 call void asm sideeffect "some_instr $0", "M" (i8 254) nounwind
119 ret void
120}
121
122; CHECK-LABEL: int_minus1_minus1:
123define void @int_minus1_minus1() {
124 ; CHECK: some_instr -1
125 call void asm sideeffect "some_instr $0", "N" (i8 -1) nounwind
126 ret void
127}
128
129; CHECK-LABEL: int_8_or_16_or_24:
130define void @int_8_or_16_or_24() {
131 ; CHECK: some_instr 8, 16, 24
132 call void asm sideeffect "some_instr $0, $1, $2", "O,O,O" (i8 8, i8 16, i8 24) nounwind
133 ret void
134}
135
136; CHECK-LABEL: int_1_1:
137define void @int_1_1() {
138 ; CHECK: some_instr 1
139 call void asm sideeffect "some_instr $0", "P" (i8 1) nounwind
140 ret void
141}
142
143; CHECK-LABEL: int_minus6_5:
144define void @int_minus6_5() {
145 ; CHECK: some_instr -6
146 call void asm sideeffect "some_instr $0", "R" (i8 -6) nounwind
147 ret void
148}
149
150; CHECK-LABEL: float_0_0:
151define void @float_0_0() {
152 ; CHECK: some_instr 0
153 call void asm sideeffect "some_instr $0", "G" (float 0.0) nounwind
154 ret void
155}
156
157
158; Memory constraint
159
160@a = internal global i16 0, align 4
161@b = internal global i16 0, align 4
162
163; CHECK-LABEL: mem_global:
164define void @mem_global() {
165 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}
166 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* @a, i16* @b)
167 ret void
168}
169
170; CHECK-LABEL: mem_params:
171define void @mem_params(i16* %a, i16* %b) {
172 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}
173 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b)
174 ret void
175}
176
177; CHECK-LABEL: mem_local:
178define void @mem_local() {
179 %a = alloca i16
180 %b = alloca i16
181 ; CHECK: some_instr {{X|Y|Z}}+3, {{X|Y|Z}}+1
182 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b)
183 ret void
184}
185
186; CHECK-LABEL: mem_mixed:
187define void @mem_mixed() {
188 %a = alloca i16
189 %b = alloca i16
190 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}+3, {{X|Y|Z}}+1
191 call void asm "some_instr $0, $1, $2", "=*Q,=*Q,=*Q"(i16* @a, i16* %a, i16* %b)
192 ret void
193}
194
195; CHECK-LABEL: mem_gep:
196define i8 @mem_gep(i8* %p) {
197entry:
198; CHECK: movw {{r[0-9]+}}, [[REG:r[0-9]+]]
199 %arrayidx = getelementptr inbounds i8, i8* %p, i16 1
200; CHECK: ld [[REG]], {{X|Y|Z}}+1
201 %0 = tail call i8 asm sideeffect "ld $0, $1\0A\09", "=r,*Q"(i8* %arrayidx)
202 ret i8 %0
203}