[X86] Put no-op ADJCALLSTACK markers around all dynamic lowerings
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics / alu32_alu.ll
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
8 declare i32 @llvm.hexagon.A2.addi(i32, i32)
9 define 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
15 declare i32 @llvm.hexagon.A2.add(i32, i32)
16 define 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
22 declare i32 @llvm.hexagon.A2.addsat(i32, i32)
23 define 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
30 declare i32 @llvm.hexagon.A2.and(i32, i32)
31 define 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
37 declare i32 @llvm.hexagon.A2.or(i32, i32)
38 define 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
44 declare i32 @llvm.hexagon.A2.xor(i32, i32)
45 define 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
51 declare i32 @llvm.hexagon.A4.andn(i32, i32)
52 define 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
58 declare i32 @llvm.hexagon.A4.orn(i32, i32)
59 define 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
66 declare i32 @llvm.hexagon.A2.sub(i32, i32)
67 define 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
73 declare i32 @llvm.hexagon.A2.subsat(i32, i32)
74 define 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
81 declare i32 @llvm.hexagon.A2.sxtb(i32)
82 define i32 @A2_sxtb(i32 %a) {
83   %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a)
84   ret i32 %z
85 }
86 ; CHECK: = sxtb({{.*}})
87
88 declare i32 @llvm.hexagon.A2.sxth(i32)
89 define 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
96 declare i32 @llvm.hexagon.A2.tfril(i32, i32)
97 define 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
103 declare i32 @llvm.hexagon.A2.tfrih(i32, i32)
104 define 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
110 declare i32 @llvm.hexagon.A2.tfrsi(i32)
111 define 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
118 declare i32 @llvm.hexagon.A2.tfr(i32)
119 define 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
126 declare i32 @llvm.hexagon.A2.svaddh(i32, i32)
127 define 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
133 declare i32 @llvm.hexagon.A2.svaddhs(i32, i32)
134 define 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
140 declare i32 @llvm.hexagon.A2.svadduhs(i32, i32)
141 define 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
148 declare i32 @llvm.hexagon.A2.svavgh(i32, i32)
149 define 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
155 declare i32 @llvm.hexagon.A2.svavghs(i32, i32)
156 define 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
162 declare i32 @llvm.hexagon.A2.svnavgh(i32, i32)
163 define 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
170 declare i32 @llvm.hexagon.A2.svsubh(i32, i32)
171 define 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
177 declare i32 @llvm.hexagon.A2.svsubhs(i32, i32)
178 define 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
184 declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32)
185 define 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
192 declare i32 @llvm.hexagon.A2.zxth(i32)
193 define i32 @A2_zxth(i32 %a) {
194   %z = call i32 @llvm.hexagon.A2.zxth(i32 %a)
195   ret i32 %z
196 }
197 ; CHECK: = zxth({{.*}})