1; RUN: llc < %s -march=avr | FileCheck %s
2
3; CHECK-LABEL: ret_void_args_struct_i8_i32
4define void @ret_void_args_struct_i8_i32({ i8, i32 } %a) {
5start:
6  ; CHECK:      sts     4, r20
7  %0 = extractvalue { i8, i32 } %a, 0
8  store volatile i8 %0, i8* inttoptr (i64 4 to i8*)
9
10  ; CHECK-NEXT: sts     8, r24
11  ; CHECK-NEXT: sts     7, r23
12  ; CHECK-NEXT: sts     6, r22
13  ; CHECK-NEXT: sts     5, r21
14  %1 = extractvalue { i8, i32 } %a, 1
15  store volatile i32 %1, i32* inttoptr (i64 5 to i32*)
16  ret void
17}
18
19; CHECK-LABEL: ret_void_args_struct_i8_i8_i8_i8
20define void @ret_void_args_struct_i8_i8_i8_i8({ i8, i8, i8, i8 } %a) {
21start:
22  ; CHECK:      sts     4, r22
23  %0 = extractvalue { i8, i8, i8, i8 } %a, 0
24  store volatile i8 %0, i8* inttoptr (i64 4 to i8*)
25  ; CHECK-NEXT: sts     5, r23
26  %1 = extractvalue { i8, i8, i8, i8 } %a, 1
27  store volatile i8 %1, i8* inttoptr (i64 5 to i8*)
28  ; CHECK-NEXT: sts     6, r24
29  %2 = extractvalue { i8, i8, i8, i8 } %a, 2
30  store volatile i8 %2, i8* inttoptr (i64 6 to i8*)
31  ; CHECK-NEXT: sts     7, r25
32  %3 = extractvalue { i8, i8, i8, i8 } %a, 3
33  store volatile i8 %3, i8* inttoptr (i64 7 to i8*)
34  ret void
35}
36
37; CHECK-LABEL: ret_void_args_struct_i32_16_i8
38define void @ret_void_args_struct_i32_16_i8({ i32, i16, i8} %a) {
39start:
40  ; CHECK:      sts     7, r21
41  ; CHECK-NEXT: sts     6, r20
42  ; CHECK-NEXT: sts     5, r19
43  ; CHECK-NEXT: sts     4, r18
44  %0 = extractvalue { i32, i16, i8 } %a, 0
45  store volatile i32 %0, i32* inttoptr (i64 4 to i32*)
46
47  ; CHECK-NEXT: sts     5, r23
48  ; CHECK-NEXT: sts     4, r22
49  %1 = extractvalue { i32, i16, i8 } %a, 1
50  store volatile i16 %1, i16* inttoptr (i64 4 to i16*)
51
52  ; CHECK-NEXT: sts     4, r24
53  %2 = extractvalue { i32, i16, i8 } %a, 2
54  store volatile i8 %2, i8* inttoptr (i64 4 to i8*)
55  ret void
56}
57
58; CHECK-LABEL: ret_void_args_struct_i8_i32_struct_i32_i8
59define void @ret_void_args_struct_i8_i32_struct_i32_i8({ i8, i32 } %a, { i32, i8 } %b) {
60start:
61  ; CHECK:      sts     4, r20
62  %0 = extractvalue { i8, i32 } %a, 0
63  store volatile i8 %0, i8* inttoptr (i64 4 to i8*)
64
65  ; CHECK-NEXT: sts     8, r24
66  ; CHECK-NEXT: sts     7, r23
67  ; CHECK-NEXT: sts     6, r22
68  ; CHECK-NEXT: sts     5, r21
69  %1 = extractvalue { i8, i32 } %a, 1
70  store volatile i32 %1, i32* inttoptr (i64 5 to i32*)
71
72  ; CHECK-NEXT:      sts     9, r17
73  ; CHECK-NEXT:      sts     8, r16
74  ; CHECK-NEXT:      sts     7, r15
75  ; CHECK-NEXT:      sts     6, r14
76  %2 = extractvalue { i32, i8 } %b, 0
77  store volatile i32 %2, i32* inttoptr (i64 6 to i32*)
78
79  ; CHECK-NEXT: sts     7, r18
80  %3 = extractvalue { i32, i8 } %b, 1
81  store volatile i8 %3, i8* inttoptr (i64 7 to i8*)
82  ret void
83}
84
85