blob: 73568b54096566cb884a25a1d01e75b61e4d9112 [file] [log] [blame]
Dylan McKaya789f402016-11-16 21:58:04 +00001; RUN: llc -mattr=avr6,sram < %s -march=avr | FileCheck %s
2
3define i8 @load8(i8* %x) {
4; CHECK-LABEL: load8:
5; CHECK: ld r24, {{[XYZ]}}
6 %1 = load i8, i8* %x
7 ret i8 %1
8}
9
10define i16 @load16(i16* %x) {
11; CHECK-LABEL: load16:
Dylan McKayd00f9c12017-10-04 10:33:36 +000012; CHECK: ld r24, {{[XYZ]}}+
13; CHECK: ld r25, {{[XYZ]}}
Dylan McKaya789f402016-11-16 21:58:04 +000014 %1 = load i16, i16* %x
15 ret i16 %1
16}
17
18define i8 @load8disp(i8* %x) {
19; CHECK-LABEL: load8disp:
20; CHECK: ldd r24, {{[YZ]}}+63
21 %1 = getelementptr inbounds i8, i8* %x, i64 63
22 %2 = load i8, i8* %1
23 ret i8 %2
24}
25
26define i8 @load8nodisp(i8* %x) {
27; CHECK-LABEL: load8nodisp:
28; CHECK: movw r26, r24
29; CHECK: subi r26, 192
30; CHECK: sbci r27, 255
31; CHECK: ld r24, {{[XYZ]}}
32 %1 = getelementptr inbounds i8, i8* %x, i64 64
33 %2 = load i8, i8* %1
34 ret i8 %2
35}
36
37define i16 @load16disp(i16* %x) {
38; CHECK-LABEL: load16disp:
39; CHECK: ldd r24, {{[YZ]}}+62
40; CHECK: ldd r25, {{[YZ]}}+63
41 %1 = getelementptr inbounds i16, i16* %x, i64 31
42 %2 = load i16, i16* %1
43 ret i16 %2
44}
45
46define i16 @load16nodisp(i16* %x) {
47; CHECK-LABEL: load16nodisp:
Dylan McKayd00f9c12017-10-04 10:33:36 +000048; CHECK: movw r26, r24
49; CHECK: subi r26, 192
50; CHECK: sbci r27, 255
51; CHECK: ld r24, {{[XYZ]}}+
52; CHECK: ld r25, {{[XYZ]}}
Dylan McKaya789f402016-11-16 21:58:04 +000053 %1 = getelementptr inbounds i16, i16* %x, i64 32
54 %2 = load i16, i16* %1
55 ret i16 %2
56}
57
58define i8 @load8postinc(i8* %x, i8 %y) {
59; CHECK-LABEL: load8postinc:
60; CHECK: ld {{.*}}, {{[XYZ]}}+
61entry:
62 %tobool6 = icmp eq i8 %y, 0
63 br i1 %tobool6, label %while.end, label %while.body
64while.body: ; preds = %entry, %while.body
65 %r.09 = phi i8 [ %add, %while.body ], [ 0, %entry ]
66 %y.addr.08 = phi i8 [ %dec, %while.body ], [ %y, %entry ]
67 %x.addr.07 = phi i8* [ %incdec.ptr, %while.body ], [ %x, %entry ]
68 %dec = add i8 %y.addr.08, -1
69 %incdec.ptr = getelementptr inbounds i8, i8* %x.addr.07, i16 1
70 %0 = load i8, i8* %x.addr.07
71 %add = add i8 %0, %r.09
72 %tobool = icmp eq i8 %dec, 0
73 br i1 %tobool, label %while.end, label %while.body
74while.end: ; preds = %while.body, %entry
75 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ]
76 ret i8 %r.0.lcssa
77}
78
79define i16 @load16postinc(i16* %x, i16 %y) {
80; CHECK-LABEL: load16postinc:
81; CHECK: ld {{.*}}, {{[XYZ]}}+
82; CHECK: ld {{.*}}, {{[XYZ]}}+
83entry:
84 %tobool2 = icmp eq i16 %y, 0
85 br i1 %tobool2, label %while.end, label %while.body
86while.body: ; preds = %entry, %while.body
87 %r.05 = phi i16 [ %add, %while.body ], [ 0, %entry ]
88 %y.addr.04 = phi i16 [ %dec, %while.body ], [ %y, %entry ]
89 %x.addr.03 = phi i16* [ %incdec.ptr, %while.body ], [ %x, %entry ]
90 %dec = add nsw i16 %y.addr.04, -1
91 %incdec.ptr = getelementptr inbounds i16, i16* %x.addr.03, i16 1
92 %0 = load i16, i16* %x.addr.03
93 %add = add nsw i16 %0, %r.05
94 %tobool = icmp eq i16 %dec, 0
95 br i1 %tobool, label %while.end, label %while.body
96while.end: ; preds = %while.body, %entry
97 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ]
98 ret i16 %r.0.lcssa
99}
100
101define i8 @load8predec(i8* %x, i8 %y) {
102; CHECK-LABEL: load8predec:
103; CHECK: ld {{.*}}, -{{[XYZ]}}
104entry:
105 %tobool6 = icmp eq i8 %y, 0
106 br i1 %tobool6, label %while.end, label %while.body
107while.body: ; preds = %entry, %while.body
108 %r.09 = phi i8 [ %add, %while.body ], [ 0, %entry ]
109 %y.addr.08 = phi i8 [ %dec, %while.body ], [ %y, %entry ]
110 %x.addr.07 = phi i8* [ %incdec.ptr, %while.body ], [ %x, %entry ]
111 %dec = add i8 %y.addr.08, -1
112 %incdec.ptr = getelementptr inbounds i8, i8* %x.addr.07, i16 -1
113 %0 = load i8, i8* %incdec.ptr
114 %add = add i8 %0, %r.09
115 %tobool = icmp eq i8 %dec, 0
116 br i1 %tobool, label %while.end, label %while.body
117while.end: ; preds = %while.body, %entry
118 %r.0.lcssa = phi i8 [ 0, %entry ], [ %add, %while.body ]
119 ret i8 %r.0.lcssa
120}
121
122define i16 @load16predec(i16* %x, i16 %y) {
123; CHECK-LABEL: load16predec:
124; CHECK: ld {{.*}}, -{{[XYZ]}}
125; CHECK: ld {{.*}}, -{{[XYZ]}}
126entry:
127 %tobool2 = icmp eq i16 %y, 0
128 br i1 %tobool2, label %while.end, label %while.body
129while.body: ; preds = %entry, %while.body
130 %r.05 = phi i16 [ %add, %while.body ], [ 0, %entry ]
131 %y.addr.04 = phi i16 [ %dec, %while.body ], [ %y, %entry ]
132 %x.addr.03 = phi i16* [ %incdec.ptr, %while.body ], [ %x, %entry ]
133 %dec = add nsw i16 %y.addr.04, -1
134 %incdec.ptr = getelementptr inbounds i16, i16* %x.addr.03, i16 -1
135 %0 = load i16, i16* %incdec.ptr
136 %add = add nsw i16 %0, %r.05
137 %tobool = icmp eq i16 %dec, 0
138 br i1 %tobool, label %while.end, label %while.body
139while.end: ; preds = %while.body, %entry
140 %r.0.lcssa = phi i16 [ 0, %entry ], [ %add, %while.body ]
141 ret i16 %r.0.lcssa
142}