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