xref: /llvm-project/llvm/test/CodeGen/RISCV/avgceilu.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),lshr(xor(x,y),1))
7961dd1aeSSimon Pilgrim;
8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(lshr(add(zext(x),zext(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:    andi a1, a1, 255
15961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
16961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
17961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
18961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
19961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
20961dd1aeSSimon Pilgrim;
21961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8:
22961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
23961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
24961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
25961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
26961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
27961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
28961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
29961dd1aeSSimon Pilgrim  %or = or i8 %a0, %a1
30961dd1aeSSimon Pilgrim  %xor = xor i8 %a0, %a1
31961dd1aeSSimon Pilgrim  %shift = lshr i8 %xor, 1
32961dd1aeSSimon Pilgrim  %res = sub i8 %or, %shift
33961dd1aeSSimon Pilgrim  ret i8 %res
34961dd1aeSSimon Pilgrim}
35961dd1aeSSimon Pilgrim
36961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {
37961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8:
38961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
39961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a1, a1, 255
40961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
41961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
42961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
43961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
44961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
45961dd1aeSSimon Pilgrim;
46961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8:
47961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
48961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
49961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
50961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
51961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
52961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
53961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
54961dd1aeSSimon Pilgrim  %x0 = zext i8 %a0 to i16
55961dd1aeSSimon Pilgrim  %x1 = zext i8 %a1 to i16
56961dd1aeSSimon Pilgrim  %sum = add i16 %x0, %x1
57961dd1aeSSimon Pilgrim  %sum1 = add i16 %sum, 1
58961dd1aeSSimon Pilgrim  %shift = lshr i16 %sum1, 1
59961dd1aeSSimon Pilgrim  %res = trunc i16 %shift to i8
60961dd1aeSSimon Pilgrim  ret i8 %res
61961dd1aeSSimon Pilgrim}
62961dd1aeSSimon Pilgrim
63961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {
64961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16:
65961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
66961dd1aeSSimon Pilgrim; RV32I-NEXT:    lui a2, 16
67961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
68961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
69961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
70961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
71961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
72961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
73961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
74961dd1aeSSimon Pilgrim;
75961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16:
76961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
77961dd1aeSSimon Pilgrim; RV64I-NEXT:    lui a2, 16
78961dd1aeSSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
79961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
80961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
81961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
82961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
83961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
84961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
85961dd1aeSSimon Pilgrim  %or = or i16 %a0, %a1
86961dd1aeSSimon Pilgrim  %xor = xor i16 %a0, %a1
87961dd1aeSSimon Pilgrim  %shift = lshr i16 %xor, 1
88961dd1aeSSimon Pilgrim  %res = sub i16 %or, %shift
89961dd1aeSSimon Pilgrim  ret i16 %res
90961dd1aeSSimon Pilgrim}
91961dd1aeSSimon Pilgrim
92961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {
93961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16:
94961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
95961dd1aeSSimon Pilgrim; RV32I-NEXT:    lui a2, 16
96961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
97961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
98961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
99961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
100961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a0, a0, 1
101961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
102961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
103961dd1aeSSimon Pilgrim;
104961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16:
105961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
106961dd1aeSSimon Pilgrim; RV64I-NEXT:    lui a2, 16
107961dd1aeSSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
108961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
109961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
110961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
111961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
112961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
113961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
114961dd1aeSSimon Pilgrim  %x0 = zext i16 %a0 to i32
115961dd1aeSSimon Pilgrim  %x1 = zext i16 %a1 to i32
116961dd1aeSSimon Pilgrim  %sum = add i32 %x0, %x1
117961dd1aeSSimon Pilgrim  %sum1 = add i32 %sum, 1
118961dd1aeSSimon Pilgrim  %shift = lshr i32 %sum1, 1
119961dd1aeSSimon Pilgrim  %res = trunc i32 %shift to i16
120961dd1aeSSimon Pilgrim  ret i16 %res
121961dd1aeSSimon Pilgrim}
122961dd1aeSSimon Pilgrim
123961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {
124961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32:
125961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
126961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a2, a0, a1
127961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
128961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
129961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
130961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
131961dd1aeSSimon Pilgrim;
132961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32:
133961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
134961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
135961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
136*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 32
137961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 32
138961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
139961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
140961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
141961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
142961dd1aeSSimon Pilgrim  %or = or i32 %a0, %a1
143961dd1aeSSimon Pilgrim  %xor = xor i32 %a1, %a0
144961dd1aeSSimon Pilgrim  %shift = lshr i32 %xor, 1
145961dd1aeSSimon Pilgrim  %res = sub i32 %or, %shift
146961dd1aeSSimon Pilgrim  ret i32 %res
147961dd1aeSSimon Pilgrim}
148961dd1aeSSimon Pilgrim
149961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {
150961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32:
151961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
152961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a2, a0, a1
153961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
154961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
155961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
156961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
157961dd1aeSSimon Pilgrim;
158961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32:
159961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
160961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
161961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
162*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 32
163961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 32
164961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
165961dd1aeSSimon Pilgrim; RV64I-NEXT:    addi a0, a0, 1
166961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
167961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
168961dd1aeSSimon Pilgrim  %x0 = zext i32 %a0 to i64
169961dd1aeSSimon Pilgrim  %x1 = zext i32 %a1 to i64
170961dd1aeSSimon Pilgrim  %sum = add i64 %x0, %x1
171961dd1aeSSimon Pilgrim  %sum1 = add i64 %sum, 1
172961dd1aeSSimon Pilgrim  %shift = lshr i64 %sum1, 1
173961dd1aeSSimon Pilgrim  %res = trunc i64 %shift to i32
174961dd1aeSSimon Pilgrim  ret i32 %res
175961dd1aeSSimon Pilgrim}
176961dd1aeSSimon Pilgrim
177961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {
178961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64:
179961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
180961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a4, a1, a3
181961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
182961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a3, a0, a2
183961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a0, a0, a2
184*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a1, 1
185*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
186*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a3, 1
187*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a2
188*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a3, a1
189961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a3
190961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
191961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a3
192961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
193961dd1aeSSimon Pilgrim;
194961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64:
195961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
196961dd1aeSSimon Pilgrim; RV64I-NEXT:    or a2, a0, a1
197961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
198961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
199961dd1aeSSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
200961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
201961dd1aeSSimon Pilgrim  %or = or i64 %a0, %a1
202961dd1aeSSimon Pilgrim  %xor = xor i64 %a1, %a0
203961dd1aeSSimon Pilgrim  %shift = lshr i64 %xor, 1
204961dd1aeSSimon Pilgrim  %res = sub i64 %or, %shift
205961dd1aeSSimon Pilgrim  ret i64 %res
206961dd1aeSSimon Pilgrim}
207961dd1aeSSimon Pilgrim
208961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {
209961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64:
210961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
211961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a4, a1, a3
212961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
213961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a3, a0, a2
214961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a0, a0, a2
215*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a1, 1
216*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
217*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a3, 1
218*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a2
219*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a3, a1
220961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a3
221961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
222961dd1aeSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a3
223961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
224961dd1aeSSimon Pilgrim;
225961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64:
226961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
227961dd1aeSSimon Pilgrim; RV64I-NEXT:    or a2, a0, a1
228961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
229961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
230961dd1aeSSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
231961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
232961dd1aeSSimon Pilgrim  %x0 = zext i64 %a0 to i128
233961dd1aeSSimon Pilgrim  %x1 = zext i64 %a1 to i128
234961dd1aeSSimon Pilgrim  %sum = add i128 %x0, %x1
235961dd1aeSSimon Pilgrim  %sum1 = add i128 %sum, 1
236961dd1aeSSimon Pilgrim  %shift = lshr i128 %sum1, 1
237961dd1aeSSimon Pilgrim  %res = trunc i128 %shift to i64
238961dd1aeSSimon Pilgrim  ret i64 %res
239961dd1aeSSimon Pilgrim}
240