xref: /llvm-project/llvm/test/CodeGen/RISCV/avgfloors.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) = add(and(x,y),ashr(xor(x,y),1))
7961dd1aeSSimon Pilgrim;
8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(ashr(add(sext(x),sext(y)),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:    srai a0, a0, 1
20961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
21961dd1aeSSimon Pilgrim;
22961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8:
23961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
24961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
25961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
26*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
27961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
28961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
29961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
30961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
31961dd1aeSSimon Pilgrim  %and = and i8 %a0, %a1
32961dd1aeSSimon Pilgrim  %xor = xor i8 %a0, %a1
33961dd1aeSSimon Pilgrim  %shift = ashr i8 %xor, 1
34961dd1aeSSimon Pilgrim  %res = add i8 %and, %shift
35961dd1aeSSimon Pilgrim  ret i8 %res
36961dd1aeSSimon Pilgrim}
37961dd1aeSSimon Pilgrim
38961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {
39961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8:
40961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
41961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
42961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
43*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
44961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
45961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
46961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
47961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
48961dd1aeSSimon Pilgrim;
49961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8:
50961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
51961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
52961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
53*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
54961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
55961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
56961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
57961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
58961dd1aeSSimon Pilgrim  %x0 = sext i8 %a0 to i16
59961dd1aeSSimon Pilgrim  %x1 = sext i8 %a1 to i16
60961dd1aeSSimon Pilgrim  %sum = add i16 %x0, %x1
61961dd1aeSSimon Pilgrim  %shift = ashr i16 %sum, 1
62961dd1aeSSimon Pilgrim  %res = trunc i16 %shift to i8
63961dd1aeSSimon Pilgrim  ret i8 %res
64961dd1aeSSimon Pilgrim}
65961dd1aeSSimon Pilgrim
66961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {
67961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16:
68961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
69961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
70961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
71*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
72961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
73961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
74961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
75961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
76961dd1aeSSimon Pilgrim;
77961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16:
78961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
79961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
80961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
81*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
82961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
83961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
84961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
85961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
86961dd1aeSSimon Pilgrim  %and = and i16 %a0, %a1
87961dd1aeSSimon Pilgrim  %xor = xor i16 %a0, %a1
88961dd1aeSSimon Pilgrim  %shift = ashr i16 %xor, 1
89961dd1aeSSimon Pilgrim  %res = add i16 %and, %shift
90961dd1aeSSimon Pilgrim  ret i16 %res
91961dd1aeSSimon Pilgrim}
92961dd1aeSSimon Pilgrim
93961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {
94961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16:
95961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
96961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
97961dd1aeSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
98*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
99961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
100961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
101961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai 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:    slli a1, a1, 48
107961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
108*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
109961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
110961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
111961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
112961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
113961dd1aeSSimon Pilgrim  %x0 = sext i16 %a0 to i32
114961dd1aeSSimon Pilgrim  %x1 = sext i16 %a1 to i32
115961dd1aeSSimon Pilgrim  %sum = add i32 %x0, %x1
116961dd1aeSSimon Pilgrim  %shift = ashr i32 %sum, 1
117961dd1aeSSimon Pilgrim  %res = trunc i32 %shift to i16
118961dd1aeSSimon Pilgrim  ret i16 %res
119961dd1aeSSimon Pilgrim}
120961dd1aeSSimon Pilgrim
121961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {
122961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32:
123961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
124961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a1
125961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
126961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
127961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
128961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
129961dd1aeSSimon Pilgrim;
130961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32:
131961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
132961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
133961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
134961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
135961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
136961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
137961dd1aeSSimon Pilgrim  %and = and i32 %a0, %a1
138961dd1aeSSimon Pilgrim  %xor = xor i32 %a1, %a0
139961dd1aeSSimon Pilgrim  %shift = ashr i32 %xor, 1
140961dd1aeSSimon Pilgrim  %res = add i32 %and, %shift
141961dd1aeSSimon Pilgrim  ret i32 %res
142961dd1aeSSimon Pilgrim}
143961dd1aeSSimon Pilgrim
144961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {
145961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32:
146961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
147961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a1
148961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
149961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 1
150961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
151961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
152961dd1aeSSimon Pilgrim;
153961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32:
154961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
155961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
156961dd1aeSSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
157961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
158961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
159961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
160961dd1aeSSimon Pilgrim  %x0 = sext i32 %a0 to i64
161961dd1aeSSimon Pilgrim  %x1 = sext i32 %a1 to i64
162961dd1aeSSimon Pilgrim  %sum = add i64 %x0, %x1
163961dd1aeSSimon Pilgrim  %shift = ashr i64 %sum, 1
164961dd1aeSSimon Pilgrim  %res = trunc i64 %shift to i32
165961dd1aeSSimon Pilgrim  ret i32 %res
166961dd1aeSSimon Pilgrim}
167961dd1aeSSimon Pilgrim
168961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {
169961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64:
170961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
171961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a4, a1, a3
172961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
173961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a3, a1, 1
174961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a3, a4, a3
175961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a4, a0, a2
176*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
177961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a4, a4, 1
178961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a1, a4, a1
179961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a2
180961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a1
181961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a2
182961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a1, a3, a1
183961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
184961dd1aeSSimon Pilgrim;
185961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64:
186961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
187961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a2, a0, a1
188961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
189961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
190961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
191961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
192961dd1aeSSimon Pilgrim  %and = and i64 %a0, %a1
193961dd1aeSSimon Pilgrim  %xor = xor i64 %a1, %a0
194961dd1aeSSimon Pilgrim  %shift = ashr i64 %xor, 1
195961dd1aeSSimon Pilgrim  %res = add i64 %and, %shift
196961dd1aeSSimon Pilgrim  ret i64 %res
197961dd1aeSSimon Pilgrim}
198961dd1aeSSimon Pilgrim
199961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {
200961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64:
201961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
202961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a4, a1, a3
203961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a3
204961dd1aeSSimon Pilgrim; RV32I-NEXT:    srai a3, a1, 1
205961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a3, a4, a3
206961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a4, a0, a2
207*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 31
208961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a4, a4, 1
209961dd1aeSSimon Pilgrim; RV32I-NEXT:    or a1, a4, a1
210961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a2
211961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a1
212961dd1aeSSimon Pilgrim; RV32I-NEXT:    sltu a1, a0, a2
213961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a1, a3, a1
214961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
215961dd1aeSSimon Pilgrim;
216961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64:
217961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
218961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a2, a0, a1
219961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
220961dd1aeSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 1
221961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
222961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
223961dd1aeSSimon Pilgrim  %x0 = sext i64 %a0 to i128
224961dd1aeSSimon Pilgrim  %x1 = sext i64 %a1 to i128
225961dd1aeSSimon Pilgrim  %sum = add i128 %x0, %x1
226961dd1aeSSimon Pilgrim  %shift = ashr i128 %sum, 1
227961dd1aeSSimon Pilgrim  %res = trunc i128 %shift to i64
228961dd1aeSSimon Pilgrim  ret i64 %res
229961dd1aeSSimon Pilgrim}
230