1f7b096d7SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2f7b096d7SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \ 3f7b096d7SCraig Topper; RUN: | FileCheck -check-prefixes=RV32,RV32IM %s 433d008b1SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+m,+zba,+zbb \ 5f7b096d7SCraig Topper; RUN: -verify-machineinstrs < %s \ 6f7b096d7SCraig Topper; RUN: | FileCheck -check-prefixes=RV32,RV32IMZB %s 7f7b096d7SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \ 8f7b096d7SCraig Topper; RUN: | FileCheck -check-prefixes=RV64,RV64IM %s 933d008b1SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+m,+zba,+zbb \ 10f7b096d7SCraig Topper; RUN: -verify-machineinstrs < %s \ 11f7b096d7SCraig Topper; RUN: | FileCheck -check-prefixes=RV64,RV64IMZB %s 12f7b096d7SCraig Topper 13f7b096d7SCraig Topper; Test that there is a single shift after the mul and no addition. 14f7b096d7SCraig Topperdefine i32 @udiv_constant_no_add(i32 %a) nounwind { 15f7b096d7SCraig Topper; RV32-LABEL: udiv_constant_no_add: 16f7b096d7SCraig Topper; RV32: # %bb.0: 17f7b096d7SCraig Topper; RV32-NEXT: lui a1, 838861 18f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, -819 19f7b096d7SCraig Topper; RV32-NEXT: mulhu a0, a0, a1 20f7b096d7SCraig Topper; RV32-NEXT: srli a0, a0, 2 21f7b096d7SCraig Topper; RV32-NEXT: ret 22f7b096d7SCraig Topper; 2379016f6eSCraig Topper; RV64-LABEL: udiv_constant_no_add: 2479016f6eSCraig Topper; RV64: # %bb.0: 2579016f6eSCraig Topper; RV64-NEXT: slli a0, a0, 32 2679016f6eSCraig Topper; RV64-NEXT: lui a1, 838861 2786240751SPhilip Reames; RV64-NEXT: addi a1, a1, -819 2879016f6eSCraig Topper; RV64-NEXT: slli a1, a1, 32 2979016f6eSCraig Topper; RV64-NEXT: mulhu a0, a0, a1 3079016f6eSCraig Topper; RV64-NEXT: srli a0, a0, 34 3179016f6eSCraig Topper; RV64-NEXT: ret 32f7b096d7SCraig Topper %1 = udiv i32 %a, 5 33f7b096d7SCraig Topper ret i32 %1 34f7b096d7SCraig Topper} 35f7b096d7SCraig Topper 36f7b096d7SCraig Topper; This constant requires a sub, shrli, add sequence after the mul. 37f7b096d7SCraig Topperdefine i32 @udiv_constant_add(i32 %a) nounwind { 38f7b096d7SCraig Topper; RV32-LABEL: udiv_constant_add: 39f7b096d7SCraig Topper; RV32: # %bb.0: 40f7b096d7SCraig Topper; RV32-NEXT: lui a1, 149797 41f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, -1755 42f7b096d7SCraig Topper; RV32-NEXT: mulhu a1, a0, a1 43f7b096d7SCraig Topper; RV32-NEXT: sub a0, a0, a1 44f7b096d7SCraig Topper; RV32-NEXT: srli a0, a0, 1 45f7b096d7SCraig Topper; RV32-NEXT: add a0, a0, a1 46f7b096d7SCraig Topper; RV32-NEXT: srli a0, a0, 2 47f7b096d7SCraig Topper; RV32-NEXT: ret 48f7b096d7SCraig Topper; 49cbbcb10eSCraig Topper; RV64IM-LABEL: udiv_constant_add: 50cbbcb10eSCraig Topper; RV64IM: # %bb.0: 51cbbcb10eSCraig Topper; RV64IM-NEXT: slli a1, a0, 32 52cbbcb10eSCraig Topper; RV64IM-NEXT: lui a2, 149797 5386240751SPhilip Reames; RV64IM-NEXT: addi a2, a2, -1755 54cbbcb10eSCraig Topper; RV64IM-NEXT: slli a2, a2, 32 55cbbcb10eSCraig Topper; RV64IM-NEXT: mulhu a1, a1, a2 56cbbcb10eSCraig Topper; RV64IM-NEXT: srli a1, a1, 32 57cbbcb10eSCraig Topper; RV64IM-NEXT: subw a0, a0, a1 58cbbcb10eSCraig Topper; RV64IM-NEXT: srliw a0, a0, 1 59cbbcb10eSCraig Topper; RV64IM-NEXT: add a0, a0, a1 60cbbcb10eSCraig Topper; RV64IM-NEXT: srli a0, a0, 2 61cbbcb10eSCraig Topper; RV64IM-NEXT: ret 62cbbcb10eSCraig Topper; 63cbbcb10eSCraig Topper; RV64IMZB-LABEL: udiv_constant_add: 64cbbcb10eSCraig Topper; RV64IMZB: # %bb.0: 65cbbcb10eSCraig Topper; RV64IMZB-NEXT: zext.w a1, a0 66cbbcb10eSCraig Topper; RV64IMZB-NEXT: lui a2, 149797 67cbbcb10eSCraig Topper; RV64IMZB-NEXT: addiw a2, a2, -1755 68cbbcb10eSCraig Topper; RV64IMZB-NEXT: mul a1, a1, a2 69cbbcb10eSCraig Topper; RV64IMZB-NEXT: srli a1, a1, 32 70cbbcb10eSCraig Topper; RV64IMZB-NEXT: subw a0, a0, a1 71cbbcb10eSCraig Topper; RV64IMZB-NEXT: srliw a0, a0, 1 72cbbcb10eSCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 73cbbcb10eSCraig Topper; RV64IMZB-NEXT: srli a0, a0, 2 74cbbcb10eSCraig Topper; RV64IMZB-NEXT: ret 75f7b096d7SCraig Topper %1 = udiv i32 %a, 7 76f7b096d7SCraig Topper ret i32 %1 77f7b096d7SCraig Topper} 78f7b096d7SCraig Topper 79f7b096d7SCraig Topperdefine i64 @udiv64_constant_no_add(i64 %a) nounwind { 80f7b096d7SCraig Topper; RV32-LABEL: udiv64_constant_no_add: 81f7b096d7SCraig Topper; RV32: # %bb.0: 8238ffa2bbSCraig Topper; RV32-NEXT: add a2, a0, a1 8338ffa2bbSCraig Topper; RV32-NEXT: lui a3, 838861 84*9122c523SPengcheng Wang; RV32-NEXT: sltu a4, a2, a0 85*9122c523SPengcheng Wang; RV32-NEXT: addi a5, a3, -819 8638ffa2bbSCraig Topper; RV32-NEXT: addi a3, a3, -820 87*9122c523SPengcheng Wang; RV32-NEXT: add a2, a2, a4 88*9122c523SPengcheng Wang; RV32-NEXT: mulhu a4, a2, a5 89*9122c523SPengcheng Wang; RV32-NEXT: srli a6, a4, 2 90*9122c523SPengcheng Wang; RV32-NEXT: andi a4, a4, -4 91*9122c523SPengcheng Wang; RV32-NEXT: add a4, a4, a6 92*9122c523SPengcheng Wang; RV32-NEXT: sub a2, a2, a4 93*9122c523SPengcheng Wang; RV32-NEXT: sub a4, a0, a2 9438ffa2bbSCraig Topper; RV32-NEXT: sltu a0, a0, a2 95*9122c523SPengcheng Wang; RV32-NEXT: mul a2, a4, a3 96*9122c523SPengcheng Wang; RV32-NEXT: mulhu a3, a4, a5 97e00e20a0SCraig Topper; RV32-NEXT: sub a1, a1, a0 98*9122c523SPengcheng Wang; RV32-NEXT: add a2, a3, a2 99*9122c523SPengcheng Wang; RV32-NEXT: mul a1, a1, a5 100*9122c523SPengcheng Wang; RV32-NEXT: add a1, a2, a1 101*9122c523SPengcheng Wang; RV32-NEXT: mul a0, a4, a5 102f7b096d7SCraig Topper; RV32-NEXT: ret 103f7b096d7SCraig Topper; 104f7b096d7SCraig Topper; RV64-LABEL: udiv64_constant_no_add: 105f7b096d7SCraig Topper; RV64: # %bb.0: 10638f7c7ebSFlorian Mayer; RV64-NEXT: lui a1, 838861 10738f7c7ebSFlorian Mayer; RV64-NEXT: addiw a1, a1, -819 10838f7c7ebSFlorian Mayer; RV64-NEXT: slli a2, a1, 32 10938f7c7ebSFlorian Mayer; RV64-NEXT: add a1, a1, a2 110f7b096d7SCraig Topper; RV64-NEXT: mulhu a0, a0, a1 111f7b096d7SCraig Topper; RV64-NEXT: srli a0, a0, 2 112f7b096d7SCraig Topper; RV64-NEXT: ret 113f7b096d7SCraig Topper %1 = udiv i64 %a, 5 114f7b096d7SCraig Topper ret i64 %1 115f7b096d7SCraig Topper} 116f7b096d7SCraig Topper 117f7b096d7SCraig Topperdefine i64 @udiv64_constant_add(i64 %a) nounwind { 118f7b096d7SCraig Topper; RV32-LABEL: udiv64_constant_add: 119f7b096d7SCraig Topper; RV32: # %bb.0: 120f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, -16 121f7b096d7SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 122f7b096d7SCraig Topper; RV32-NEXT: li a2, 7 123f7b096d7SCraig Topper; RV32-NEXT: li a3, 0 124eabaee0cSFangrui Song; RV32-NEXT: call __udivdi3 125f7b096d7SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 126f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, 16 127f7b096d7SCraig Topper; RV32-NEXT: ret 128f7b096d7SCraig Topper; 129f7b096d7SCraig Topper; RV64-LABEL: udiv64_constant_add: 130f7b096d7SCraig Topper; RV64: # %bb.0: 13141454ab2Swangpc; RV64-NEXT: lui a1, %hi(.LCPI3_0) 13241454ab2Swangpc; RV64-NEXT: ld a1, %lo(.LCPI3_0)(a1) 133f7b096d7SCraig Topper; RV64-NEXT: mulhu a1, a0, a1 134f7b096d7SCraig Topper; RV64-NEXT: sub a0, a0, a1 135f7b096d7SCraig Topper; RV64-NEXT: srli a0, a0, 1 136f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 137f7b096d7SCraig Topper; RV64-NEXT: srli a0, a0, 2 138f7b096d7SCraig Topper; RV64-NEXT: ret 139f7b096d7SCraig Topper %1 = udiv i64 %a, 7 140f7b096d7SCraig Topper ret i64 %1 141f7b096d7SCraig Topper} 142f7b096d7SCraig Topper 143f7b096d7SCraig Topperdefine i8 @udiv8_constant_no_add(i8 %a) nounwind { 144f7b096d7SCraig Topper; RV32-LABEL: udiv8_constant_no_add: 145f7b096d7SCraig Topper; RV32: # %bb.0: 146f7b096d7SCraig Topper; RV32-NEXT: andi a0, a0, 255 147f7b096d7SCraig Topper; RV32-NEXT: li a1, 205 148f7b096d7SCraig Topper; RV32-NEXT: mul a0, a0, a1 149f7b096d7SCraig Topper; RV32-NEXT: srli a0, a0, 10 150f7b096d7SCraig Topper; RV32-NEXT: ret 151f7b096d7SCraig Topper; 152f7b096d7SCraig Topper; RV64-LABEL: udiv8_constant_no_add: 153f7b096d7SCraig Topper; RV64: # %bb.0: 154f7b096d7SCraig Topper; RV64-NEXT: andi a0, a0, 255 155f7b096d7SCraig Topper; RV64-NEXT: li a1, 205 156f7b096d7SCraig Topper; RV64-NEXT: mul a0, a0, a1 157f7b096d7SCraig Topper; RV64-NEXT: srli a0, a0, 10 158f7b096d7SCraig Topper; RV64-NEXT: ret 159f7b096d7SCraig Topper %1 = udiv i8 %a, 5 160f7b096d7SCraig Topper ret i8 %1 161f7b096d7SCraig Topper} 162f7b096d7SCraig Topper 163f7b096d7SCraig Topperdefine i8 @udiv8_constant_add(i8 %a) nounwind { 164f7b096d7SCraig Topper; RV32IM-LABEL: udiv8_constant_add: 165f7b096d7SCraig Topper; RV32IM: # %bb.0: 166f7b096d7SCraig Topper; RV32IM-NEXT: andi a1, a0, 255 167f7b096d7SCraig Topper; RV32IM-NEXT: li a2, 37 168f7b096d7SCraig Topper; RV32IM-NEXT: mul a1, a1, a2 169f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a1, 8 170f7b096d7SCraig Topper; RV32IM-NEXT: sub a0, a0, a1 171b645bcd9SCraig Topper; RV32IM-NEXT: slli a0, a0, 24 172b645bcd9SCraig Topper; RV32IM-NEXT: srli a0, a0, 25 173f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a0, a1 174f7b096d7SCraig Topper; RV32IM-NEXT: srli a0, a0, 2 175f7b096d7SCraig Topper; RV32IM-NEXT: ret 176f7b096d7SCraig Topper; 177f7b096d7SCraig Topper; RV32IMZB-LABEL: udiv8_constant_add: 178f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 179f7b096d7SCraig Topper; RV32IMZB-NEXT: andi a1, a0, 255 180f7b096d7SCraig Topper; RV32IMZB-NEXT: sh3add a2, a1, a1 181f7b096d7SCraig Topper; RV32IMZB-NEXT: sh2add a1, a2, a1 182f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a1, 8 183f7b096d7SCraig Topper; RV32IMZB-NEXT: sub a0, a0, a1 184b645bcd9SCraig Topper; RV32IMZB-NEXT: slli a0, a0, 24 185b645bcd9SCraig Topper; RV32IMZB-NEXT: srli a0, a0, 25 186f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a0, a1 187f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a0, a0, 2 188f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 189f7b096d7SCraig Topper; 190f7b096d7SCraig Topper; RV64IM-LABEL: udiv8_constant_add: 191f7b096d7SCraig Topper; RV64IM: # %bb.0: 192f7b096d7SCraig Topper; RV64IM-NEXT: andi a1, a0, 255 193f7b096d7SCraig Topper; RV64IM-NEXT: li a2, 37 194f7b096d7SCraig Topper; RV64IM-NEXT: mul a1, a1, a2 195f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a1, 8 196015ff729SCraig Topper; RV64IM-NEXT: subw a0, a0, a1 197b645bcd9SCraig Topper; RV64IM-NEXT: slli a0, a0, 56 198b645bcd9SCraig Topper; RV64IM-NEXT: srli a0, a0, 57 199f7b096d7SCraig Topper; RV64IM-NEXT: add a0, a0, a1 200f7b096d7SCraig Topper; RV64IM-NEXT: srli a0, a0, 2 201f7b096d7SCraig Topper; RV64IM-NEXT: ret 202f7b096d7SCraig Topper; 203f7b096d7SCraig Topper; RV64IMZB-LABEL: udiv8_constant_add: 204f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 205f7b096d7SCraig Topper; RV64IMZB-NEXT: andi a1, a0, 255 206f7b096d7SCraig Topper; RV64IMZB-NEXT: sh3add a2, a1, a1 207f7b096d7SCraig Topper; RV64IMZB-NEXT: sh2add a1, a2, a1 208f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a1, a1, 8 209015ff729SCraig Topper; RV64IMZB-NEXT: subw a0, a0, a1 210b645bcd9SCraig Topper; RV64IMZB-NEXT: slli a0, a0, 56 211b645bcd9SCraig Topper; RV64IMZB-NEXT: srli a0, a0, 57 212f7b096d7SCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 213f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a0, a0, 2 214f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 215f7b096d7SCraig Topper %1 = udiv i8 %a, 7 216f7b096d7SCraig Topper ret i8 %1 217f7b096d7SCraig Topper} 218f7b096d7SCraig Topper 219f7b096d7SCraig Topperdefine i16 @udiv16_constant_no_add(i16 %a) nounwind { 22079016f6eSCraig Topper; RV32-LABEL: udiv16_constant_no_add: 22179016f6eSCraig Topper; RV32: # %bb.0: 22279016f6eSCraig Topper; RV32-NEXT: slli a0, a0, 16 22379016f6eSCraig Topper; RV32-NEXT: lui a1, 838864 22479016f6eSCraig Topper; RV32-NEXT: mulhu a0, a0, a1 22579016f6eSCraig Topper; RV32-NEXT: srli a0, a0, 18 22679016f6eSCraig Topper; RV32-NEXT: ret 227f7b096d7SCraig Topper; 22879016f6eSCraig Topper; RV64-LABEL: udiv16_constant_no_add: 22979016f6eSCraig Topper; RV64: # %bb.0: 23079016f6eSCraig Topper; RV64-NEXT: lui a1, 52429 23179016f6eSCraig Topper; RV64-NEXT: slli a1, a1, 4 23279016f6eSCraig Topper; RV64-NEXT: slli a0, a0, 48 23379016f6eSCraig Topper; RV64-NEXT: mulhu a0, a0, a1 23479016f6eSCraig Topper; RV64-NEXT: srli a0, a0, 18 23579016f6eSCraig Topper; RV64-NEXT: ret 236f7b096d7SCraig Topper %1 = udiv i16 %a, 5 237f7b096d7SCraig Topper ret i16 %1 238f7b096d7SCraig Topper} 239f7b096d7SCraig Topper 240f7b096d7SCraig Topperdefine i16 @udiv16_constant_add(i16 %a) nounwind { 24179016f6eSCraig Topper; RV32-LABEL: udiv16_constant_add: 24279016f6eSCraig Topper; RV32: # %bb.0: 24379016f6eSCraig Topper; RV32-NEXT: slli a1, a0, 16 24479016f6eSCraig Topper; RV32-NEXT: lui a2, 149808 24579016f6eSCraig Topper; RV32-NEXT: mulhu a1, a1, a2 24679016f6eSCraig Topper; RV32-NEXT: srli a1, a1, 16 24779016f6eSCraig Topper; RV32-NEXT: sub a0, a0, a1 24879016f6eSCraig Topper; RV32-NEXT: slli a0, a0, 16 24979016f6eSCraig Topper; RV32-NEXT: srli a0, a0, 17 25079016f6eSCraig Topper; RV32-NEXT: add a0, a0, a1 25179016f6eSCraig Topper; RV32-NEXT: srli a0, a0, 2 25279016f6eSCraig Topper; RV32-NEXT: ret 253f7b096d7SCraig Topper; 25479016f6eSCraig Topper; RV64-LABEL: udiv16_constant_add: 25579016f6eSCraig Topper; RV64: # %bb.0: 25679016f6eSCraig Topper; RV64-NEXT: slli a1, a0, 48 25779016f6eSCraig Topper; RV64-NEXT: lui a2, 149808 25879016f6eSCraig Topper; RV64-NEXT: mulhu a1, a1, a2 25979016f6eSCraig Topper; RV64-NEXT: srli a1, a1, 16 26079016f6eSCraig Topper; RV64-NEXT: subw a0, a0, a1 26179016f6eSCraig Topper; RV64-NEXT: slli a0, a0, 48 26279016f6eSCraig Topper; RV64-NEXT: srli a0, a0, 49 26379016f6eSCraig Topper; RV64-NEXT: add a0, a0, a1 26479016f6eSCraig Topper; RV64-NEXT: srli a0, a0, 2 26579016f6eSCraig Topper; RV64-NEXT: ret 266f7b096d7SCraig Topper %1 = udiv i16 %a, 7 267f7b096d7SCraig Topper ret i16 %1 268f7b096d7SCraig Topper} 269f7b096d7SCraig Topper 270f7b096d7SCraig Topper; Test the simplest case a srli and an add after the mul. No srai. 271f7b096d7SCraig Topperdefine i32 @sdiv_constant_no_srai(i32 %a) nounwind { 272f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_no_srai: 273f7b096d7SCraig Topper; RV32: # %bb.0: 274f7b096d7SCraig Topper; RV32-NEXT: lui a1, 349525 275f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, 1366 276f7b096d7SCraig Topper; RV32-NEXT: mulh a0, a0, a1 277f7b096d7SCraig Topper; RV32-NEXT: srli a1, a0, 31 278f7b096d7SCraig Topper; RV32-NEXT: add a0, a0, a1 279f7b096d7SCraig Topper; RV32-NEXT: ret 280f7b096d7SCraig Topper; 281f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_no_srai: 282f7b096d7SCraig Topper; RV64: # %bb.0: 283f7b096d7SCraig Topper; RV64-NEXT: sext.w a0, a0 284f7b096d7SCraig Topper; RV64-NEXT: lui a1, 349525 285f7b096d7SCraig Topper; RV64-NEXT: addiw a1, a1, 1366 286f7b096d7SCraig Topper; RV64-NEXT: mul a0, a0, a1 287f7b096d7SCraig Topper; RV64-NEXT: srli a1, a0, 63 288f7b096d7SCraig Topper; RV64-NEXT: srli a0, a0, 32 289f7b096d7SCraig Topper; RV64-NEXT: addw a0, a0, a1 290f7b096d7SCraig Topper; RV64-NEXT: ret 291f7b096d7SCraig Topper %1 = sdiv i32 %a, 3 292f7b096d7SCraig Topper ret i32 %1 293f7b096d7SCraig Topper} 294f7b096d7SCraig Topper 295f7b096d7SCraig Topper; This constant requires an srai between the mul and the add. 296f7b096d7SCraig Topperdefine i32 @sdiv_constant_srai(i32 %a) nounwind { 297f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_srai: 298f7b096d7SCraig Topper; RV32: # %bb.0: 299f7b096d7SCraig Topper; RV32-NEXT: lui a1, 419430 300f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, 1639 301f7b096d7SCraig Topper; RV32-NEXT: mulh a0, a0, a1 302f7b096d7SCraig Topper; RV32-NEXT: srli a1, a0, 31 303f7b096d7SCraig Topper; RV32-NEXT: srai a0, a0, 1 304f7b096d7SCraig Topper; RV32-NEXT: add a0, a0, a1 305f7b096d7SCraig Topper; RV32-NEXT: ret 306f7b096d7SCraig Topper; 307f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_srai: 308f7b096d7SCraig Topper; RV64: # %bb.0: 309f7b096d7SCraig Topper; RV64-NEXT: sext.w a0, a0 310f7b096d7SCraig Topper; RV64-NEXT: lui a1, 419430 311f7b096d7SCraig Topper; RV64-NEXT: addiw a1, a1, 1639 312f7b096d7SCraig Topper; RV64-NEXT: mul a0, a0, a1 313f7b096d7SCraig Topper; RV64-NEXT: srli a1, a0, 63 314f7b096d7SCraig Topper; RV64-NEXT: srai a0, a0, 33 315f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 316f7b096d7SCraig Topper; RV64-NEXT: ret 317f7b096d7SCraig Topper %1 = sdiv i32 %a, 5 318f7b096d7SCraig Topper ret i32 %1 319f7b096d7SCraig Topper} 320f7b096d7SCraig Topper 321f7b096d7SCraig Topper; This constant requires an add and an srai after the mul. 322f7b096d7SCraig Topperdefine i32 @sdiv_constant_add_srai(i32 %a) nounwind { 323f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_add_srai: 324f7b096d7SCraig Topper; RV32: # %bb.0: 325f7b096d7SCraig Topper; RV32-NEXT: lui a1, 599186 326f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, 1171 327f7b096d7SCraig Topper; RV32-NEXT: mulh a1, a0, a1 328f7b096d7SCraig Topper; RV32-NEXT: add a0, a1, a0 329f7b096d7SCraig Topper; RV32-NEXT: srli a1, a0, 31 330f7b096d7SCraig Topper; RV32-NEXT: srai a0, a0, 2 331f7b096d7SCraig Topper; RV32-NEXT: add a0, a0, a1 332f7b096d7SCraig Topper; RV32-NEXT: ret 333f7b096d7SCraig Topper; 334f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_add_srai: 335f7b096d7SCraig Topper; RV64: # %bb.0: 336f7b096d7SCraig Topper; RV64-NEXT: sext.w a1, a0 337f7b096d7SCraig Topper; RV64-NEXT: lui a2, 599186 338f7b096d7SCraig Topper; RV64-NEXT: addiw a2, a2, 1171 339f7b096d7SCraig Topper; RV64-NEXT: mul a1, a1, a2 340f7b096d7SCraig Topper; RV64-NEXT: srli a1, a1, 32 341d64d3c5aSNitin John Raj; RV64-NEXT: add a0, a1, a0 342f7b096d7SCraig Topper; RV64-NEXT: srliw a1, a0, 31 343f7b096d7SCraig Topper; RV64-NEXT: sraiw a0, a0, 2 344f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 345f7b096d7SCraig Topper; RV64-NEXT: ret 346f7b096d7SCraig Topper %1 = sdiv i32 %a, 7 347f7b096d7SCraig Topper ret i32 %1 348f7b096d7SCraig Topper} 349f7b096d7SCraig Topper 350f7b096d7SCraig Topper; This constant requires a sub and an srai after the mul. 351f7b096d7SCraig Topperdefine i32 @sdiv_constant_sub_srai(i32 %a) nounwind { 352f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_sub_srai: 353f7b096d7SCraig Topper; RV32: # %bb.0: 354f7b096d7SCraig Topper; RV32-NEXT: lui a1, 449390 355f7b096d7SCraig Topper; RV32-NEXT: addi a1, a1, -1171 356f7b096d7SCraig Topper; RV32-NEXT: mulh a1, a0, a1 357e00e20a0SCraig Topper; RV32-NEXT: sub a1, a1, a0 358e00e20a0SCraig Topper; RV32-NEXT: srli a0, a1, 31 359e00e20a0SCraig Topper; RV32-NEXT: srai a1, a1, 2 360e00e20a0SCraig Topper; RV32-NEXT: add a0, a1, a0 361f7b096d7SCraig Topper; RV32-NEXT: ret 362f7b096d7SCraig Topper; 363f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_sub_srai: 364f7b096d7SCraig Topper; RV64: # %bb.0: 365f7b096d7SCraig Topper; RV64-NEXT: sext.w a1, a0 366f7b096d7SCraig Topper; RV64-NEXT: lui a2, 449390 367f7b096d7SCraig Topper; RV64-NEXT: addiw a2, a2, -1171 368f7b096d7SCraig Topper; RV64-NEXT: mul a1, a1, a2 369f7b096d7SCraig Topper; RV64-NEXT: srli a1, a1, 32 370e00e20a0SCraig Topper; RV64-NEXT: subw a1, a1, a0 371e00e20a0SCraig Topper; RV64-NEXT: srliw a0, a1, 31 372e00e20a0SCraig Topper; RV64-NEXT: sraiw a1, a1, 2 373e00e20a0SCraig Topper; RV64-NEXT: add a0, a1, a0 374f7b096d7SCraig Topper; RV64-NEXT: ret 375f7b096d7SCraig Topper %1 = sdiv i32 %a, -7 376f7b096d7SCraig Topper ret i32 %1 377f7b096d7SCraig Topper} 378f7b096d7SCraig Topper 379f7b096d7SCraig Topperdefine i64 @sdiv64_constant_no_srai(i64 %a) nounwind { 380f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_no_srai: 381f7b096d7SCraig Topper; RV32: # %bb.0: 382f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, -16 383f7b096d7SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 384f7b096d7SCraig Topper; RV32-NEXT: li a2, 3 385f7b096d7SCraig Topper; RV32-NEXT: li a3, 0 386eabaee0cSFangrui Song; RV32-NEXT: call __divdi3 387f7b096d7SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 388f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, 16 389f7b096d7SCraig Topper; RV32-NEXT: ret 390f7b096d7SCraig Topper; 391f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_no_srai: 392f7b096d7SCraig Topper; RV64: # %bb.0: 39341454ab2Swangpc; RV64-NEXT: lui a1, %hi(.LCPI12_0) 39441454ab2Swangpc; RV64-NEXT: ld a1, %lo(.LCPI12_0)(a1) 395f7b096d7SCraig Topper; RV64-NEXT: mulh a0, a0, a1 396f7b096d7SCraig Topper; RV64-NEXT: srli a1, a0, 63 397f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 398f7b096d7SCraig Topper; RV64-NEXT: ret 399f7b096d7SCraig Topper %1 = sdiv i64 %a, 3 400f7b096d7SCraig Topper ret i64 %1 401f7b096d7SCraig Topper} 402f7b096d7SCraig Topper 403f7b096d7SCraig Topperdefine i64 @sdiv64_constant_srai(i64 %a) nounwind { 404f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_srai: 405f7b096d7SCraig Topper; RV32: # %bb.0: 406f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, -16 407f7b096d7SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 408f7b096d7SCraig Topper; RV32-NEXT: li a2, 5 409f7b096d7SCraig Topper; RV32-NEXT: li a3, 0 410eabaee0cSFangrui Song; RV32-NEXT: call __divdi3 411f7b096d7SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 412f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, 16 413f7b096d7SCraig Topper; RV32-NEXT: ret 414f7b096d7SCraig Topper; 415f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_srai: 416f7b096d7SCraig Topper; RV64: # %bb.0: 41741454ab2Swangpc; RV64-NEXT: lui a1, %hi(.LCPI13_0) 41841454ab2Swangpc; RV64-NEXT: ld a1, %lo(.LCPI13_0)(a1) 419f7b096d7SCraig Topper; RV64-NEXT: mulh a0, a0, a1 420f7b096d7SCraig Topper; RV64-NEXT: srli a1, a0, 63 421f7b096d7SCraig Topper; RV64-NEXT: srai a0, a0, 1 422f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 423f7b096d7SCraig Topper; RV64-NEXT: ret 424f7b096d7SCraig Topper %1 = sdiv i64 %a, 5 425f7b096d7SCraig Topper ret i64 %1 426f7b096d7SCraig Topper} 427f7b096d7SCraig Topper 428f7b096d7SCraig Topperdefine i64 @sdiv64_constant_add_srai(i64 %a) nounwind { 429f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_add_srai: 430f7b096d7SCraig Topper; RV32: # %bb.0: 431f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, -16 432f7b096d7SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 433f7b096d7SCraig Topper; RV32-NEXT: li a2, 15 434f7b096d7SCraig Topper; RV32-NEXT: li a3, 0 435eabaee0cSFangrui Song; RV32-NEXT: call __divdi3 436f7b096d7SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 437f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, 16 438f7b096d7SCraig Topper; RV32-NEXT: ret 439f7b096d7SCraig Topper; 440f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_add_srai: 441f7b096d7SCraig Topper; RV64: # %bb.0: 44238f7c7ebSFlorian Mayer; RV64-NEXT: lui a1, 559241 44338f7c7ebSFlorian Mayer; RV64-NEXT: addiw a1, a1, -1911 44438f7c7ebSFlorian Mayer; RV64-NEXT: slli a2, a1, 32 44538f7c7ebSFlorian Mayer; RV64-NEXT: add a1, a1, a2 446f7b096d7SCraig Topper; RV64-NEXT: mulh a1, a0, a1 447f7b096d7SCraig Topper; RV64-NEXT: add a0, a1, a0 448f7b096d7SCraig Topper; RV64-NEXT: srli a1, a0, 63 449f7b096d7SCraig Topper; RV64-NEXT: srai a0, a0, 3 450f7b096d7SCraig Topper; RV64-NEXT: add a0, a0, a1 451f7b096d7SCraig Topper; RV64-NEXT: ret 452f7b096d7SCraig Topper %1 = sdiv i64 %a, 15 453f7b096d7SCraig Topper ret i64 %1 454f7b096d7SCraig Topper} 455f7b096d7SCraig Topper 456f7b096d7SCraig Topperdefine i64 @sdiv64_constant_sub_srai(i64 %a) nounwind { 457f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_sub_srai: 458f7b096d7SCraig Topper; RV32: # %bb.0: 459f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, -16 460f7b096d7SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 461f7b096d7SCraig Topper; RV32-NEXT: li a2, -3 462f7b096d7SCraig Topper; RV32-NEXT: li a3, -1 463eabaee0cSFangrui Song; RV32-NEXT: call __divdi3 464f7b096d7SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 465f7b096d7SCraig Topper; RV32-NEXT: addi sp, sp, 16 466f7b096d7SCraig Topper; RV32-NEXT: ret 467f7b096d7SCraig Topper; 468f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_sub_srai: 469f7b096d7SCraig Topper; RV64: # %bb.0: 47038f7c7ebSFlorian Mayer; RV64-NEXT: lui a1, 349525 47138f7c7ebSFlorian Mayer; RV64-NEXT: addiw a1, a1, 1365 47238f7c7ebSFlorian Mayer; RV64-NEXT: slli a2, a1, 32 47338f7c7ebSFlorian Mayer; RV64-NEXT: add a1, a1, a2 474f7b096d7SCraig Topper; RV64-NEXT: mulh a1, a0, a1 475e00e20a0SCraig Topper; RV64-NEXT: sub a1, a1, a0 476e00e20a0SCraig Topper; RV64-NEXT: srli a0, a1, 63 477e00e20a0SCraig Topper; RV64-NEXT: srai a1, a1, 1 478e00e20a0SCraig Topper; RV64-NEXT: add a0, a1, a0 479f7b096d7SCraig Topper; RV64-NEXT: ret 480f7b096d7SCraig Topper %1 = sdiv i64 %a, -3 481f7b096d7SCraig Topper ret i64 %1 482f7b096d7SCraig Topper} 483f7b096d7SCraig Topper 484f7b096d7SCraig Topperdefine i8 @sdiv8_constant_no_srai(i8 %a) nounwind { 485f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_no_srai: 486f7b096d7SCraig Topper; RV32IM: # %bb.0: 487f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 24 488f7b096d7SCraig Topper; RV32IM-NEXT: li a1, 86 489*9122c523SPengcheng Wang; RV32IM-NEXT: srai a0, a0, 24 490f7b096d7SCraig Topper; RV32IM-NEXT: mul a0, a0, a1 491aef0e77cSSimon Pilgrim; RV32IM-NEXT: srli a1, a0, 31 492aef0e77cSSimon Pilgrim; RV32IM-NEXT: srli a0, a0, 8 493aef0e77cSSimon Pilgrim; RV32IM-NEXT: add a0, a0, a1 494f7b096d7SCraig Topper; RV32IM-NEXT: ret 495f7b096d7SCraig Topper; 496f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_no_srai: 497f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 498f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.b a0, a0 499f7b096d7SCraig Topper; RV32IMZB-NEXT: li a1, 86 500f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a0, a0, a1 501aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: srli a1, a0, 31 502aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: srli a0, a0, 8 503aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: add a0, a0, a1 504f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 505f7b096d7SCraig Topper; 506f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_no_srai: 507f7b096d7SCraig Topper; RV64IM: # %bb.0: 508f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 56 509f7b096d7SCraig Topper; RV64IM-NEXT: li a1, 86 510*9122c523SPengcheng Wang; RV64IM-NEXT: srai a0, a0, 56 511f7b096d7SCraig Topper; RV64IM-NEXT: mul a0, a0, a1 512aef0e77cSSimon Pilgrim; RV64IM-NEXT: srli a1, a0, 63 513aef0e77cSSimon Pilgrim; RV64IM-NEXT: srli a0, a0, 8 514aef0e77cSSimon Pilgrim; RV64IM-NEXT: add a0, a0, a1 515f7b096d7SCraig Topper; RV64IM-NEXT: ret 516f7b096d7SCraig Topper; 517f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_no_srai: 518f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 519f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.b a0, a0 520f7b096d7SCraig Topper; RV64IMZB-NEXT: li a1, 86 521f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a0, a0, a1 522aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srli a1, a0, 63 523aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srli a0, a0, 8 524aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: add a0, a0, a1 525f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 526f7b096d7SCraig Topper %1 = sdiv i8 %a, 3 527f7b096d7SCraig Topper ret i8 %1 528f7b096d7SCraig Topper} 529f7b096d7SCraig Topper 530f7b096d7SCraig Topperdefine i8 @sdiv8_constant_srai(i8 %a) nounwind { 531f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_srai: 532f7b096d7SCraig Topper; RV32IM: # %bb.0: 533f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 24 534f7b096d7SCraig Topper; RV32IM-NEXT: li a1, 103 535*9122c523SPengcheng Wang; RV32IM-NEXT: srai a0, a0, 24 536f7b096d7SCraig Topper; RV32IM-NEXT: mul a0, a0, a1 537aef0e77cSSimon Pilgrim; RV32IM-NEXT: srli a1, a0, 31 538aef0e77cSSimon Pilgrim; RV32IM-NEXT: srai a0, a0, 9 539aef0e77cSSimon Pilgrim; RV32IM-NEXT: add a0, a0, a1 540f7b096d7SCraig Topper; RV32IM-NEXT: ret 541f7b096d7SCraig Topper; 542f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_srai: 543f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 544f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.b a0, a0 545f7b096d7SCraig Topper; RV32IMZB-NEXT: li a1, 103 546f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a0, a0, a1 547aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: srli a1, a0, 31 548aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: srai a0, a0, 9 549aef0e77cSSimon Pilgrim; RV32IMZB-NEXT: add a0, a0, a1 550f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 551f7b096d7SCraig Topper; 552f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_srai: 553f7b096d7SCraig Topper; RV64IM: # %bb.0: 554f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 56 555f7b096d7SCraig Topper; RV64IM-NEXT: li a1, 103 556*9122c523SPengcheng Wang; RV64IM-NEXT: srai a0, a0, 56 557f7b096d7SCraig Topper; RV64IM-NEXT: mul a0, a0, a1 558aef0e77cSSimon Pilgrim; RV64IM-NEXT: srli a1, a0, 63 559aef0e77cSSimon Pilgrim; RV64IM-NEXT: srai a0, a0, 9 560aef0e77cSSimon Pilgrim; RV64IM-NEXT: add a0, a0, a1 561f7b096d7SCraig Topper; RV64IM-NEXT: ret 562f7b096d7SCraig Topper; 563f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_srai: 564f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 565f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.b a0, a0 566f7b096d7SCraig Topper; RV64IMZB-NEXT: li a1, 103 567f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a0, a0, a1 568aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srli a1, a0, 63 569aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srai a0, a0, 9 570aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: add a0, a0, a1 571f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 572f7b096d7SCraig Topper %1 = sdiv i8 %a, 5 573f7b096d7SCraig Topper ret i8 %1 574f7b096d7SCraig Topper} 575f7b096d7SCraig Topper 576f7b096d7SCraig Topperdefine i8 @sdiv8_constant_add_srai(i8 %a) nounwind { 577f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_add_srai: 578f7b096d7SCraig Topper; RV32IM: # %bb.0: 579f7b096d7SCraig Topper; RV32IM-NEXT: slli a1, a0, 24 580f7b096d7SCraig Topper; RV32IM-NEXT: li a2, -109 581*9122c523SPengcheng Wang; RV32IM-NEXT: srai a1, a1, 24 582f7b096d7SCraig Topper; RV32IM-NEXT: mul a1, a1, a2 583f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a1, 8 584f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a1, a0 585f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 24 586b645bcd9SCraig Topper; RV32IM-NEXT: srli a1, a0, 31 587f7b096d7SCraig Topper; RV32IM-NEXT: srai a0, a0, 26 588f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a0, a1 589f7b096d7SCraig Topper; RV32IM-NEXT: ret 590f7b096d7SCraig Topper; 591f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_add_srai: 592f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 593f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.b a1, a0 594f7b096d7SCraig Topper; RV32IMZB-NEXT: li a2, -109 595f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a1, a1, a2 596f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a1, 8 597f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a1, a0 598296e8caeSCraig Topper; RV32IMZB-NEXT: slli a0, a0, 24 599b645bcd9SCraig Topper; RV32IMZB-NEXT: srli a1, a0, 31 600296e8caeSCraig Topper; RV32IMZB-NEXT: srai a0, a0, 26 601f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a0, a1 602f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 603f7b096d7SCraig Topper; 604f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_add_srai: 605f7b096d7SCraig Topper; RV64IM: # %bb.0: 606f7b096d7SCraig Topper; RV64IM-NEXT: slli a1, a0, 56 607f7b096d7SCraig Topper; RV64IM-NEXT: li a2, -109 608*9122c523SPengcheng Wang; RV64IM-NEXT: srai a1, a1, 56 609f7b096d7SCraig Topper; RV64IM-NEXT: mul a1, a1, a2 610f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a1, 8 611d64d3c5aSNitin John Raj; RV64IM-NEXT: add a0, a1, a0 612f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 56 613b645bcd9SCraig Topper; RV64IM-NEXT: srli a1, a0, 63 614f7b096d7SCraig Topper; RV64IM-NEXT: srai a0, a0, 58 615f7b096d7SCraig Topper; RV64IM-NEXT: add a0, a0, a1 616f7b096d7SCraig Topper; RV64IM-NEXT: ret 617f7b096d7SCraig Topper; 618f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_add_srai: 619f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 620f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.b a1, a0 621f7b096d7SCraig Topper; RV64IMZB-NEXT: li a2, -109 622f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a1, a1, a2 623f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a1, a1, 8 624d64d3c5aSNitin John Raj; RV64IMZB-NEXT: add a0, a1, a0 625296e8caeSCraig Topper; RV64IMZB-NEXT: slli a0, a0, 56 626b645bcd9SCraig Topper; RV64IMZB-NEXT: srli a1, a0, 63 627296e8caeSCraig Topper; RV64IMZB-NEXT: srai a0, a0, 58 628f7b096d7SCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 629f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 630f7b096d7SCraig Topper %1 = sdiv i8 %a, 7 631f7b096d7SCraig Topper ret i8 %1 632f7b096d7SCraig Topper} 633f7b096d7SCraig Topper 634f7b096d7SCraig Topperdefine i8 @sdiv8_constant_sub_srai(i8 %a) nounwind { 635f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_sub_srai: 636f7b096d7SCraig Topper; RV32IM: # %bb.0: 637f7b096d7SCraig Topper; RV32IM-NEXT: slli a1, a0, 24 638f7b096d7SCraig Topper; RV32IM-NEXT: li a2, 109 639*9122c523SPengcheng Wang; RV32IM-NEXT: srai a1, a1, 24 640f7b096d7SCraig Topper; RV32IM-NEXT: mul a1, a1, a2 641f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a1, 8 642e00e20a0SCraig Topper; RV32IM-NEXT: sub a1, a1, a0 643e00e20a0SCraig Topper; RV32IM-NEXT: slli a1, a1, 24 644e00e20a0SCraig Topper; RV32IM-NEXT: srli a0, a1, 31 645e00e20a0SCraig Topper; RV32IM-NEXT: srai a1, a1, 26 646e00e20a0SCraig Topper; RV32IM-NEXT: add a0, a1, a0 647f7b096d7SCraig Topper; RV32IM-NEXT: ret 648f7b096d7SCraig Topper; 649f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_sub_srai: 650f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 651f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.b a1, a0 652f7b096d7SCraig Topper; RV32IMZB-NEXT: li a2, 109 653f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a1, a1, a2 654f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a1, 8 655e00e20a0SCraig Topper; RV32IMZB-NEXT: sub a1, a1, a0 656e00e20a0SCraig Topper; RV32IMZB-NEXT: slli a1, a1, 24 657e00e20a0SCraig Topper; RV32IMZB-NEXT: srli a0, a1, 31 658e00e20a0SCraig Topper; RV32IMZB-NEXT: srai a1, a1, 26 659e00e20a0SCraig Topper; RV32IMZB-NEXT: add a0, a1, a0 660f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 661f7b096d7SCraig Topper; 662f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_sub_srai: 663f7b096d7SCraig Topper; RV64IM: # %bb.0: 664f7b096d7SCraig Topper; RV64IM-NEXT: slli a1, a0, 56 665f7b096d7SCraig Topper; RV64IM-NEXT: li a2, 109 666*9122c523SPengcheng Wang; RV64IM-NEXT: srai a1, a1, 56 667f7b096d7SCraig Topper; RV64IM-NEXT: mul a1, a1, a2 668f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a1, 8 669e00e20a0SCraig Topper; RV64IM-NEXT: subw a1, a1, a0 670e00e20a0SCraig Topper; RV64IM-NEXT: slli a1, a1, 56 671e00e20a0SCraig Topper; RV64IM-NEXT: srli a0, a1, 63 672e00e20a0SCraig Topper; RV64IM-NEXT: srai a1, a1, 58 673e00e20a0SCraig Topper; RV64IM-NEXT: add a0, a1, a0 674f7b096d7SCraig Topper; RV64IM-NEXT: ret 675f7b096d7SCraig Topper; 676f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_sub_srai: 677f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 678f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.b a1, a0 679f7b096d7SCraig Topper; RV64IMZB-NEXT: li a2, 109 680f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a1, a1, a2 681f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a1, a1, 8 682e00e20a0SCraig Topper; RV64IMZB-NEXT: subw a1, a1, a0 683e00e20a0SCraig Topper; RV64IMZB-NEXT: slli a1, a1, 56 684e00e20a0SCraig Topper; RV64IMZB-NEXT: srli a0, a1, 63 685e00e20a0SCraig Topper; RV64IMZB-NEXT: srai a1, a1, 58 686e00e20a0SCraig Topper; RV64IMZB-NEXT: add a0, a1, a0 687f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 688f7b096d7SCraig Topper %1 = sdiv i8 %a, -7 689f7b096d7SCraig Topper ret i8 %1 690f7b096d7SCraig Topper} 691f7b096d7SCraig Topper 692f7b096d7SCraig Topperdefine i16 @sdiv16_constant_no_srai(i16 %a) nounwind { 693f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_no_srai: 694f7b096d7SCraig Topper; RV32IM: # %bb.0: 695f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 16 696f7b096d7SCraig Topper; RV32IM-NEXT: lui a1, 5 697*9122c523SPengcheng Wang; RV32IM-NEXT: srai a0, a0, 16 698f7b096d7SCraig Topper; RV32IM-NEXT: addi a1, a1, 1366 699f7b096d7SCraig Topper; RV32IM-NEXT: mul a0, a0, a1 700f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a0, 31 701f7b096d7SCraig Topper; RV32IM-NEXT: srli a0, a0, 16 702f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a0, a1 703f7b096d7SCraig Topper; RV32IM-NEXT: ret 704f7b096d7SCraig Topper; 705f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_no_srai: 706f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 707f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.h a0, a0 708f7b096d7SCraig Topper; RV32IMZB-NEXT: lui a1, 5 709f7b096d7SCraig Topper; RV32IMZB-NEXT: addi a1, a1, 1366 710f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a0, a0, a1 711f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a0, 31 712f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a0, a0, 16 713f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a0, a1 714f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 715f7b096d7SCraig Topper; 716f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_no_srai: 717f7b096d7SCraig Topper; RV64IM: # %bb.0: 718f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 48 719f7b096d7SCraig Topper; RV64IM-NEXT: lui a1, 5 720*9122c523SPengcheng Wang; RV64IM-NEXT: srai a0, a0, 48 721f7b096d7SCraig Topper; RV64IM-NEXT: addiw a1, a1, 1366 722f7b096d7SCraig Topper; RV64IM-NEXT: mul a0, a0, a1 723aef0e77cSSimon Pilgrim; RV64IM-NEXT: srli a1, a0, 63 724f7b096d7SCraig Topper; RV64IM-NEXT: srli a0, a0, 16 725f7b096d7SCraig Topper; RV64IM-NEXT: add a0, a0, a1 726f7b096d7SCraig Topper; RV64IM-NEXT: ret 727f7b096d7SCraig Topper; 728f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_no_srai: 729f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 730f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.h a0, a0 731f7b096d7SCraig Topper; RV64IMZB-NEXT: lui a1, 5 732f7b096d7SCraig Topper; RV64IMZB-NEXT: addiw a1, a1, 1366 733f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a0, a0, a1 734aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srli a1, a0, 63 735f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a0, a0, 16 736f7b096d7SCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 737f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 738f7b096d7SCraig Topper %1 = sdiv i16 %a, 3 739f7b096d7SCraig Topper ret i16 %1 740f7b096d7SCraig Topper} 741f7b096d7SCraig Topper 742f7b096d7SCraig Topperdefine i16 @sdiv16_constant_srai(i16 %a) nounwind { 743f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_srai: 744f7b096d7SCraig Topper; RV32IM: # %bb.0: 745f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 16 746f7b096d7SCraig Topper; RV32IM-NEXT: lui a1, 6 747*9122c523SPengcheng Wang; RV32IM-NEXT: srai a0, a0, 16 748f7b096d7SCraig Topper; RV32IM-NEXT: addi a1, a1, 1639 749f7b096d7SCraig Topper; RV32IM-NEXT: mul a0, a0, a1 750f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a0, 31 751f7b096d7SCraig Topper; RV32IM-NEXT: srai a0, a0, 17 752f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a0, a1 753f7b096d7SCraig Topper; RV32IM-NEXT: ret 754f7b096d7SCraig Topper; 755f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_srai: 756f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 757f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.h a0, a0 758f7b096d7SCraig Topper; RV32IMZB-NEXT: lui a1, 6 759f7b096d7SCraig Topper; RV32IMZB-NEXT: addi a1, a1, 1639 760f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a0, a0, a1 761f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a0, 31 762f7b096d7SCraig Topper; RV32IMZB-NEXT: srai a0, a0, 17 763f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a0, a1 764f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 765f7b096d7SCraig Topper; 766f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_srai: 767f7b096d7SCraig Topper; RV64IM: # %bb.0: 768f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 48 769f7b096d7SCraig Topper; RV64IM-NEXT: lui a1, 6 770*9122c523SPengcheng Wang; RV64IM-NEXT: srai a0, a0, 48 771f7b096d7SCraig Topper; RV64IM-NEXT: addiw a1, a1, 1639 772f7b096d7SCraig Topper; RV64IM-NEXT: mul a0, a0, a1 773aef0e77cSSimon Pilgrim; RV64IM-NEXT: srli a1, a0, 63 774f7b096d7SCraig Topper; RV64IM-NEXT: srai a0, a0, 17 775f7b096d7SCraig Topper; RV64IM-NEXT: add a0, a0, a1 776f7b096d7SCraig Topper; RV64IM-NEXT: ret 777f7b096d7SCraig Topper; 778f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_srai: 779f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 780f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.h a0, a0 781f7b096d7SCraig Topper; RV64IMZB-NEXT: lui a1, 6 782f7b096d7SCraig Topper; RV64IMZB-NEXT: addiw a1, a1, 1639 783f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a0, a0, a1 784aef0e77cSSimon Pilgrim; RV64IMZB-NEXT: srli a1, a0, 63 785f7b096d7SCraig Topper; RV64IMZB-NEXT: srai a0, a0, 17 786f7b096d7SCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 787f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 788f7b096d7SCraig Topper %1 = sdiv i16 %a, 5 789f7b096d7SCraig Topper ret i16 %1 790f7b096d7SCraig Topper} 791f7b096d7SCraig Topper 792f7b096d7SCraig Topperdefine i16 @sdiv16_constant_add_srai(i16 %a) nounwind { 793f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_add_srai: 794f7b096d7SCraig Topper; RV32IM: # %bb.0: 795f7b096d7SCraig Topper; RV32IM-NEXT: slli a1, a0, 16 796f7b096d7SCraig Topper; RV32IM-NEXT: lui a2, 1048569 797*9122c523SPengcheng Wang; RV32IM-NEXT: srai a1, a1, 16 798f7b096d7SCraig Topper; RV32IM-NEXT: addi a2, a2, -1911 799f7b096d7SCraig Topper; RV32IM-NEXT: mul a1, a1, a2 800f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a1, 16 801f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a1, a0 802f7b096d7SCraig Topper; RV32IM-NEXT: slli a0, a0, 16 803f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a0, 31 804f7b096d7SCraig Topper; RV32IM-NEXT: srai a0, a0, 19 805f7b096d7SCraig Topper; RV32IM-NEXT: add a0, a0, a1 806f7b096d7SCraig Topper; RV32IM-NEXT: ret 807f7b096d7SCraig Topper; 808f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_add_srai: 809f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 810f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.h a1, a0 811f7b096d7SCraig Topper; RV32IMZB-NEXT: lui a2, 1048569 812f7b096d7SCraig Topper; RV32IMZB-NEXT: addi a2, a2, -1911 813f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a1, a1, a2 814f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a1, 16 815f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a1, a0 816296e8caeSCraig Topper; RV32IMZB-NEXT: slli a0, a0, 16 817296e8caeSCraig Topper; RV32IMZB-NEXT: srli a1, a0, 31 818296e8caeSCraig Topper; RV32IMZB-NEXT: srai a0, a0, 19 819f7b096d7SCraig Topper; RV32IMZB-NEXT: add a0, a0, a1 820f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 821f7b096d7SCraig Topper; 822f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_add_srai: 823f7b096d7SCraig Topper; RV64IM: # %bb.0: 824f7b096d7SCraig Topper; RV64IM-NEXT: slli a1, a0, 48 825f7b096d7SCraig Topper; RV64IM-NEXT: lui a2, 1048569 826*9122c523SPengcheng Wang; RV64IM-NEXT: srai a1, a1, 48 827f7b096d7SCraig Topper; RV64IM-NEXT: addiw a2, a2, -1911 828f7b096d7SCraig Topper; RV64IM-NEXT: mul a1, a1, a2 829f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a1, 16 830d64d3c5aSNitin John Raj; RV64IM-NEXT: add a0, a1, a0 831f7b096d7SCraig Topper; RV64IM-NEXT: slli a0, a0, 48 832f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a0, 63 833f7b096d7SCraig Topper; RV64IM-NEXT: srai a0, a0, 51 834f7b096d7SCraig Topper; RV64IM-NEXT: add a0, a0, a1 835f7b096d7SCraig Topper; RV64IM-NEXT: ret 836f7b096d7SCraig Topper; 837f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_add_srai: 838f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 839f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.h a1, a0 840f7b096d7SCraig Topper; RV64IMZB-NEXT: lui a2, 1048569 841f7b096d7SCraig Topper; RV64IMZB-NEXT: addiw a2, a2, -1911 842f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a1, a1, a2 843f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a1, a1, 16 844d64d3c5aSNitin John Raj; RV64IMZB-NEXT: add a0, a1, a0 845296e8caeSCraig Topper; RV64IMZB-NEXT: slli a0, a0, 48 846296e8caeSCraig Topper; RV64IMZB-NEXT: srli a1, a0, 63 847296e8caeSCraig Topper; RV64IMZB-NEXT: srai a0, a0, 51 848f7b096d7SCraig Topper; RV64IMZB-NEXT: add a0, a0, a1 849f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 850f7b096d7SCraig Topper %1 = sdiv i16 %a, 15 851f7b096d7SCraig Topper ret i16 %1 852f7b096d7SCraig Topper} 853f7b096d7SCraig Topper 854f7b096d7SCraig Topperdefine i16 @sdiv16_constant_sub_srai(i16 %a) nounwind { 855f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_sub_srai: 856f7b096d7SCraig Topper; RV32IM: # %bb.0: 857f7b096d7SCraig Topper; RV32IM-NEXT: slli a1, a0, 16 858f7b096d7SCraig Topper; RV32IM-NEXT: lui a2, 7 859*9122c523SPengcheng Wang; RV32IM-NEXT: srai a1, a1, 16 860f7b096d7SCraig Topper; RV32IM-NEXT: addi a2, a2, 1911 861f7b096d7SCraig Topper; RV32IM-NEXT: mul a1, a1, a2 862f7b096d7SCraig Topper; RV32IM-NEXT: srli a1, a1, 16 863e00e20a0SCraig Topper; RV32IM-NEXT: sub a1, a1, a0 864e00e20a0SCraig Topper; RV32IM-NEXT: slli a1, a1, 16 865e00e20a0SCraig Topper; RV32IM-NEXT: srli a0, a1, 31 866e00e20a0SCraig Topper; RV32IM-NEXT: srai a1, a1, 19 867e00e20a0SCraig Topper; RV32IM-NEXT: add a0, a1, a0 868f7b096d7SCraig Topper; RV32IM-NEXT: ret 869f7b096d7SCraig Topper; 870f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_sub_srai: 871f7b096d7SCraig Topper; RV32IMZB: # %bb.0: 872f7b096d7SCraig Topper; RV32IMZB-NEXT: sext.h a1, a0 873f7b096d7SCraig Topper; RV32IMZB-NEXT: lui a2, 7 874f7b096d7SCraig Topper; RV32IMZB-NEXT: addi a2, a2, 1911 875f7b096d7SCraig Topper; RV32IMZB-NEXT: mul a1, a1, a2 876f7b096d7SCraig Topper; RV32IMZB-NEXT: srli a1, a1, 16 877e00e20a0SCraig Topper; RV32IMZB-NEXT: sub a1, a1, a0 878e00e20a0SCraig Topper; RV32IMZB-NEXT: slli a1, a1, 16 879e00e20a0SCraig Topper; RV32IMZB-NEXT: srli a0, a1, 31 880e00e20a0SCraig Topper; RV32IMZB-NEXT: srai a1, a1, 19 881e00e20a0SCraig Topper; RV32IMZB-NEXT: add a0, a1, a0 882f7b096d7SCraig Topper; RV32IMZB-NEXT: ret 883f7b096d7SCraig Topper; 884f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_sub_srai: 885f7b096d7SCraig Topper; RV64IM: # %bb.0: 886f7b096d7SCraig Topper; RV64IM-NEXT: slli a1, a0, 48 887f7b096d7SCraig Topper; RV64IM-NEXT: lui a2, 7 888*9122c523SPengcheng Wang; RV64IM-NEXT: srai a1, a1, 48 889f7b096d7SCraig Topper; RV64IM-NEXT: addiw a2, a2, 1911 890f7b096d7SCraig Topper; RV64IM-NEXT: mul a1, a1, a2 891f7b096d7SCraig Topper; RV64IM-NEXT: srli a1, a1, 16 892e00e20a0SCraig Topper; RV64IM-NEXT: subw a1, a1, a0 893e00e20a0SCraig Topper; RV64IM-NEXT: slli a1, a1, 48 894e00e20a0SCraig Topper; RV64IM-NEXT: srli a0, a1, 63 895e00e20a0SCraig Topper; RV64IM-NEXT: srai a1, a1, 51 896e00e20a0SCraig Topper; RV64IM-NEXT: add a0, a1, a0 897f7b096d7SCraig Topper; RV64IM-NEXT: ret 898f7b096d7SCraig Topper; 899f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_sub_srai: 900f7b096d7SCraig Topper; RV64IMZB: # %bb.0: 901f7b096d7SCraig Topper; RV64IMZB-NEXT: sext.h a1, a0 902f7b096d7SCraig Topper; RV64IMZB-NEXT: lui a2, 7 903f7b096d7SCraig Topper; RV64IMZB-NEXT: addiw a2, a2, 1911 904f7b096d7SCraig Topper; RV64IMZB-NEXT: mul a1, a1, a2 905f7b096d7SCraig Topper; RV64IMZB-NEXT: srli a1, a1, 16 906e00e20a0SCraig Topper; RV64IMZB-NEXT: subw a1, a1, a0 907e00e20a0SCraig Topper; RV64IMZB-NEXT: slli a1, a1, 48 908e00e20a0SCraig Topper; RV64IMZB-NEXT: srli a0, a1, 63 909e00e20a0SCraig Topper; RV64IMZB-NEXT: srai a1, a1, 51 910e00e20a0SCraig Topper; RV64IMZB-NEXT: add a0, a1, a0 911f7b096d7SCraig Topper; RV64IMZB-NEXT: ret 912f7b096d7SCraig Topper %1 = sdiv i16 %a, -15 913f7b096d7SCraig Topper ret i16 %1 914f7b096d7SCraig Topper} 915