xref: /llvm-project/llvm/test/CodeGen/RISCV/avgceils.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1961dd1aeSSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2961dd1aeSSimon Pilgrim; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck -check-prefix=RV32I %s
3961dd1aeSSimon Pilgrim; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck -check-prefix=RV64I %s
4961dd1aeSSimon Pilgrim
5961dd1aeSSimon Pilgrim;
6961dd1aeSSimon Pilgrim; fixed avg(x,y) = sub(or(x,y),ashr(xor(x,y),1))
7961dd1aeSSimon Pilgrim;
8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(ashr(add(sext(x),sext(y),1),1))
9961dd1aeSSimon Pilgrim;
10961dd1aeSSimon Pilgrim
11961dd1aeSSimon Pilgrimdefine i8 @test_fixed_i8(i8 %a0, i8 %a1) nounwind {
12961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i8:
13961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
14961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
15961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
16*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
17961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
18961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
19961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
20961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
21961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
22961dd1aeSSimon Pilgrim;
23961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8:
24961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
25961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
26961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
27*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
28961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
29961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
30961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
31961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
32961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
33961dd1aeSSimon Pilgrim  %or = or i8 %a0, %a1
34961dd1aeSSimon Pilgrim  %xor = xor i8 %a0, %a1
35961dd1aeSSimon Pilgrim  %shift = ashr i8 %xor, 1
36961dd1aeSSimon Pilgrim  %res = sub i8 %or, %shift
37961dd1aeSSimon Pilgrim  ret i8 %res
38961dd1aeSSimon Pilgrim}
39961dd1aeSSimon Pilgrim
40961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {
41961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8:
42961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
43961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
44961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
45*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
46961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
47961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
48961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
49961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
50961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
51961dd1aeSSimon Pilgrim;
52961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8:
53961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
54961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
55961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
56*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
57961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
58961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
59961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
60961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
61961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
62961dd1aeSSimon Pilgrim  %x0 = sext i8 %a0 to i16
63961dd1aeSSimon Pilgrim  %x1 = sext i8 %a1 to i16
64961dd1aeSSimon Pilgrim  %sum = add i16 %x0, %x1
65961dd1aeSSimon Pilgrim  %sum1 = add i16 %sum, 1
66961dd1aeSSimon Pilgrim  %shift = ashr i16 %sum1, 1
67961dd1aeSSimon Pilgrim  %res = trunc i16 %shift to i8
68961dd1aeSSimon Pilgrim  ret i8 %res
69961dd1aeSSimon Pilgrim}
70961dd1aeSSimon Pilgrim
71961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {
72961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16:
73961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
74961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
75961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
76*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
77961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
78961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
79961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
80961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
81961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
82961dd1aeSSimon Pilgrim;
83961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16:
84961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
85961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
86961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
87*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
88961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
89961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
90961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
91961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
92961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
93961dd1aeSSimon Pilgrim  %or = or i16 %a0, %a1
94961dd1aeSSimon Pilgrim  %xor = xor i16 %a0, %a1
95961dd1aeSSimon Pilgrim  %shift = ashr i16 %xor, 1
96961dd1aeSSimon Pilgrim  %res = sub i16 %or, %shift
97961dd1aeSSimon Pilgrim  ret i16 %res
98961dd1aeSSimon Pilgrim}
99961dd1aeSSimon Pilgrim
100961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {
101961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16:
102961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
103961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
104961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
105*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
106961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
107961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
108961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
109961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
110961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
111961dd1aeSSimon Pilgrim;
112961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16:
113961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
114961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
115961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
116*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
117961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
118961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
119961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
120961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
121961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
122961dd1aeSSimon Pilgrim  %x0 = sext i16 %a0 to i32
123961dd1aeSSimon Pilgrim  %x1 = sext i16 %a1 to i32
124961dd1aeSSimon Pilgrim  %sum = add i32 %x0, %x1
125961dd1aeSSimon Pilgrim  %sum1 = add i32 %sum, 1
126961dd1aeSSimon Pilgrim  %shift = ashr i32 %sum1, 1
127961dd1aeSSimon Pilgrim  %res = trunc i32 %shift to i16
128961dd1aeSSimon Pilgrim  ret i16 %res
129961dd1aeSSimon Pilgrim}
130961dd1aeSSimon Pilgrim
131961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {
132961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32:
133961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
134961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a2, a0, a1
135961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
136961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
137961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
138961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
139961dd1aeSSimon Pilgrim;
140961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32:
141961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
142961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
143961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
144961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
145961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
146961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
147961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
148961dd1aeSSimon Pilgrim  %or = or i32 %a0, %a1
149961dd1aeSSimon Pilgrim  %xor = xor i32 %a1, %a0
150961dd1aeSSimon Pilgrim  %shift = ashr i32 %xor, 1
151961dd1aeSSimon Pilgrim  %res = sub i32 %or, %shift
152961dd1aeSSimon Pilgrim  ret i32 %res
153961dd1aeSSimon Pilgrim}
154961dd1aeSSimon Pilgrim
155961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {
156961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32:
157961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
158961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a2, a0, a1
159961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
160961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
161961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
162961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
163961dd1aeSSimon Pilgrim;
164961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32:
165961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
166961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
167961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
168961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
169961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
170961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
171961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
172961dd1aeSSimon Pilgrim  %x0 = sext i32 %a0 to i64
173961dd1aeSSimon Pilgrim  %x1 = sext i32 %a1 to i64
174961dd1aeSSimon Pilgrim  %sum = add i64 %x0, %x1
175961dd1aeSSimon Pilgrim  %sum1 = add i64 %sum, 1
176961dd1aeSSimon Pilgrim  %shift = ashr i64 %sum1, 1
177961dd1aeSSimon Pilgrim  %res = trunc i64 %shift to i32
178961dd1aeSSimon Pilgrim  ret i32 %res
179961dd1aeSSimon Pilgrim}
180961dd1aeSSimon Pilgrim
181961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {
182961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64:
183961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
184961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a4, a1, a3
185961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
186961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a3, a0, a2
187961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a0, a0, a2
188*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a1, 1
189*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
190*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a3, 1
191*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a2
192*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a3, a1
193961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a3
194961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
195961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a3
196961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
197961dd1aeSSimon Pilgrim;
198961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64:
199961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
200961dd1aeSSimon Pilgrim; RV64I-NEXT:    or a2, a0, a1
201961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
202961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
203961dd1aeSSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
204961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
205961dd1aeSSimon Pilgrim  %or = or i64 %a0, %a1
206961dd1aeSSimon Pilgrim  %xor = xor i64 %a1, %a0
207961dd1aeSSimon Pilgrim  %shift = ashr i64 %xor, 1
208961dd1aeSSimon Pilgrim  %res = sub i64 %or, %shift
209961dd1aeSSimon Pilgrim  ret i64 %res
210961dd1aeSSimon Pilgrim}
211961dd1aeSSimon Pilgrim
212961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {
213961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64:
214961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
215961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a4, a1, a3
216961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
217961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a3, a0, a2
218961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a0, a0, a2
219*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a1, 1
220*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
221*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a3, 1
222*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a2
223*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a3, a1
224961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a3
225961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
226961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a3
227961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
228961dd1aeSSimon Pilgrim;
229961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64:
230961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
231961dd1aeSSimon Pilgrim; RV64I-NEXT:    or a2, a0, a1
232961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
233961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
234961dd1aeSSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
235961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
236961dd1aeSSimon Pilgrim  %x0 = sext i64 %a0 to i128
237961dd1aeSSimon Pilgrim  %x1 = sext i64 %a1 to i128
238961dd1aeSSimon Pilgrim  %sum = add i128 %x0, %x1
239961dd1aeSSimon Pilgrim  %sum1 = add i128 %sum, 1
240961dd1aeSSimon Pilgrim  %shift = ashr i128 %sum1, 1
241961dd1aeSSimon Pilgrim  %res = trunc i128 %shift to i64
242961dd1aeSSimon Pilgrim  ret i64 %res
243961dd1aeSSimon Pilgrim}
244