xref: /llvm-project/llvm/test/CodeGen/RISCV/avgflooru.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),lshr(xor(x,y),1))
7961dd1aeSSimon Pilgrim;
8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(lshr(add(zext(x),zext(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:    andi a1, a1, 255
15961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
16961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
17961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
18961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
19961dd1aeSSimon Pilgrim;
20961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8:
21961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
22961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
23961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
24961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
25961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
26961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
27961dd1aeSSimon Pilgrim  %and = and i8 %a0, %a1
28961dd1aeSSimon Pilgrim  %xor = xor i8 %a0, %a1
29961dd1aeSSimon Pilgrim  %shift = lshr i8 %xor, 1
30961dd1aeSSimon Pilgrim  %res = add i8 %and, %shift
31961dd1aeSSimon Pilgrim  ret i8 %res
32961dd1aeSSimon Pilgrim}
33961dd1aeSSimon Pilgrim
34961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {
35961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8:
36961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
37961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a1, a1, 255
38961dd1aeSSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
39961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
40961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
41961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
42961dd1aeSSimon Pilgrim;
43961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8:
44961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
45961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
46961dd1aeSSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
47961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
48961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
49961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
50961dd1aeSSimon Pilgrim  %x0 = zext i8 %a0 to i16
51961dd1aeSSimon Pilgrim  %x1 = zext i8 %a1 to i16
52961dd1aeSSimon Pilgrim  %sum = add i16 %x0, %x1
53961dd1aeSSimon Pilgrim  %shift = lshr i16 %sum, 1
54961dd1aeSSimon Pilgrim  %res = trunc i16 %shift to i8
55961dd1aeSSimon Pilgrim  ret i8 %res
56961dd1aeSSimon Pilgrim}
57961dd1aeSSimon Pilgrim
58961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {
59961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16:
60961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
61961dd1aeSSimon Pilgrim; RV32I-NEXT:    lui a2, 16
62961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
63961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
64961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
65961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
66961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
67961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
68961dd1aeSSimon Pilgrim;
69961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16:
70961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
71961dd1aeSSimon Pilgrim; RV64I-NEXT:    lui a2, 16
72961dd1aeSSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
73961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
74961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
75961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
76961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
77961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
78961dd1aeSSimon Pilgrim  %and = and i16 %a0, %a1
79961dd1aeSSimon Pilgrim  %xor = xor i16 %a0, %a1
80961dd1aeSSimon Pilgrim  %shift = lshr i16 %xor, 1
81961dd1aeSSimon Pilgrim  %res = add i16 %and, %shift
82961dd1aeSSimon Pilgrim  ret i16 %res
83961dd1aeSSimon Pilgrim}
84961dd1aeSSimon Pilgrim
85961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {
86961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16:
87961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
88961dd1aeSSimon Pilgrim; RV32I-NEXT:    lui a2, 16
89961dd1aeSSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
90961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
91961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
92961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a0, a1
93961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
94961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
95961dd1aeSSimon Pilgrim;
96961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16:
97961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
98961dd1aeSSimon Pilgrim; RV64I-NEXT:    lui a2, 16
99961dd1aeSSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
100961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
101961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
102961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
103961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
104961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
105961dd1aeSSimon Pilgrim  %x0 = zext i16 %a0 to i32
106961dd1aeSSimon Pilgrim  %x1 = zext i16 %a1 to i32
107961dd1aeSSimon Pilgrim  %sum = add i32 %x0, %x1
108961dd1aeSSimon Pilgrim  %shift = lshr i32 %sum, 1
109961dd1aeSSimon Pilgrim  %res = trunc i32 %shift to i16
110961dd1aeSSimon Pilgrim  ret i16 %res
111961dd1aeSSimon Pilgrim}
112961dd1aeSSimon Pilgrim
113961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {
114961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32:
115961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
116961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a1
117961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
118961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
119961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
120961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
121961dd1aeSSimon Pilgrim;
122961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32:
123961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
124961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
125961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
126*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 32
127961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 32
128961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
129961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
130961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
131961dd1aeSSimon Pilgrim  %and = and i32 %a0, %a1
132961dd1aeSSimon Pilgrim  %xor = xor i32 %a1, %a0
133961dd1aeSSimon Pilgrim  %shift = lshr i32 %xor, 1
134961dd1aeSSimon Pilgrim  %res = add i32 %and, %shift
135961dd1aeSSimon Pilgrim  ret i32 %res
136961dd1aeSSimon Pilgrim}
137961dd1aeSSimon Pilgrim
138961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {
139961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32:
140961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
141961dd1aeSSimon Pilgrim; RV32I-NEXT:    and a2, a0, a1
142961dd1aeSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
143961dd1aeSSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 1
144961dd1aeSSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
145961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
146961dd1aeSSimon Pilgrim;
147961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32:
148961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
149961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
150961dd1aeSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
151*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a1, 32
152961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 32
153961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a0, a1
154961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
155961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
156961dd1aeSSimon Pilgrim  %x0 = zext i32 %a0 to i64
157961dd1aeSSimon Pilgrim  %x1 = zext i32 %a1 to i64
158961dd1aeSSimon Pilgrim  %sum = add i64 %x0, %x1
159961dd1aeSSimon Pilgrim  %shift = lshr i64 %sum, 1
160961dd1aeSSimon Pilgrim  %res = trunc i64 %shift to i32
161961dd1aeSSimon Pilgrim  ret i32 %res
162961dd1aeSSimon Pilgrim}
163961dd1aeSSimon Pilgrim
164961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {
165961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64:
166961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
167*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a3, a1
1687231776aSJulius Alexandre; RV32I-NEXT:    add a0, a2, a0
169*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a0, a2
170*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a2
171*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a3, .LBB6_2
1727231776aSJulius Alexandre; RV32I-NEXT:  # %bb.1:
173*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a1, a3
1747231776aSJulius Alexandre; RV32I-NEXT:  .LBB6_2:
1757231776aSJulius Alexandre; RV32I-NEXT:    slli a2, a2, 31
176*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a1, 1
177*9122c523SPengcheng Wang; RV32I-NEXT:    slli a4, a1, 31
1787231776aSJulius Alexandre; RV32I-NEXT:    srli a0, a0, 1
179*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a2
180*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a4
181961dd1aeSSimon Pilgrim; RV32I-NEXT:    ret
182961dd1aeSSimon Pilgrim;
183961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64:
184961dd1aeSSimon Pilgrim; RV64I:       # %bb.0:
185961dd1aeSSimon Pilgrim; RV64I-NEXT:    and a2, a0, a1
186961dd1aeSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
187961dd1aeSSimon Pilgrim; RV64I-NEXT:    srli a0, a0, 1
188961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
189961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
190961dd1aeSSimon Pilgrim  %and = and i64 %a0, %a1
191961dd1aeSSimon Pilgrim  %xor = xor i64 %a1, %a0
192961dd1aeSSimon Pilgrim  %shift = lshr i64 %xor, 1
193961dd1aeSSimon Pilgrim  %res = add i64 %and, %shift
194961dd1aeSSimon Pilgrim  ret i64 %res
195961dd1aeSSimon Pilgrim}
196961dd1aeSSimon Pilgrim
197961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {
198961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64:
199961dd1aeSSimon Pilgrim; RV32I:       # %bb.0:
200*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a3, a1
2017231776aSJulius Alexandre; RV32I-NEXT:    add a0, a2, a0
202*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a0, a2
203*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a2
204*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a3, .LBB7_2
2057231776aSJulius Alexandre; RV32I-NEXT:  # %bb.1:
206*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a1, a3
2077231776aSJulius Alexandre; RV32I-NEXT:  .LBB7_2:
2087231776aSJulius Alexandre; RV32I-NEXT:    slli a2, a2, 31
209*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a1, 1
210*9122c523SPengcheng Wang; RV32I-NEXT:    slli a4, a1, 31
2117231776aSJulius Alexandre; RV32I-NEXT:    srli a0, a0, 1
212*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a2
213*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a4
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:    srli a0, a0, 1
221961dd1aeSSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
222961dd1aeSSimon Pilgrim; RV64I-NEXT:    ret
223961dd1aeSSimon Pilgrim  %x0 = zext i64 %a0 to i128
224961dd1aeSSimon Pilgrim  %x1 = zext i64 %a1 to i128
225961dd1aeSSimon Pilgrim  %sum = add i128 %x0, %x1
226961dd1aeSSimon Pilgrim  %shift = lshr i128 %sum, 1
227961dd1aeSSimon Pilgrim  %res = trunc i128 %shift to i64
228961dd1aeSSimon Pilgrim  ret i64 %res
229961dd1aeSSimon Pilgrim}
230