1 ; RUN: llc < %s | FileCheck %s
3 target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16"
4 target triple = "msp430---elf"
6 define void @test() #0 {
12 call void @f_i16(i16 1)
14 ; CHECK: mov #772, r12
15 ; CHECK: mov #258, r13
17 call void @f_i32(i32 16909060)
19 ; CHECK: mov #1800, r12
20 ; CHECK: mov #1286, r13
21 ; CHECK: mov #772, r14
22 ; CHECK: mov #258, r15
24 call void @f_i64(i64 72623859790382856)
26 ; CHECK: mov #772, r12
27 ; CHECK: mov #258, r13
28 ; CHECK: mov #1800, r14
29 ; CHECK: mov #1286, r15
30 ; CHECK: call #f_i32_i32
31 call void @f_i32_i32(i32 16909060, i32 84281096)
34 ; CHECK: mov #772, r13
35 ; CHECK: mov #258, r14
37 ; CHECK: call #f_i16_i32_i16
38 call void @f_i16_i32_i16(i16 1, i32 16909060, i16 2)
40 ; CHECK: mov #1286, 0(r1)
42 ; CHECK: mov #772, r13
43 ; CHECK: mov #258, r14
44 ; CHECK: mov #1800, r15
45 ; CHECK: call #f_i16_i32_i32
46 call void @f_i16_i32_i32(i16 1, i32 16909060, i32 84281096)
48 ; CHECK: mov #258, 6(r1)
49 ; CHECK: mov #772, 4(r1)
50 ; CHECK: mov #1286, 2(r1)
51 ; CHECK: mov #1800, 0(r1)
54 ; CHECK: call #f_i16_i64_i16
55 call void @f_i16_i64_i16(i16 1, i64 72623859790382856, i16 2)
57 ; Check that r15 is not used and the last i32 argument passed through the stack.
58 ; CHECK: mov #258, 10(r1)
59 ; CHECK: mov #772, 8(r1)
60 ; CHECK: mov #258, 6(r1)
61 ; CHECK: mov #772, 4(r1)
62 ; CHECK: mov #1286, 2(r1)
63 ; CHECK: mov #1800, 0(r1)
65 ; CHECK: mov #772, r13
66 ; CHECK: mov #258, r14
67 call void @f_i16_i64_i32_i32(i16 1, i64 72623859790382856, i32 16909060, i32 16909060)
69 ; CHECK: mov #258, 6(r1)
70 ; CHECK: mov #772, 4(r1)
71 ; CHECK: mov #1286, 2(r1)
72 ; CHECK: mov #1800, 0(r1)
73 ; CHECK: mov #1800, r12
74 ; CHECK: mov #1286, r13
75 ; CHECK: mov #772, r14
76 ; CHECK: mov #258, r15
77 ; CHECK: call #f_i64_i64
78 call void @f_i64_i64(i64 72623859790382856, i64 72623859790382856)
83 @g_i16 = common global i16 0, align 2
84 @g_i32 = common global i32 0, align 2
85 @g_i64 = common global i64 0, align 2
87 define void @f_i16(i16 %a) #0 {
89 ; CHECK: mov r12, &g_i16
90 store volatile i16 %a, i16* @g_i16, align 2
94 define void @f_i32(i32 %a) #0 {
96 ; CHECK: mov r13, &g_i32+2
97 ; CHECK: mov r12, &g_i32
98 store volatile i32 %a, i32* @g_i32, align 2
102 define void @f_i64(i64 %a) #0 {
104 ; CHECK: mov r15, &g_i64+6
105 ; CHECK: mov r14, &g_i64+4
106 ; CHECK: mov r13, &g_i64+2
107 ; CHECK: mov r12, &g_i64
108 store volatile i64 %a, i64* @g_i64, align 2
112 define void @f_i32_i32(i32 %a, i32 %b) #0 {
114 ; CHECK: mov r13, &g_i32+2
115 ; CHECK: mov r12, &g_i32
116 store volatile i32 %a, i32* @g_i32, align 2
117 ; CHECK: mov r15, &g_i32+2
118 ; CHECK: mov r14, &g_i32
119 store volatile i32 %b, i32* @g_i32, align 2
123 define void @f_i16_i32_i32(i16 %a, i32 %b, i32 %c) #0 {
124 ; CHECK: f_i16_i32_i32:
125 ; CHECK: mov r12, &g_i16
126 store volatile i16 %a, i16* @g_i16, align 2
127 ; CHECK: mov r14, &g_i32+2
128 ; CHECK: mov r13, &g_i32
129 store volatile i32 %b, i32* @g_i32, align 2
130 ; CHECK: mov r15, &g_i32
131 ; CHECK: mov 4(r4), &g_i32+2
132 store volatile i32 %c, i32* @g_i32, align 2
136 define void @f_i16_i32_i16(i16 %a, i32 %b, i16 %c) #0 {
137 ; CHECK: f_i16_i32_i16:
138 ; CHECK: mov r12, &g_i16
139 store volatile i16 %a, i16* @g_i16, align 2
140 ; CHECK: mov r14, &g_i32+2
141 ; CHECK: mov r13, &g_i32
142 store volatile i32 %b, i32* @g_i32, align 2
143 ; CHECK: mov r15, &g_i16
144 store volatile i16 %c, i16* @g_i16, align 2
148 define void @f_i16_i64_i16(i16 %a, i64 %b, i16 %c) #0 {
149 ; CHECK: f_i16_i64_i16:
150 ; CHECK: mov r12, &g_i16
151 store volatile i16 %a, i16* @g_i16, align 2
152 ;CHECK: mov 10(r4), &g_i64+6
153 ;CHECK: mov 8(r4), &g_i64+4
154 ;CHECK: mov 6(r4), &g_i64+2
155 ;CHECK: mov 4(r4), &g_i64
156 store volatile i64 %b, i64* @g_i64, align 2
157 ;CHECK: mov r13, &g_i16
158 store volatile i16 %c, i16* @g_i16, align 2
162 define void @f_i64_i64(i64 %a, i64 %b) #0 {
164 ; CHECK: mov r15, &g_i64+6
165 ; CHECK: mov r14, &g_i64+4
166 ; CHECK: mov r13, &g_i64+2
167 ; CHECK: mov r12, &g_i64
168 store volatile i64 %a, i64* @g_i64, align 2
169 ; CHECK-DAG: mov 10(r4), &g_i64+6
170 ; CHECK-DAG: mov 8(r4), &g_i64+4
171 ; CHECK-DAG: mov 6(r4), &g_i64+2
172 ; CHECK-DAG: mov 4(r4), &g_i64
173 store volatile i64 %b, i64* @g_i64, align 2
177 define void @f_i16_i64_i32_i32(i16 %a, i64 %b, i32 %c, i32 %d) #0 {
178 ; CHECK-LABEL: f_i16_i64_i32_i32:
179 ; CHECK: mov r12, &g_i16
180 store volatile i16 %a, i16* @g_i16, align 2
181 ; CHECK: mov 10(r4), &g_i64+6
182 ; CHECK: mov 8(r4), &g_i64+4
183 ; CHECK: mov 6(r4), &g_i64+2
184 ; CHECK: mov 4(r4), &g_i64
185 store volatile i64 %b, i64* @g_i64, align 2
186 ; CHECK: mov r14, &g_i32+2
187 ; CHECK: mov r13, &g_i32
188 store volatile i32 %c, i32* @g_i32, align 2
189 ; CHECK: mov 14(r4), &g_i32+2
190 ; CHECK: mov 12(r4), &g_i32
191 store volatile i32 %d, i32* @g_i32, align 2
195 ; For helper functions which take two long long arguments
196 ; the first argument is passed in R8::R11 and the second argument
199 @g_i64_2 = common global i64 0, align 2
201 define i64 @helper_call_i64() #0 {
202 %1 = load i64, i64* @g_i64, align 2
203 %2 = load i64, i64* @g_i64_2, align 2
204 ; CHECK-LABEL: helper_call_i64:
205 ; CHECK: mov &g_i64, r8
206 ; CHECK: mov &g_i64+2, r9
207 ; CHECK: mov &g_i64+4, r10
208 ; CHECK: mov &g_i64+6, r11
209 ; CHECK: mov &g_i64_2, r12
210 ; CHECK: mov &g_i64_2+2, r13
211 ; CHECK: mov &g_i64_2+4, r14
212 ; CHECK: mov &g_i64_2+6, r15
213 ; CHECK: call #__mspabi_divlli
218 attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }