[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AVR / inline-asm / inline-asm.ll
blob26f90806781ea4381eaa817b41954bf94ef4c9ca
1 ; RUN: llc < %s -march=avr -mattr=movw -no-integrated-as | FileCheck %s
2 ; XFAIL: *
4 ; CHECK-LABEL: no_operands:
5 define void @no_operands() {
6   ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
7   call void asm sideeffect "add r24, r22", ""() nounwind
8   ret void
11 ; CHECK-LABEL: input_operand:
12 define void @input_operand(i8 %a) {
13   ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
14   call void asm sideeffect "add $0, $0", "r"(i8 %a) nounwind
15   ret void
18 ; CHECK-LABEL: simple_upper_regs:
19 define void @simple_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3,
20                                i8 %p4, i8 %p5, i8 %p6, i8 %p7) {
21   ; 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]+}}
22   call void asm sideeffect "some_instr $0, $1, $2, $3, $4, $5, $6, $7",
23                            "a,a,a,a,a,a,a,a" (i8 %p0, i8 %p1, i8 %p2, i8 %p3,
24                                               i8 %p4, i8 %p5, i8 %p6, i8 %p7) nounwind
25   ret void
28 ; CHECK-LABEL: upper_regs:
29 define void @upper_regs(i8 %p0) {
30   ; CHECK: some_instr {{r[0-9]+}}
31   call void asm sideeffect "some_instr $0", "d" (i8 %p0) nounwind
32   ret void
35 ; CHECK-LABEL: lower_regs:
36 define void @lower_regs(i8 %p0) {
37   ; CHECK: some_instr {{r[0-9]+}}
38   call void asm sideeffect "some_instr $0", "l" (i8 %p0) nounwind
39   ret void
42 ; CHECK-LABEL: special_upper_regs:
43 define void @special_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3) {
44   ; CHECK: some_instr {{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}}
45   call void asm sideeffect "some_instr $0,$1,$2,$3", "w,w,w,w" (i8 %p0, i8 %p1, i8 %p2, i8 %p3) nounwind
46   ret void
49 ; CHECK-LABEL: xyz_reg:
50 define void @xyz_reg(i16 %var) {
51   ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
52   call void asm sideeffect "some_instr $0, $1, $2", "x,y,z" (i16 %var, i16 %var, i16 %var) nounwind
53   ret void
56 ;TODO
57 ; How to use SP reg properly in inline asm??
58 ; define void @sp_reg(i16 %var)
60 ; CHECK-LABEL: ptr_reg:
61 define void @ptr_reg(i16 %var0, i16 %var1, i16 %var2) {
62   ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}
63   call void asm sideeffect "some_instr $0, $1, $2", "e,e,e" (i16 %var0, i16 %var1, i16 %var2) nounwind
64   ret void
67 ; CHECK-LABEL: base_ptr_reg:
68 define void @base_ptr_reg(i16 %var0, i16 %var1) {
69   ; CHECK: some_instr r28, r30
70   call void asm sideeffect "some_instr $0, $1", "b,b" (i16 %var0, i16 %var1) nounwind
71   ret void
74 ; CHECK-LABEL: input_output_operand:
75 define i8 @input_output_operand(i8 %a, i8 %b) {
76   ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}
77   %1 = call i8 asm "add $0, $1", "=r,r"(i8 %a) nounwind
78   ret i8 %1
81 ; CHECK-LABEL: temp_reg:
82 define void @temp_reg(i8 %a) {
83   ; CHECK: some_instr {{r[0-9]+}}
84   call void asm sideeffect "some_instr $0", "t" (i8 %a) nounwind
85   ret void
88 ; CHECK-LABEL: int_0_63:
89 define void @int_0_63() {
90   ; CHECK: some_instr 5
91   call void asm sideeffect "some_instr $0", "I" (i8 5) nounwind
92   ret void
95 ; CHECK-LABEL: int_minus63_0:
96 define void @int_minus63_0() {
97   ; CHECK: some_instr -5
98   call void asm sideeffect "some_instr $0", "J" (i8 -5) nounwind
99   ret void
102 ; CHECK-LABEL: int_2_2:
103 define void @int_2_2() {
104   ; CHECK: some_instr 2
105   call void asm sideeffect "some_instr $0", "K" (i8 2) nounwind
106   ret void
109 ; CHECK-LABEL: int_0_0:
110 define void @int_0_0() {
111   ; CHECK: some_instr 0
112   call void asm sideeffect "some_instr $0", "L" (i8 0) nounwind
113   ret void
116 ; CHECK-LABEL: int_0_255:
117 define void @int_0_255() {
118   ; CHECK: some_instr 254
119   call void asm sideeffect "some_instr $0", "M" (i8 254) nounwind
120   ret void
123 ; CHECK-LABEL: int_minus1_minus1:
124 define void @int_minus1_minus1() {
125   ; CHECK: some_instr -1
126   call void asm sideeffect "some_instr $0", "N" (i8 -1) nounwind
127   ret void
130 ; CHECK-LABEL: int_8_or_16_or_24:
131 define void @int_8_or_16_or_24() {
132   ; CHECK: some_instr 8, 16, 24
133   call void asm sideeffect "some_instr $0, $1, $2", "O,O,O" (i8 8, i8 16, i8 24) nounwind
134   ret void
137 ; CHECK-LABEL: int_1_1:
138 define void @int_1_1() {
139   ; CHECK: some_instr 1
140   call void asm sideeffect "some_instr $0", "P" (i8 1) nounwind
141   ret void
144 ; CHECK-LABEL: int_minus6_5:
145 define void @int_minus6_5() {
146   ; CHECK: some_instr -6
147   call void asm sideeffect "some_instr $0", "R" (i8 -6) nounwind
148   ret void
151 ; CHECK-LABEL: float_0_0:
152 define void @float_0_0() {
153   ; CHECK: some_instr 0
154   call void asm sideeffect "some_instr $0", "G" (float 0.0) nounwind
155   ret void
159 ; Memory constraint
161 @a = internal global i16 0, align 4
162 @b = internal global i16 0, align 4
164 ; CHECK-LABEL: mem_global:
165 define void @mem_global() {
166   ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}
167   call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* @a, i16* @b)
168   ret void
171 ; CHECK-LABEL: mem_params:
172 define void @mem_params(i16* %a, i16* %b) {
173   ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}
174   call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b)
175   ret void
178 ; CHECK-LABEL: mem_local:
179 define void @mem_local() {
180   %a = alloca i16
181   %b = alloca i16
182   ; CHECK: some_instr {{X|Y|Z}}+3, {{X|Y|Z}}+1
183   call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b)
184   ret void
187 ; CHECK-LABEL: mem_mixed:
188 define void @mem_mixed() {
189   %a = alloca i16
190   %b = alloca i16
191   ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}+3, {{X|Y|Z}}+1
192   call void asm "some_instr $0, $1, $2", "=*Q,=*Q,=*Q"(i16* @a, i16* %a, i16* %b)
193   ret void
196 ; CHECK-LABEL: mem_gep:
197 define i8 @mem_gep(i8* %p) {
198 entry:
199 ; CHECK: movw {{r[0-9]+}}, [[REG:r[0-9]+]]
200   %arrayidx = getelementptr inbounds i8, i8* %p, i16 1
201 ; CHECK: ld [[REG]], {{X|Y|Z}}+1
202   %0 = tail call i8 asm sideeffect "ld $0, $1\0A\09", "=r,*Q"(i8* %arrayidx)
203   ret i8 %0