xref: /llvm-project/llvm/test/CodeGen/RISCV/div-pow2.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
198d51c25Swangpc; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
298d51c25Swangpc; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
370a64fe7SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV32I
498d51c25Swangpc; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
570a64fe7SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV64I
698d51c25Swangpc
798d51c25Swangpcdefine i32 @sdiv32_pow2_2(i32 %a) {
870a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_2:
970a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
1070a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a0, 31
1170a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
1270a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 1
1370a64fe7SCraig Topper; RV32I-NEXT:    ret
1498d51c25Swangpc;
1570a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_2:
1670a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
1770a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a0, 31
18d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
1970a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 1
2070a64fe7SCraig Topper; RV64I-NEXT:    ret
2198d51c25Swangpcentry:
2298d51c25Swangpc  %div = sdiv i32 %a, 2
2398d51c25Swangpc  ret i32 %div
2498d51c25Swangpc}
2598d51c25Swangpc
2698d51c25Swangpcdefine i32 @sdiv32_pow2_negative_2(i32 %a) {
2770a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_negative_2:
2870a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
2970a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a0, 31
3070a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
3170a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 1
3270a64fe7SCraig Topper; RV32I-NEXT:    neg a0, a0
3370a64fe7SCraig Topper; RV32I-NEXT:    ret
3498d51c25Swangpc;
3570a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_negative_2:
3670a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
3770a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a0, 31
38d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
3970a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 1
4070a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
4170a64fe7SCraig Topper; RV64I-NEXT:    ret
4298d51c25Swangpcentry:
4398d51c25Swangpc  %div = sdiv i32 %a, -2
4498d51c25Swangpc  ret i32 %div
4598d51c25Swangpc}
4698d51c25Swangpc
4798d51c25Swangpcdefine i32 @sdiv32_pow2_2048(i32 %a) {
4898d51c25Swangpc; RV32I-LABEL: sdiv32_pow2_2048:
4998d51c25Swangpc; RV32I:       # %bb.0: # %entry
5098d51c25Swangpc; RV32I-NEXT:    srai a1, a0, 31
5198d51c25Swangpc; RV32I-NEXT:    srli a1, a1, 21
5298d51c25Swangpc; RV32I-NEXT:    add a0, a0, a1
5398d51c25Swangpc; RV32I-NEXT:    srai a0, a0, 11
5498d51c25Swangpc; RV32I-NEXT:    ret
5598d51c25Swangpc;
5698d51c25Swangpc; RV64I-LABEL: sdiv32_pow2_2048:
5798d51c25Swangpc; RV64I:       # %bb.0: # %entry
5898d51c25Swangpc; RV64I-NEXT:    sraiw a1, a0, 31
5998d51c25Swangpc; RV64I-NEXT:    srliw a1, a1, 21
60d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
6198d51c25Swangpc; RV64I-NEXT:    sraiw a0, a0, 11
6298d51c25Swangpc; RV64I-NEXT:    ret
6398d51c25Swangpcentry:
6498d51c25Swangpc  %div = sdiv i32 %a, 2048
6598d51c25Swangpc  ret i32 %div
6698d51c25Swangpc}
6798d51c25Swangpc
6898d51c25Swangpcdefine i32 @sdiv32_pow2_negative_2048(i32 %a) {
6998d51c25Swangpc; RV32I-LABEL: sdiv32_pow2_negative_2048:
7098d51c25Swangpc; RV32I:       # %bb.0: # %entry
7198d51c25Swangpc; RV32I-NEXT:    srai a1, a0, 31
7298d51c25Swangpc; RV32I-NEXT:    srli a1, a1, 21
7398d51c25Swangpc; RV32I-NEXT:    add a0, a0, a1
7498d51c25Swangpc; RV32I-NEXT:    srai a0, a0, 11
7598d51c25Swangpc; RV32I-NEXT:    neg a0, a0
7698d51c25Swangpc; RV32I-NEXT:    ret
7798d51c25Swangpc;
7898d51c25Swangpc; RV64I-LABEL: sdiv32_pow2_negative_2048:
7998d51c25Swangpc; RV64I:       # %bb.0: # %entry
8098d51c25Swangpc; RV64I-NEXT:    sraiw a1, a0, 31
8198d51c25Swangpc; RV64I-NEXT:    srliw a1, a1, 21
82d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
8398d51c25Swangpc; RV64I-NEXT:    sraiw a0, a0, 11
8498d51c25Swangpc; RV64I-NEXT:    neg a0, a0
8598d51c25Swangpc; RV64I-NEXT:    ret
8698d51c25Swangpcentry:
8798d51c25Swangpc  %div = sdiv i32 %a, -2048
8898d51c25Swangpc  ret i32 %div
8998d51c25Swangpc}
9098d51c25Swangpc
9198d51c25Swangpcdefine i32 @sdiv32_pow2_4096(i32 %a) {
9270a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_4096:
9370a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
9470a64fe7SCraig Topper; RV32I-NEXT:    srai a1, a0, 31
9570a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a1, 20
9670a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
9770a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 12
9870a64fe7SCraig Topper; RV32I-NEXT:    ret
9998d51c25Swangpc;
10070a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_4096:
10170a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
10270a64fe7SCraig Topper; RV64I-NEXT:    sraiw a1, a0, 31
10370a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a1, 20
104d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
10570a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 12
10670a64fe7SCraig Topper; RV64I-NEXT:    ret
10798d51c25Swangpcentry:
10898d51c25Swangpc  %div = sdiv i32 %a, 4096
10998d51c25Swangpc  ret i32 %div
11098d51c25Swangpc}
11198d51c25Swangpc
11298d51c25Swangpcdefine i32 @sdiv32_pow2_negative_4096(i32 %a) {
11370a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_negative_4096:
11470a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
11570a64fe7SCraig Topper; RV32I-NEXT:    srai a1, a0, 31
11670a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a1, 20
11770a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
11870a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 12
11970a64fe7SCraig Topper; RV32I-NEXT:    neg a0, a0
12070a64fe7SCraig Topper; RV32I-NEXT:    ret
12198d51c25Swangpc;
12270a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_negative_4096:
12370a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
12470a64fe7SCraig Topper; RV64I-NEXT:    sraiw a1, a0, 31
12570a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a1, 20
126d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
12770a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 12
12870a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
12970a64fe7SCraig Topper; RV64I-NEXT:    ret
13098d51c25Swangpcentry:
13198d51c25Swangpc  %div = sdiv i32 %a, -4096
13298d51c25Swangpc  ret i32 %div
13398d51c25Swangpc}
13498d51c25Swangpc
13598d51c25Swangpcdefine i32 @sdiv32_pow2_65536(i32 %a) {
13670a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_65536:
13770a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
13870a64fe7SCraig Topper; RV32I-NEXT:    srai a1, a0, 31
13970a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a1, 16
14070a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
14170a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 16
14270a64fe7SCraig Topper; RV32I-NEXT:    ret
14398d51c25Swangpc;
14470a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_65536:
14570a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
14670a64fe7SCraig Topper; RV64I-NEXT:    sraiw a1, a0, 31
14770a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a1, 16
148d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
14970a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 16
15070a64fe7SCraig Topper; RV64I-NEXT:    ret
15198d51c25Swangpcentry:
15298d51c25Swangpc  %div = sdiv i32 %a, 65536
15398d51c25Swangpc  ret i32 %div
15498d51c25Swangpc}
15598d51c25Swangpc
15698d51c25Swangpcdefine i32 @sdiv32_pow2_negative_65536(i32 %a) {
15770a64fe7SCraig Topper; RV32I-LABEL: sdiv32_pow2_negative_65536:
15870a64fe7SCraig Topper; RV32I:       # %bb.0: # %entry
15970a64fe7SCraig Topper; RV32I-NEXT:    srai a1, a0, 31
16070a64fe7SCraig Topper; RV32I-NEXT:    srli a1, a1, 16
16170a64fe7SCraig Topper; RV32I-NEXT:    add a0, a0, a1
16270a64fe7SCraig Topper; RV32I-NEXT:    srai a0, a0, 16
16370a64fe7SCraig Topper; RV32I-NEXT:    neg a0, a0
16470a64fe7SCraig Topper; RV32I-NEXT:    ret
16598d51c25Swangpc;
16670a64fe7SCraig Topper; RV64I-LABEL: sdiv32_pow2_negative_65536:
16770a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
16870a64fe7SCraig Topper; RV64I-NEXT:    sraiw a1, a0, 31
16970a64fe7SCraig Topper; RV64I-NEXT:    srliw a1, a1, 16
170d64d3c5aSNitin John Raj; RV64I-NEXT:    add a0, a0, a1
17170a64fe7SCraig Topper; RV64I-NEXT:    sraiw a0, a0, 16
17270a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
17370a64fe7SCraig Topper; RV64I-NEXT:    ret
17498d51c25Swangpcentry:
17598d51c25Swangpc  %div = sdiv i32 %a, -65536
17698d51c25Swangpc  ret i32 %div
17798d51c25Swangpc}
17898d51c25Swangpc
17998d51c25Swangpcdefine i64 @sdiv64_pow2_2(i64 %a) {
18098d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_2:
18198d51c25Swangpc; RV32I:       # %bb.0: # %entry
18298d51c25Swangpc; RV32I-NEXT:    srli a2, a1, 31
18398d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
18498d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 1
18598d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
18698d51c25Swangpc; RV32I-NEXT:    add a1, a1, a0
18798d51c25Swangpc; RV32I-NEXT:    slli a0, a1, 31
18898d51c25Swangpc; RV32I-NEXT:    or a0, a3, a0
18998d51c25Swangpc; RV32I-NEXT:    srai a1, a1, 1
19098d51c25Swangpc; RV32I-NEXT:    ret
19198d51c25Swangpc;
19270a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_2:
19370a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
19470a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a0, 63
19570a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
19670a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 1
19770a64fe7SCraig Topper; RV64I-NEXT:    ret
19898d51c25Swangpcentry:
19998d51c25Swangpc  %div = sdiv i64 %a, 2
20098d51c25Swangpc  ret i64 %div
20198d51c25Swangpc}
20298d51c25Swangpc
20398d51c25Swangpcdefine i64 @sdiv64_pow2_negative_2(i64 %a) {
20498d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_negative_2:
20598d51c25Swangpc; RV32I:       # %bb.0: # %entry
20698d51c25Swangpc; RV32I-NEXT:    srli a2, a1, 31
20798d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
20898d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 1
20998d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
210*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
211*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a0, 31
212*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a0, 1
213*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
214*9122c523SPengcheng Wang; RV32I-NEXT:    neg a0, a1
215*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a1
216*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
217*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a2, a1
21898d51c25Swangpc; RV32I-NEXT:    ret
21998d51c25Swangpc;
22070a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_negative_2:
22170a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
22270a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a0, 63
22370a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
22470a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 1
22570a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
22670a64fe7SCraig Topper; RV64I-NEXT:    ret
22798d51c25Swangpcentry:
22898d51c25Swangpc  %div = sdiv i64 %a, -2
22998d51c25Swangpc  ret i64 %div
23098d51c25Swangpc}
23198d51c25Swangpc
23298d51c25Swangpcdefine i64 @sdiv64_pow2_2048(i64 %a) {
23398d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_2048:
23498d51c25Swangpc; RV32I:       # %bb.0: # %entry
23598d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
23698d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 21
23798d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
23898d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 11
23998d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
24098d51c25Swangpc; RV32I-NEXT:    add a1, a1, a0
24198d51c25Swangpc; RV32I-NEXT:    slli a0, a1, 21
24298d51c25Swangpc; RV32I-NEXT:    or a0, a3, a0
24398d51c25Swangpc; RV32I-NEXT:    srai a1, a1, 11
24498d51c25Swangpc; RV32I-NEXT:    ret
24598d51c25Swangpc;
24698d51c25Swangpc; RV64I-LABEL: sdiv64_pow2_2048:
24798d51c25Swangpc; RV64I:       # %bb.0: # %entry
24898d51c25Swangpc; RV64I-NEXT:    srai a1, a0, 63
24998d51c25Swangpc; RV64I-NEXT:    srli a1, a1, 53
25098d51c25Swangpc; RV64I-NEXT:    add a0, a0, a1
25198d51c25Swangpc; RV64I-NEXT:    srai a0, a0, 11
25298d51c25Swangpc; RV64I-NEXT:    ret
25398d51c25Swangpcentry:
25498d51c25Swangpc  %div = sdiv i64 %a, 2048
25598d51c25Swangpc  ret i64 %div
25698d51c25Swangpc}
25798d51c25Swangpc
25898d51c25Swangpcdefine i64 @sdiv64_pow2_negative_2048(i64 %a) {
25998d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_negative_2048:
26098d51c25Swangpc; RV32I:       # %bb.0: # %entry
26198d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
26298d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 21
26398d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
26498d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 11
26598d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
266*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
267*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a0, 21
268*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a0, 11
269*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
270*9122c523SPengcheng Wang; RV32I-NEXT:    neg a0, a1
271*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a1
272*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
273*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a2, a1
27498d51c25Swangpc; RV32I-NEXT:    ret
27598d51c25Swangpc;
27698d51c25Swangpc; RV64I-LABEL: sdiv64_pow2_negative_2048:
27798d51c25Swangpc; RV64I:       # %bb.0: # %entry
27898d51c25Swangpc; RV64I-NEXT:    srai a1, a0, 63
27998d51c25Swangpc; RV64I-NEXT:    srli a1, a1, 53
28098d51c25Swangpc; RV64I-NEXT:    add a0, a0, a1
28198d51c25Swangpc; RV64I-NEXT:    srai a0, a0, 11
28298d51c25Swangpc; RV64I-NEXT:    neg a0, a0
28398d51c25Swangpc; RV64I-NEXT:    ret
28498d51c25Swangpcentry:
28598d51c25Swangpc  %div = sdiv i64 %a, -2048
28698d51c25Swangpc  ret i64 %div
28798d51c25Swangpc}
28898d51c25Swangpc
28998d51c25Swangpcdefine i64 @sdiv64_pow2_4096(i64 %a) {
29098d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_4096:
29198d51c25Swangpc; RV32I:       # %bb.0: # %entry
29298d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
29398d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 20
29498d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
29598d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 12
29698d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
29798d51c25Swangpc; RV32I-NEXT:    add a1, a1, a0
29898d51c25Swangpc; RV32I-NEXT:    slli a0, a1, 20
29998d51c25Swangpc; RV32I-NEXT:    or a0, a3, a0
30098d51c25Swangpc; RV32I-NEXT:    srai a1, a1, 12
30198d51c25Swangpc; RV32I-NEXT:    ret
30298d51c25Swangpc;
30370a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_4096:
30470a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
30570a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
30670a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 52
30770a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
30870a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 12
30970a64fe7SCraig Topper; RV64I-NEXT:    ret
31098d51c25Swangpcentry:
31198d51c25Swangpc  %div = sdiv i64 %a, 4096
31298d51c25Swangpc  ret i64 %div
31398d51c25Swangpc}
31498d51c25Swangpc
31598d51c25Swangpcdefine i64 @sdiv64_pow2_negative_4096(i64 %a) {
31698d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_negative_4096:
31798d51c25Swangpc; RV32I:       # %bb.0: # %entry
31898d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
31998d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 20
32098d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
32198d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 12
32298d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
323*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
324*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a0, 20
325*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a0, 12
326*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
327*9122c523SPengcheng Wang; RV32I-NEXT:    neg a0, a1
328*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a1
329*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
330*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a2, a1
33198d51c25Swangpc; RV32I-NEXT:    ret
33298d51c25Swangpc;
33370a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_negative_4096:
33470a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
33570a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
33670a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 52
33770a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
33870a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 12
33970a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
34070a64fe7SCraig Topper; RV64I-NEXT:    ret
34198d51c25Swangpcentry:
34298d51c25Swangpc  %div = sdiv i64 %a, -4096
34398d51c25Swangpc  ret i64 %div
34498d51c25Swangpc}
34598d51c25Swangpc
34698d51c25Swangpcdefine i64 @sdiv64_pow2_65536(i64 %a) {
34798d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_65536:
34898d51c25Swangpc; RV32I:       # %bb.0: # %entry
34998d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
35098d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 16
35198d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
35298d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 16
35398d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
35498d51c25Swangpc; RV32I-NEXT:    add a1, a1, a0
35598d51c25Swangpc; RV32I-NEXT:    slli a0, a1, 16
35698d51c25Swangpc; RV32I-NEXT:    or a0, a3, a0
35798d51c25Swangpc; RV32I-NEXT:    srai a1, a1, 16
35898d51c25Swangpc; RV32I-NEXT:    ret
35998d51c25Swangpc;
36070a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_65536:
36170a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
36270a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
36370a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 48
36470a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
36570a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 16
36670a64fe7SCraig Topper; RV64I-NEXT:    ret
36798d51c25Swangpcentry:
36898d51c25Swangpc  %div = sdiv i64 %a, 65536
36998d51c25Swangpc  ret i64 %div
37098d51c25Swangpc}
37198d51c25Swangpc
37298d51c25Swangpcdefine i64 @sdiv64_pow2_negative_65536(i64 %a) {
37398d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_negative_65536:
37498d51c25Swangpc; RV32I:       # %bb.0: # %entry
37598d51c25Swangpc; RV32I-NEXT:    srai a2, a1, 31
37698d51c25Swangpc; RV32I-NEXT:    srli a2, a2, 16
37798d51c25Swangpc; RV32I-NEXT:    add a2, a0, a2
37898d51c25Swangpc; RV32I-NEXT:    srli a3, a2, 16
37998d51c25Swangpc; RV32I-NEXT:    sltu a0, a2, a0
380*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
381*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a0, 16
382*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a0, 16
383*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
384*9122c523SPengcheng Wang; RV32I-NEXT:    neg a0, a1
385*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a1
386*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
387*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a2, a1
38898d51c25Swangpc; RV32I-NEXT:    ret
38998d51c25Swangpc;
39070a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_negative_65536:
39170a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
39270a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
39370a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 48
39470a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
39570a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 16
39670a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
39770a64fe7SCraig Topper; RV64I-NEXT:    ret
39898d51c25Swangpcentry:
39998d51c25Swangpc  %div = sdiv i64 %a, -65536
40098d51c25Swangpc  ret i64 %div
40198d51c25Swangpc}
40298d51c25Swangpc
40398d51c25Swangpcdefine i64 @sdiv64_pow2_8589934592(i64 %a) {
40498d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_8589934592:
40598d51c25Swangpc; RV32I:       # %bb.0: # %entry
40698d51c25Swangpc; RV32I-NEXT:    srli a2, a1, 31
40786eff6beSPhilip Reames; RV32I-NEXT:    add a2, a1, a2
40886eff6beSPhilip Reames; RV32I-NEXT:    srai a1, a1, 31
40986eff6beSPhilip Reames; RV32I-NEXT:    add a1, a0, a1
41086eff6beSPhilip Reames; RV32I-NEXT:    sltu a0, a1, a0
41186eff6beSPhilip Reames; RV32I-NEXT:    add a1, a2, a0
412a8c79121SCraig Topper; RV32I-NEXT:    srai a0, a1, 1
413a8c79121SCraig Topper; RV32I-NEXT:    srai a1, a1, 31
41498d51c25Swangpc; RV32I-NEXT:    ret
41598d51c25Swangpc;
41670a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_8589934592:
41770a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
41870a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
41970a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 31
42070a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
42170a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 33
42270a64fe7SCraig Topper; RV64I-NEXT:    ret
42398d51c25Swangpcentry:
42498d51c25Swangpc  %div = sdiv i64 %a, 8589934592 ; 2^33
42598d51c25Swangpc  ret i64 %div
42698d51c25Swangpc}
42798d51c25Swangpc
42898d51c25Swangpcdefine i64 @sdiv64_pow2_negative_8589934592(i64 %a) {
42998d51c25Swangpc; RV32I-LABEL: sdiv64_pow2_negative_8589934592:
43098d51c25Swangpc; RV32I:       # %bb.0: # %entry
43198d51c25Swangpc; RV32I-NEXT:    srli a2, a1, 31
43286eff6beSPhilip Reames; RV32I-NEXT:    add a2, a1, a2
43386eff6beSPhilip Reames; RV32I-NEXT:    srai a1, a1, 31
43486eff6beSPhilip Reames; RV32I-NEXT:    add a1, a0, a1
43586eff6beSPhilip Reames; RV32I-NEXT:    sltu a0, a1, a0
43698d51c25Swangpc; RV32I-NEXT:    add a0, a2, a0
43798d51c25Swangpc; RV32I-NEXT:    srai a1, a0, 31
43898d51c25Swangpc; RV32I-NEXT:    srai a0, a0, 1
43998d51c25Swangpc; RV32I-NEXT:    snez a2, a0
44086eff6beSPhilip Reames; RV32I-NEXT:    neg a1, a1
44186eff6beSPhilip Reames; RV32I-NEXT:    sub a1, a1, a2
44298d51c25Swangpc; RV32I-NEXT:    neg a0, a0
44398d51c25Swangpc; RV32I-NEXT:    ret
44498d51c25Swangpc;
44570a64fe7SCraig Topper; RV64I-LABEL: sdiv64_pow2_negative_8589934592:
44670a64fe7SCraig Topper; RV64I:       # %bb.0: # %entry
44770a64fe7SCraig Topper; RV64I-NEXT:    srai a1, a0, 63
44870a64fe7SCraig Topper; RV64I-NEXT:    srli a1, a1, 31
44970a64fe7SCraig Topper; RV64I-NEXT:    add a0, a0, a1
45070a64fe7SCraig Topper; RV64I-NEXT:    srai a0, a0, 33
45170a64fe7SCraig Topper; RV64I-NEXT:    neg a0, a0
45270a64fe7SCraig Topper; RV64I-NEXT:    ret
45398d51c25Swangpcentry:
45498d51c25Swangpc  %div = sdiv i64 %a, -8589934592 ; -2^33
45598d51c25Swangpc  ret i64 %div
45698d51c25Swangpc}
457