• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2; Hexagon Programmer's Reference Manual 11.1.1 ALU32/ALU
3
4; Add
5declare i32 @llvm.hexagon.A2.addi(i32, i32)
6define i32 @A2_addi(i32 %a) {
7  %z = call i32 @llvm.hexagon.A2.addi(i32 %a, i32 0)
8  ret i32 %z
9}
10; CHECK: r0 = add(r0, #0)
11
12declare i32 @llvm.hexagon.A2.add(i32, i32)
13define i32 @A2_add(i32 %a, i32 %b) {
14  %z = call i32 @llvm.hexagon.A2.add(i32 %a, i32 %b)
15  ret i32 %z
16}
17; CHECK: r0 = add(r0, r1)
18
19declare i32 @llvm.hexagon.A2.addsat(i32, i32)
20define i32 @A2_addsat(i32 %a, i32 %b) {
21  %z = call i32 @llvm.hexagon.A2.addsat(i32 %a, i32 %b)
22  ret i32 %z
23}
24; CHECK: r0 = add(r0, r1):sat
25
26; Logical operations
27declare i32 @llvm.hexagon.A2.and(i32, i32)
28define i32 @A2_and(i32 %a, i32 %b) {
29  %z = call i32 @llvm.hexagon.A2.and(i32 %a, i32 %b)
30  ret i32 %z
31}
32; CHECK: r0 = and(r0, r1)
33
34declare i32 @llvm.hexagon.A2.or(i32, i32)
35define i32 @A2_or(i32 %a, i32 %b) {
36  %z = call i32 @llvm.hexagon.A2.or(i32 %a, i32 %b)
37  ret i32 %z
38}
39; CHECK: r0 = or(r0, r1)
40
41declare i32 @llvm.hexagon.A2.xor(i32, i32)
42define i32 @A2_xor(i32 %a, i32 %b) {
43  %z = call i32 @llvm.hexagon.A2.xor(i32 %a, i32 %b)
44  ret i32 %z
45}
46; CHECK: r0 = xor(r0, r1)
47
48declare i32 @llvm.hexagon.A4.andn(i32, i32)
49define i32 @A4_andn(i32 %a, i32 %b) {
50  %z = call i32 @llvm.hexagon.A4.andn(i32 %a, i32 %b)
51  ret i32 %z
52}
53; CHECK: r0 = and(r0, ~r1)
54
55declare i32 @llvm.hexagon.A4.orn(i32, i32)
56define i32 @A4_orn(i32 %a, i32 %b) {
57  %z = call i32 @llvm.hexagon.A4.orn(i32 %a, i32 %b)
58  ret i32 %z
59}
60; CHECK: r0 = or(r0, ~r1)
61
62; Nop
63declare void @llvm.hexagon.A2.nop()
64define void @A2_nop(i32 %a, i32 %b) {
65  call void @llvm.hexagon.A2.nop()
66  ret void
67}
68; CHECK: nop
69
70; Subtract
71declare i32 @llvm.hexagon.A2.sub(i32, i32)
72define i32 @A2_sub(i32 %a, i32 %b) {
73  %z = call i32 @llvm.hexagon.A2.sub(i32 %a, i32 %b)
74  ret i32 %z
75}
76; CHECK: r0 = sub(r0, r1)
77
78declare i32 @llvm.hexagon.A2.subsat(i32, i32)
79define i32 @A2_subsat(i32 %a, i32 %b) {
80  %z = call i32 @llvm.hexagon.A2.subsat(i32 %a, i32 %b)
81  ret i32 %z
82}
83; CHECK: r0 = sub(r0, r1):sat
84
85; Sign extend
86declare i32 @llvm.hexagon.A2.sxtb(i32)
87define i32 @A2_sxtb(i32 %a) {
88  %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a)
89  ret i32 %z
90}
91; CHECK: r0 = sxtb(r0)
92
93declare i32 @llvm.hexagon.A2.sxth(i32)
94define i32 @A2_sxth(i32 %a) {
95  %z = call i32 @llvm.hexagon.A2.sxth(i32 %a)
96  ret i32 %z
97}
98; CHECK: r0 = sxth(r0)
99
100; Transfer immediate
101declare i32 @llvm.hexagon.A2.tfril(i32, i32)
102define i32 @A2_tfril(i32 %a) {
103  %z = call i32 @llvm.hexagon.A2.tfril(i32 %a, i32 0)
104  ret i32 %z
105}
106; CHECK: r0.l = #0
107
108declare i32 @llvm.hexagon.A2.tfrih(i32, i32)
109define i32 @A2_tfrih(i32 %a) {
110  %z = call i32 @llvm.hexagon.A2.tfrih(i32 %a, i32 0)
111  ret i32 %z
112}
113; CHECK: r0.h = #0
114
115declare i32 @llvm.hexagon.A2.tfrsi(i32)
116define i32 @A2_tfrsi() {
117  %z = call i32 @llvm.hexagon.A2.tfrsi(i32 0)
118  ret i32 %z
119}
120; CHECK: r0 = #0
121
122; Transfer register
123declare i32 @llvm.hexagon.A2.tfr(i32)
124define i32 @A2_tfr(i32 %a) {
125  %z = call i32 @llvm.hexagon.A2.tfr(i32 %a)
126  ret i32 %z
127}
128; CHECK: r0 = r0
129
130; Vector add halfwords
131declare i32 @llvm.hexagon.A2.svaddh(i32, i32)
132define i32 @A2_svaddh(i32 %a, i32 %b) {
133  %z = call i32 @llvm.hexagon.A2.svaddh(i32 %a, i32 %b)
134  ret i32 %z
135}
136; CHECK: r0 = vaddh(r0, r1)
137
138declare i32 @llvm.hexagon.A2.svaddhs(i32, i32)
139define i32 @A2_svaddhs(i32 %a, i32 %b) {
140  %z = call i32 @llvm.hexagon.A2.svaddhs(i32 %a, i32 %b)
141  ret i32 %z
142}
143; CHECK: r0 = vaddh(r0, r1):sat
144
145declare i32 @llvm.hexagon.A2.svadduhs(i32, i32)
146define i32 @A2_svadduhs(i32 %a, i32 %b) {
147  %z = call i32 @llvm.hexagon.A2.svadduhs(i32 %a, i32 %b)
148  ret i32 %z
149}
150; CHECK: r0 = vadduh(r0, r1):sat
151
152; Vector average halfwords
153declare i32 @llvm.hexagon.A2.svavgh(i32, i32)
154define i32 @A2_svavgh(i32 %a, i32 %b) {
155  %z = call i32 @llvm.hexagon.A2.svavgh(i32 %a, i32 %b)
156  ret i32 %z
157}
158; CHECK: r0 = vavgh(r0, r1)
159
160declare i32 @llvm.hexagon.A2.svavghs(i32, i32)
161define i32 @A2_svavghs(i32 %a, i32 %b) {
162  %z = call i32 @llvm.hexagon.A2.svavghs(i32 %a, i32 %b)
163  ret i32 %z
164}
165; CHECK: r0 = vavgh(r0, r1):rnd
166
167declare i32 @llvm.hexagon.A2.svnavgh(i32, i32)
168define i32 @A2_svnavgh(i32 %a, i32 %b) {
169  %z = call i32 @llvm.hexagon.A2.svnavgh(i32 %a, i32 %b)
170  ret i32 %z
171}
172; CHECK: r0 = vnavgh(r0, r1)
173
174; Vector subtract halfwords
175declare i32 @llvm.hexagon.A2.svsubh(i32, i32)
176define i32 @A2_svsubh(i32 %a, i32 %b) {
177  %z = call i32 @llvm.hexagon.A2.svsubh(i32 %a, i32 %b)
178  ret i32 %z
179}
180; CHECK: r0 = vsubh(r0, r1)
181
182declare i32 @llvm.hexagon.A2.svsubhs(i32, i32)
183define i32 @A2_svsubhs(i32 %a, i32 %b) {
184  %z = call i32 @llvm.hexagon.A2.svsubhs(i32 %a, i32 %b)
185  ret i32 %z
186}
187; CHECK: r0 = vsubh(r0, r1):sat
188
189declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32)
190define i32 @A2_svsubuhs(i32 %a, i32 %b) {
191  %z = call i32 @llvm.hexagon.A2.svsubuhs(i32 %a, i32 %b)
192  ret i32 %z
193}
194; CHECK: r0 = vsubuh(r0, r1):sat
195
196; Zero extend
197declare i32 @llvm.hexagon.A2.zxth(i32)
198define i32 @A2_zxth(i32 %a) {
199  %z = call i32 @llvm.hexagon.A2.zxth(i32 %a)
200  ret i32 %z
201}
202; CHECK: r0 = zxth(r0)
203