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