1dcd751b2SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3dcd751b2SCraig Topper; RUN: | FileCheck %s -check-prefix=RV32I 4dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 5dcd751b2SCraig Topper; RUN: | FileCheck %s -check-prefix=RV64I 6dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \ 7d8f929a5SCraig Topper; RUN: | FileCheck %s -check-prefixes=RV32ZB,RV32ZBB 8dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \ 9d8f929a5SCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64ZB,RV64ZBB 103e98ce45SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \ 11d8f929a5SCraig Topper; RUN: | FileCheck %s -check-prefixes=RV32ZB,RV32ZBKB 123e98ce45SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \ 13d8f929a5SCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64ZB,RV64ZBKB 14dcd751b2SCraig Topper 15dcd751b2SCraig Topperdeclare i16 @llvm.bswap.i16(i16) 16dcd751b2SCraig Topperdeclare i32 @llvm.bswap.i32(i32) 17dcd751b2SCraig Topperdeclare i64 @llvm.bswap.i64(i64) 18dcd751b2SCraig Topperdeclare i8 @llvm.bitreverse.i8(i8) 19dcd751b2SCraig Topperdeclare i16 @llvm.bitreverse.i16(i16) 20dcd751b2SCraig Topperdeclare i32 @llvm.bitreverse.i32(i32) 21dcd751b2SCraig Topperdeclare i64 @llvm.bitreverse.i64(i64) 22dcd751b2SCraig Topper 23dcd751b2SCraig Topperdefine i16 @test_bswap_i16(i16 %a) nounwind { 24dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i16: 25dcd751b2SCraig Topper; RV32I: # %bb.0: 26dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a0, 8 27dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 16 28dcd751b2SCraig Topper; RV32I-NEXT: srli a0, a0, 24 29dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 30dcd751b2SCraig Topper; RV32I-NEXT: ret 31dcd751b2SCraig Topper; 32dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i16: 33dcd751b2SCraig Topper; RV64I: # %bb.0: 34dcd751b2SCraig Topper; RV64I-NEXT: slli a1, a0, 8 35dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 48 36dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 56 37dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 38dcd751b2SCraig Topper; RV64I-NEXT: ret 39dcd751b2SCraig Topper; 40dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i16: 41dcd751b2SCraig Topper; RV32ZB: # %bb.0: 42dcd751b2SCraig Topper; RV32ZB-NEXT: rev8 a0, a0 43dcd751b2SCraig Topper; RV32ZB-NEXT: srli a0, a0, 16 44dcd751b2SCraig Topper; RV32ZB-NEXT: ret 45dcd751b2SCraig Topper; 46dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i16: 47dcd751b2SCraig Topper; RV64ZB: # %bb.0: 48dcd751b2SCraig Topper; RV64ZB-NEXT: rev8 a0, a0 49dcd751b2SCraig Topper; RV64ZB-NEXT: srli a0, a0, 48 50dcd751b2SCraig Topper; RV64ZB-NEXT: ret 51dcd751b2SCraig Topper %tmp = call i16 @llvm.bswap.i16(i16 %a) 52dcd751b2SCraig Topper ret i16 %tmp 53dcd751b2SCraig Topper} 54dcd751b2SCraig Topper 55dcd751b2SCraig Topperdefine i32 @test_bswap_i32(i32 %a) nounwind { 56dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i32: 57dcd751b2SCraig Topper; RV32I: # %bb.0: 58dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 8 59dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 16 60*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 24 61dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -256 62dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 63f387918dSCraig Topper; RV32I-NEXT: and a2, a0, a2 64*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a1, a3 65f387918dSCraig Topper; RV32I-NEXT: slli a2, a2, 8 66dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 24 6786eff6beSPhilip Reames; RV32I-NEXT: or a0, a0, a2 68dcd751b2SCraig Topper; RV32I-NEXT: or a0, a0, a1 69dcd751b2SCraig Topper; RV32I-NEXT: ret 70dcd751b2SCraig Topper; 71dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i32: 72dcd751b2SCraig Topper; RV64I: # %bb.0: 7369d5a038SSimon Pilgrim; RV64I-NEXT: srli a1, a0, 8 74dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 16 75*9122c523SPengcheng Wang; RV64I-NEXT: srliw a3, a0, 24 76dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -256 77dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 78f387918dSCraig Topper; RV64I-NEXT: and a2, a0, a2 79*9122c523SPengcheng Wang; RV64I-NEXT: or a1, a1, a3 80f387918dSCraig Topper; RV64I-NEXT: slli a2, a2, 8 81dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 24 8286eff6beSPhilip Reames; RV64I-NEXT: or a0, a0, a2 83dcd751b2SCraig Topper; RV64I-NEXT: or a0, a0, a1 84dcd751b2SCraig Topper; RV64I-NEXT: ret 85dcd751b2SCraig Topper; 86dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i32: 87dcd751b2SCraig Topper; RV32ZB: # %bb.0: 88dcd751b2SCraig Topper; RV32ZB-NEXT: rev8 a0, a0 89dcd751b2SCraig Topper; RV32ZB-NEXT: ret 90dcd751b2SCraig Topper; 91dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i32: 92dcd751b2SCraig Topper; RV64ZB: # %bb.0: 93dcd751b2SCraig Topper; RV64ZB-NEXT: rev8 a0, a0 94dcd751b2SCraig Topper; RV64ZB-NEXT: srli a0, a0, 32 95dcd751b2SCraig Topper; RV64ZB-NEXT: ret 96dcd751b2SCraig Topper %tmp = call i32 @llvm.bswap.i32(i32 %a) 97dcd751b2SCraig Topper ret i32 %tmp 98dcd751b2SCraig Topper} 99dcd751b2SCraig Topper 100dcd751b2SCraig Topperdefine i64 @test_bswap_i64(i64 %a) nounwind { 101dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i64: 102dcd751b2SCraig Topper; RV32I: # %bb.0: 103dcd751b2SCraig Topper; RV32I-NEXT: srli a2, a1, 8 104dcd751b2SCraig Topper; RV32I-NEXT: lui a3, 16 105*9122c523SPengcheng Wang; RV32I-NEXT: srli a4, a1, 24 106*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a0, 8 107dcd751b2SCraig Topper; RV32I-NEXT: addi a3, a3, -256 108dcd751b2SCraig Topper; RV32I-NEXT: and a2, a2, a3 109dcd751b2SCraig Topper; RV32I-NEXT: or a2, a2, a4 110f387918dSCraig Topper; RV32I-NEXT: srli a4, a0, 24 111*9122c523SPengcheng Wang; RV32I-NEXT: and a5, a5, a3 112*9122c523SPengcheng Wang; RV32I-NEXT: or a4, a5, a4 113*9122c523SPengcheng Wang; RV32I-NEXT: slli a5, a1, 24 114*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 115*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 8 116*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a5, a1 117f387918dSCraig Topper; RV32I-NEXT: and a3, a0, a3 118dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 24 119*9122c523SPengcheng Wang; RV32I-NEXT: slli a3, a3, 8 120*9122c523SPengcheng Wang; RV32I-NEXT: or a3, a0, a3 121*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a1, a2 122*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a4 123dcd751b2SCraig Topper; RV32I-NEXT: ret 124dcd751b2SCraig Topper; 125dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i64: 126dcd751b2SCraig Topper; RV64I: # %bb.0: 127f387918dSCraig Topper; RV64I-NEXT: srli a1, a0, 40 128f387918dSCraig Topper; RV64I-NEXT: lui a2, 16 129*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 56 130*9122c523SPengcheng Wang; RV64I-NEXT: srli a4, a0, 24 131*9122c523SPengcheng Wang; RV64I-NEXT: lui a5, 4080 132f387918dSCraig Topper; RV64I-NEXT: addiw a2, a2, -256 133f387918dSCraig Topper; RV64I-NEXT: and a1, a1, a2 134f387918dSCraig Topper; RV64I-NEXT: or a1, a1, a3 135*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 8 136*9122c523SPengcheng Wang; RV64I-NEXT: and a4, a4, a5 137*9122c523SPengcheng Wang; RV64I-NEXT: srliw a3, a3, 24 138*9122c523SPengcheng Wang; RV64I-NEXT: slli a3, a3, 24 139*9122c523SPengcheng Wang; RV64I-NEXT: or a3, a3, a4 140*9122c523SPengcheng Wang; RV64I-NEXT: srliw a4, a0, 24 141*9122c523SPengcheng Wang; RV64I-NEXT: and a5, a0, a5 142f387918dSCraig Topper; RV64I-NEXT: and a2, a0, a2 143f387918dSCraig Topper; RV64I-NEXT: slli a0, a0, 56 144*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a4, 32 145*9122c523SPengcheng Wang; RV64I-NEXT: slli a5, a5, 24 146*9122c523SPengcheng Wang; RV64I-NEXT: or a4, a5, a4 147*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a2, 40 148*9122c523SPengcheng Wang; RV64I-NEXT: or a1, a3, a1 14986eff6beSPhilip Reames; RV64I-NEXT: or a0, a0, a2 150*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a4 151f387918dSCraig Topper; RV64I-NEXT: or a0, a0, a1 152dcd751b2SCraig Topper; RV64I-NEXT: ret 153dcd751b2SCraig Topper; 154dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i64: 155dcd751b2SCraig Topper; RV32ZB: # %bb.0: 156dcd751b2SCraig Topper; RV32ZB-NEXT: rev8 a2, a1 157dcd751b2SCraig Topper; RV32ZB-NEXT: rev8 a1, a0 158dcd751b2SCraig Topper; RV32ZB-NEXT: mv a0, a2 159dcd751b2SCraig Topper; RV32ZB-NEXT: ret 160dcd751b2SCraig Topper; 161dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i64: 162dcd751b2SCraig Topper; RV64ZB: # %bb.0: 163dcd751b2SCraig Topper; RV64ZB-NEXT: rev8 a0, a0 164dcd751b2SCraig Topper; RV64ZB-NEXT: ret 165dcd751b2SCraig Topper %tmp = call i64 @llvm.bswap.i64(i64 %a) 166dcd751b2SCraig Topper ret i64 %tmp 167dcd751b2SCraig Topper} 168dcd751b2SCraig Topper 169dcd751b2SCraig Topperdefine i8 @test_bitreverse_i8(i8 %a) nounwind { 170dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i8: 171dcd751b2SCraig Topper; RV32I: # %bb.0: 172dcd751b2SCraig Topper; RV32I-NEXT: andi a1, a0, 15 173dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 24 174*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 4 175dcd751b2SCraig Topper; RV32I-NEXT: srli a0, a0, 28 176dcd751b2SCraig Topper; RV32I-NEXT: or a0, a0, a1 177dcd751b2SCraig Topper; RV32I-NEXT: andi a1, a0, 51 178dcd751b2SCraig Topper; RV32I-NEXT: srli a0, a0, 2 179*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 2 180dcd751b2SCraig Topper; RV32I-NEXT: andi a0, a0, 51 181dcd751b2SCraig Topper; RV32I-NEXT: or a0, a0, a1 182dcd751b2SCraig Topper; RV32I-NEXT: andi a1, a0, 85 183dcd751b2SCraig Topper; RV32I-NEXT: srli a0, a0, 1 184*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 1 185dcd751b2SCraig Topper; RV32I-NEXT: andi a0, a0, 85 186dcd751b2SCraig Topper; RV32I-NEXT: or a0, a0, a1 187dcd751b2SCraig Topper; RV32I-NEXT: ret 188dcd751b2SCraig Topper; 189dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i8: 190dcd751b2SCraig Topper; RV64I: # %bb.0: 191dcd751b2SCraig Topper; RV64I-NEXT: andi a1, a0, 15 192dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 56 193*9122c523SPengcheng Wang; RV64I-NEXT: slli a1, a1, 4 194dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 60 195dcd751b2SCraig Topper; RV64I-NEXT: or a0, a0, a1 196dcd751b2SCraig Topper; RV64I-NEXT: andi a1, a0, 51 197dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 2 198*9122c523SPengcheng Wang; RV64I-NEXT: slli a1, a1, 2 199dcd751b2SCraig Topper; RV64I-NEXT: andi a0, a0, 51 200dcd751b2SCraig Topper; RV64I-NEXT: or a0, a0, a1 201dcd751b2SCraig Topper; RV64I-NEXT: andi a1, a0, 85 202dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 1 203*9122c523SPengcheng Wang; RV64I-NEXT: slli a1, a1, 1 204dcd751b2SCraig Topper; RV64I-NEXT: andi a0, a0, 85 205dcd751b2SCraig Topper; RV64I-NEXT: or a0, a0, a1 206dcd751b2SCraig Topper; RV64I-NEXT: ret 207dcd751b2SCraig Topper; 208d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i8: 209d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 210d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a1, a0, 15 211d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 24 212*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 4 213d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a0, a0, 28 214d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a0, a1 215d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a1, a0, 51 216d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a0, a0, 2 217*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 2 218d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a0, a0, 51 219d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a0, a1 220d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a1, a0, 85 221d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a0, a0, 1 222*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 1 223d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a0, a0, 85 224d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a0, a1 225d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 226dcd751b2SCraig Topper; 227d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i8: 228d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 229d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a1, a0, 15 230d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 56 231*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a1, a1, 4 232d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a0, a0, 60 233d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a0, a1 234d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a1, a0, 51 235d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a0, a0, 2 236*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a1, a1, 2 237d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a0, a0, 51 238d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a0, a1 239d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a1, a0, 85 240d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a0, a0, 1 241*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a1, a1, 1 242d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a0, a0, 85 243d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a0, a1 244d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 245d8f929a5SCraig Topper; 246d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i8: 247d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 248d8f929a5SCraig Topper; RV32ZBKB-NEXT: rev8 a0, a0 249d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 250d8f929a5SCraig Topper; RV32ZBKB-NEXT: srli a0, a0, 24 251d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 252d8f929a5SCraig Topper; 253d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i8: 254d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 255d8f929a5SCraig Topper; RV64ZBKB-NEXT: rev8 a0, a0 256d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 257d8f929a5SCraig Topper; RV64ZBKB-NEXT: srli a0, a0, 56 258d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 259dcd751b2SCraig Topper %tmp = call i8 @llvm.bitreverse.i8(i8 %a) 260dcd751b2SCraig Topper ret i8 %tmp 261dcd751b2SCraig Topper} 262dcd751b2SCraig Topper 263dcd751b2SCraig Topperdefine i16 @test_bitreverse_i16(i16 %a) nounwind { 264dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i16: 265dcd751b2SCraig Topper; RV32I: # %bb.0: 266dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a0, 8 267dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 16 268*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 1 269dcd751b2SCraig Topper; RV32I-NEXT: srli a0, a0, 24 270*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, -241 271dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 272dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 273dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 274*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 275*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 3 276*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 277dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 278dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 279dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 280dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 281*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 282*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 5 283*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 1365 284dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 285dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 286dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 287dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 288*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 289dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 290dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 291dcd751b2SCraig Topper; RV32I-NEXT: ret 292dcd751b2SCraig Topper; 293dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i16: 294dcd751b2SCraig Topper; RV64I: # %bb.0: 295dcd751b2SCraig Topper; RV64I-NEXT: slli a1, a0, 8 296dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 48 297*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 1 298dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 56 299*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, -241 300dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 301dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 302dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 303*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 304*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 3 305*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 306dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 4 307dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 308dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 309dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 310*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 311*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 5 312*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 1365 313dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 314dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 315dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 316dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 317*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 318dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 319dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 320dcd751b2SCraig Topper; RV64I-NEXT: ret 321dcd751b2SCraig Topper; 322d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i16: 323d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 324d8f929a5SCraig Topper; RV32ZBB-NEXT: rev8 a0, a0 325*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a1, 15 326*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 12 327*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a1, a1, 240 328*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a2, a1 329*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 3 330d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a0, a0, 20 331*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 819 332d8f929a5SCraig Topper; RV32ZBB-NEXT: andi a0, a0, -241 333d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a0, a1 334d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 2 335d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 336*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 337*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 5 338*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 339d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 340d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 341d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 342d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 343*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 344d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 345d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 346d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 347dcd751b2SCraig Topper; 348d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i16: 349d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 350d8f929a5SCraig Topper; RV64ZBB-NEXT: rev8 a0, a0 351*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a1, 15 352*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a2, a0, 44 353*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a1, a1, 240 354*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a2, a1 355*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 3 356d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a0, a0, 52 357*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 358d8f929a5SCraig Topper; RV64ZBB-NEXT: andi a0, a0, -241 359d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a0, a1 360d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 361d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 362*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 363*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 5 364*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 365d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 366d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 367d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 368d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 369*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 370d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 371d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 372d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 373d8f929a5SCraig Topper; 374d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i16: 375d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 376d8f929a5SCraig Topper; RV32ZBKB-NEXT: rev8 a0, a0 377d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 378d8f929a5SCraig Topper; RV32ZBKB-NEXT: srli a0, a0, 16 379d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 380d8f929a5SCraig Topper; 381d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i16: 382d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 383d8f929a5SCraig Topper; RV64ZBKB-NEXT: rev8 a0, a0 384d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 385d8f929a5SCraig Topper; RV64ZBKB-NEXT: srli a0, a0, 48 386d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 387dcd751b2SCraig Topper %tmp = call i16 @llvm.bitreverse.i16(i16 %a) 388dcd751b2SCraig Topper ret i16 %tmp 389dcd751b2SCraig Topper} 390dcd751b2SCraig Topper 391dcd751b2SCraig Topperdefine i32 @test_bitreverse_i32(i32 %a) nounwind { 392dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i32: 393dcd751b2SCraig Topper; RV32I: # %bb.0: 394dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 8 395dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 16 396*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 24 397dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -256 398dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 399f387918dSCraig Topper; RV32I-NEXT: and a2, a0, a2 400dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 24 401*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a1, a3 402*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 61681 403*9122c523SPengcheng Wang; RV32I-NEXT: slli a2, a2, 8 40486eff6beSPhilip Reames; RV32I-NEXT: or a0, a0, a2 405*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 406*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, -241 407dcd751b2SCraig Topper; RV32I-NEXT: or a0, a0, a1 408dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 409*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a3 410*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 411*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 349525 412*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 413*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 1365 414dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 415dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 416dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 417dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 418*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 419dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 420dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 421dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 422*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a3 423*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 424dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 425dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 426dcd751b2SCraig Topper; RV32I-NEXT: ret 427dcd751b2SCraig Topper; 428dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i32: 429dcd751b2SCraig Topper; RV64I: # %bb.0: 43069d5a038SSimon Pilgrim; RV64I-NEXT: srli a1, a0, 8 431dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 16 432*9122c523SPengcheng Wang; RV64I-NEXT: srliw a3, a0, 24 433dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -256 434dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 435f387918dSCraig Topper; RV64I-NEXT: and a2, a0, a2 436dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 24 437*9122c523SPengcheng Wang; RV64I-NEXT: or a1, a1, a3 438*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 61681 439*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a2, 8 44086eff6beSPhilip Reames; RV64I-NEXT: or a0, a0, a2 441*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 442*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, -241 443dcd751b2SCraig Topper; RV64I-NEXT: or a0, a0, a1 444dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 445*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a3 446*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 447*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 349525 448*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 449*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, 1365 450dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 4 451dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 452dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 453dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 454*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 455dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 2 456dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 457dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 458*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a3 459*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 460dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 1 461dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 462dcd751b2SCraig Topper; RV64I-NEXT: ret 463dcd751b2SCraig Topper; 464d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i32: 465d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 466d8f929a5SCraig Topper; RV32ZBB-NEXT: rev8 a0, a0 467*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a1, 61681 468*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 4 469*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a1, a1, -241 470*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a2, a1 471*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a1 472*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a1, 209715 473*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a1, a1, 819 474d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 475*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 476*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 2 477*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a1 478*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a2, a1 479*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 349525 480*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 481d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 482d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 483d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 484d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 485*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 486d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 487d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 488d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 489dcd751b2SCraig Topper; 490d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i32: 491d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 492d8f929a5SCraig Topper; RV64ZBB-NEXT: rev8 a0, a0 493*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a1, 61681 494*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a2, a0, 36 495*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a1, a1, -241 496*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a2, a1 497d8f929a5SCraig Topper; RV64ZBB-NEXT: lui a2, 986895 498*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a0, a0, 28 49986240751SPhilip Reames; RV64ZBB-NEXT: addi a2, a2, 240 500d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 501*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 209715 502*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 503d8f929a5SCraig Topper; RV64ZBB-NEXT: sext.w a0, a0 504d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 505d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 506d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 507*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 508*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 349525 509*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 510d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 2 511d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 512d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 513d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 514*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 515d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 1 516d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 517d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 518d8f929a5SCraig Topper; 519d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i32: 520d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 521d8f929a5SCraig Topper; RV32ZBKB-NEXT: rev8 a0, a0 522d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 523d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 524d8f929a5SCraig Topper; 525d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i32: 526d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 527d8f929a5SCraig Topper; RV64ZBKB-NEXT: rev8 a0, a0 528d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 529d8f929a5SCraig Topper; RV64ZBKB-NEXT: srli a0, a0, 32 530d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 531dcd751b2SCraig Topper %tmp = call i32 @llvm.bitreverse.i32(i32 %a) 532dcd751b2SCraig Topper ret i32 %tmp 533dcd751b2SCraig Topper} 534dcd751b2SCraig Topper 535dcd751b2SCraig Topperdefine i64 @test_bitreverse_i64(i64 %a) nounwind { 536dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i64: 537dcd751b2SCraig Topper; RV32I: # %bb.0: 538dcd751b2SCraig Topper; RV32I-NEXT: srli a2, a1, 8 539dcd751b2SCraig Topper; RV32I-NEXT: lui a3, 16 540*9122c523SPengcheng Wang; RV32I-NEXT: srli a4, a1, 24 541*9122c523SPengcheng Wang; RV32I-NEXT: slli a5, a1, 24 542*9122c523SPengcheng Wang; RV32I-NEXT: lui a6, 61681 543*9122c523SPengcheng Wang; RV32I-NEXT: srli a7, a0, 8 544dcd751b2SCraig Topper; RV32I-NEXT: addi a3, a3, -256 545dcd751b2SCraig Topper; RV32I-NEXT: and a2, a2, a3 546dcd751b2SCraig Topper; RV32I-NEXT: or a2, a2, a4 547*9122c523SPengcheng Wang; RV32I-NEXT: srli a4, a0, 24 548*9122c523SPengcheng Wang; RV32I-NEXT: and a7, a7, a3 549*9122c523SPengcheng Wang; RV32I-NEXT: or a4, a7, a4 550*9122c523SPengcheng Wang; RV32I-NEXT: lui a7, 209715 551dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a3 552*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 8 553*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a5, a1 554*9122c523SPengcheng Wang; RV32I-NEXT: lui a5, 349525 555f387918dSCraig Topper; RV32I-NEXT: and a3, a0, a3 556dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 24 557*9122c523SPengcheng Wang; RV32I-NEXT: addi a6, a6, -241 558*9122c523SPengcheng Wang; RV32I-NEXT: addi a7, a7, 819 559*9122c523SPengcheng Wang; RV32I-NEXT: addi a5, a5, 1365 560*9122c523SPengcheng Wang; RV32I-NEXT: slli a3, a3, 8 56186eff6beSPhilip Reames; RV32I-NEXT: or a0, a0, a3 562*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a1, a2 563*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a4 564*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 4 565f387918dSCraig Topper; RV32I-NEXT: and a1, a1, a6 566*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 4 567f387918dSCraig Topper; RV32I-NEXT: and a0, a0, a6 568*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a6 569*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 4 570*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a3, a6 571*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 4 572*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a2, a1 573*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a3, a0 574*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 2 575*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a7 576*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 2 577*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a7 578*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a7 579*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 2 580*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a3, a7 581*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 2 582*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a2, a1 583*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a3, a0 584*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 1 585*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a5 586*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 1 587*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a5 588*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a5 589*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 1 590*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a3, a5 591*9122c523SPengcheng Wang; RV32I-NEXT: slli a4, a0, 1 592*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a1 593*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a4 594dcd751b2SCraig Topper; RV32I-NEXT: ret 595dcd751b2SCraig Topper; 596dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i64: 597dcd751b2SCraig Topper; RV64I: # %bb.0: 598f387918dSCraig Topper; RV64I-NEXT: srli a1, a0, 40 599f387918dSCraig Topper; RV64I-NEXT: lui a2, 16 600*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 56 601*9122c523SPengcheng Wang; RV64I-NEXT: srli a4, a0, 24 602*9122c523SPengcheng Wang; RV64I-NEXT: lui a5, 4080 603*9122c523SPengcheng Wang; RV64I-NEXT: srli a6, a0, 8 604*9122c523SPengcheng Wang; RV64I-NEXT: srliw a7, a0, 24 605*9122c523SPengcheng Wang; RV64I-NEXT: lui t0, 61681 606f387918dSCraig Topper; RV64I-NEXT: addiw a2, a2, -256 607f387918dSCraig Topper; RV64I-NEXT: and a1, a1, a2 608f387918dSCraig Topper; RV64I-NEXT: or a1, a1, a3 609*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 209715 610*9122c523SPengcheng Wang; RV64I-NEXT: and a4, a4, a5 611*9122c523SPengcheng Wang; RV64I-NEXT: srliw a6, a6, 24 612*9122c523SPengcheng Wang; RV64I-NEXT: slli a6, a6, 24 613*9122c523SPengcheng Wang; RV64I-NEXT: or a4, a6, a4 614*9122c523SPengcheng Wang; RV64I-NEXT: lui a6, 349525 615*9122c523SPengcheng Wang; RV64I-NEXT: and a5, a0, a5 616*9122c523SPengcheng Wang; RV64I-NEXT: slli a7, a7, 32 617*9122c523SPengcheng Wang; RV64I-NEXT: addiw t0, t0, -241 618*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, 819 619*9122c523SPengcheng Wang; RV64I-NEXT: addiw a6, a6, 1365 620f387918dSCraig Topper; RV64I-NEXT: slli a5, a5, 24 621*9122c523SPengcheng Wang; RV64I-NEXT: or a5, a5, a7 622*9122c523SPengcheng Wang; RV64I-NEXT: slli a7, t0, 32 623*9122c523SPengcheng Wang; RV64I-NEXT: add a7, t0, a7 624*9122c523SPengcheng Wang; RV64I-NEXT: slli t0, a3, 32 625*9122c523SPengcheng Wang; RV64I-NEXT: add a3, a3, t0 626*9122c523SPengcheng Wang; RV64I-NEXT: slli t0, a6, 32 627*9122c523SPengcheng Wang; RV64I-NEXT: add a6, a6, t0 628*9122c523SPengcheng Wang; RV64I-NEXT: or a1, a4, a1 629f387918dSCraig Topper; RV64I-NEXT: and a2, a0, a2 630f387918dSCraig Topper; RV64I-NEXT: slli a0, a0, 56 631*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a2, 40 63286eff6beSPhilip Reames; RV64I-NEXT: or a0, a0, a2 633*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a5 634f387918dSCraig Topper; RV64I-NEXT: or a0, a0, a1 635dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 636*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a7 637*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a7 638dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 4 639dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 640dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 641*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a3 642*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 643dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 644dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 645dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 646*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a6 647*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a6 648dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 649dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 650dcd751b2SCraig Topper; RV64I-NEXT: ret 651dcd751b2SCraig Topper; 652d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i64: 653d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 654d8f929a5SCraig Topper; RV32ZBB-NEXT: rev8 a1, a1 655*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 61681 656*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a3, 209715 657d8f929a5SCraig Topper; RV32ZBB-NEXT: rev8 a0, a0 658*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a4, a1, 4 659*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, -241 660*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a0, 4 661*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a4, a4, a2 662*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 663*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a5, a5, a2 664*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a2 665*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 349525 666*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a3, a3, 819 667*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 668*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 4 669d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 670*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a4, a1 671*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a5, a0 672*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a4, a1, 2 673*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a3 674*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a0, 2 675*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a3 676*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a4, a4, a3 677*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 2 678*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a3, a5, a3 679d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 680*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a4, a1 681*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a3, a0 682*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a3, a1, 1 683*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 684*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a4, a0, 1 685*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a2 686*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a3, a3, a2 687*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a1, a1, 1 688*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a4, a2 689*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a4, a0, 1 690*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a3, a1 691*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a2, a4 692d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 693dcd751b2SCraig Topper; 694d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i64: 695d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 696d8f929a5SCraig Topper; RV64ZBB-NEXT: rev8 a0, a0 697*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a1, 61681 69838f7c7ebSFlorian Mayer; RV64ZBB-NEXT: lui a2, 209715 699*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a3, 349525 700*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a1, a1, -241 70138f7c7ebSFlorian Mayer; RV64ZBB-NEXT: addiw a2, a2, 819 702*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a3, a3, 1365 703*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a1, 32 704*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a1, a1, a4 705*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a2, 32 706*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a2, a2, a4 707*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a3, 32 708*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a3, a3, a4 709*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a4, a0, 4 710*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a4, a4, a1 711*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a1 712*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a0, a0, 4 713*9122c523SPengcheng Wang; RV64ZBB-NEXT: or a0, a4, a0 714*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a1, a0, 2 71538f7c7ebSFlorian Mayer; RV64ZBB-NEXT: and a0, a0, a2 716*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 717d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 71838f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 71938f7c7ebSFlorian Mayer; RV64ZBB-NEXT: srli a1, a0, 1 720*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a3 721*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a3 722d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 72338f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 724d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 725d8f929a5SCraig Topper; 726d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i64: 727d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 728d8f929a5SCraig Topper; RV32ZBKB-NEXT: rev8 a1, a1 729*9122c523SPengcheng Wang; RV32ZBKB-NEXT: rev8 a2, a0 730*9122c523SPengcheng Wang; RV32ZBKB-NEXT: brev8 a0, a1 731*9122c523SPengcheng Wang; RV32ZBKB-NEXT: brev8 a1, a2 732d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 733d8f929a5SCraig Topper; 734d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i64: 735d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 736d8f929a5SCraig Topper; RV64ZBKB-NEXT: rev8 a0, a0 737d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 738d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 739dcd751b2SCraig Topper %tmp = call i64 @llvm.bitreverse.i64(i64 %a) 740dcd751b2SCraig Topper ret i64 %tmp 741dcd751b2SCraig Topper} 742dcd751b2SCraig Topper 743dcd751b2SCraig Topperdefine i16 @test_bswap_bitreverse_i16(i16 %a) nounwind { 744dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i16: 745dcd751b2SCraig Topper; RV32I: # %bb.0: 746dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 747dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 1 748dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -241 749dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 750dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 751*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 3 752*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 753dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 754dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 755dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 756dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 757*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 758*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 5 759*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 1365 760dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 761dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 762dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 763dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 764*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 765dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 766dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 767dcd751b2SCraig Topper; RV32I-NEXT: ret 768dcd751b2SCraig Topper; 769dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i16: 770dcd751b2SCraig Topper; RV64I: # %bb.0: 771dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 772dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 1 773dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -241 774dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 775dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 776*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 3 777*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 778dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 4 779dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 780dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 781dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 782*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 783*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 5 784*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 1365 785dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 786dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 787dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 788dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 789*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 790dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 791dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 792dcd751b2SCraig Topper; RV64I-NEXT: ret 793dcd751b2SCraig Topper; 794d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i16: 795d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 796d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 4 797d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a2, 1 798d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a2, a2, -241 799d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a2 800d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 801*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 3 802*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 819 803d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 804d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 805d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 2 806d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 807*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 808*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 5 809*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 810d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 811d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 812d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 813d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 814*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 815d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 816d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 817d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 818dcd751b2SCraig Topper; 819d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i16: 820d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 821d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 4 822d8f929a5SCraig Topper; RV64ZBB-NEXT: lui a2, 1 823d8f929a5SCraig Topper; RV64ZBB-NEXT: addiw a2, a2, -241 824d8f929a5SCraig Topper; RV64ZBB-NEXT: and a1, a1, a2 825d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 826*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 3 827*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 828d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 4 829d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 830d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 831d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 832*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 833*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 5 834*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 835d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 836d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 837d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 838d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 839*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 840d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 841d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 842d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 843d8f929a5SCraig Topper; 844d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i16: 845d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 846d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 847d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 848d8f929a5SCraig Topper; 849d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i16: 850d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 851d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 852d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 853dcd751b2SCraig Topper %tmp = call i16 @llvm.bswap.i16(i16 %a) 854dcd751b2SCraig Topper %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp) 855dcd751b2SCraig Topper ret i16 %tmp2 856dcd751b2SCraig Topper} 857dcd751b2SCraig Topper 858dcd751b2SCraig Topperdefine i32 @test_bswap_bitreverse_i32(i32 %a) nounwind { 859dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i32: 860dcd751b2SCraig Topper; RV32I: # %bb.0: 861dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 862dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 61681 863dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -241 864dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 865dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 866*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 867*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 868dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 869dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 870dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 871dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 872*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 873*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 349525 874*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 1365 875dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 876dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 877dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 878dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 879*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 880dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 881dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 882dcd751b2SCraig Topper; RV32I-NEXT: ret 883dcd751b2SCraig Topper; 884dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i32: 885dcd751b2SCraig Topper; RV64I: # %bb.0: 886dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 887dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 61681 888dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -241 889dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 890dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 891*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 892*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 893dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 4 894dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 895dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 896dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 897*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 898*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 349525 899*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 1365 900dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 2 901dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 902dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 903dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 904*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 905dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 1 906dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 907dcd751b2SCraig Topper; RV64I-NEXT: ret 908dcd751b2SCraig Topper; 909d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i32: 910d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 911d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 4 912d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a2, 61681 913d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a2, a2, -241 914d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a2 915d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 916*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 209715 917*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 819 918d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 919d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 920d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 2 921d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 922*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 923*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 349525 924*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 925d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 926d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 927d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 928d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 929*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 930d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 931d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 932d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 933dcd751b2SCraig Topper; 934d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i32: 935d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 936d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 4 937d8f929a5SCraig Topper; RV64ZBB-NEXT: lui a2, 61681 938d8f929a5SCraig Topper; RV64ZBB-NEXT: addiw a2, a2, -241 939d8f929a5SCraig Topper; RV64ZBB-NEXT: and a1, a1, a2 940d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 941*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 209715 942*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 943d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 4 944d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 945d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 946d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 947*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 948*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 349525 949*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 950d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 2 951d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 952d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 953d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 954*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 955d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 1 956d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 957d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 958d8f929a5SCraig Topper; 959d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i32: 960d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 961d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 962d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 963d8f929a5SCraig Topper; 964d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i32: 965d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 966d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 967d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 968dcd751b2SCraig Topper %tmp = call i32 @llvm.bswap.i32(i32 %a) 969dcd751b2SCraig Topper %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp) 970dcd751b2SCraig Topper ret i32 %tmp2 971dcd751b2SCraig Topper} 972dcd751b2SCraig Topper 973dcd751b2SCraig Topperdefine i64 @test_bswap_bitreverse_i64(i64 %a) nounwind { 974dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i64: 975dcd751b2SCraig Topper; RV32I: # %bb.0: 976dcd751b2SCraig Topper; RV32I-NEXT: srli a2, a0, 4 977dcd751b2SCraig Topper; RV32I-NEXT: lui a3, 61681 978*9122c523SPengcheng Wang; RV32I-NEXT: lui a4, 209715 979*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a1, 4 980dcd751b2SCraig Topper; RV32I-NEXT: addi a3, a3, -241 981dcd751b2SCraig Topper; RV32I-NEXT: and a2, a2, a3 982dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a3 983*9122c523SPengcheng Wang; RV32I-NEXT: and a5, a5, a3 984dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a3 985*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 349525 986*9122c523SPengcheng Wang; RV32I-NEXT: addi a4, a4, 819 987*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 1365 988*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 4 989dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 4 990*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 991*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a5, a1 992*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 2 993*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a4 994*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a1, 2 995dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a4 996*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a4 997*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 2 998*9122c523SPengcheng Wang; RV32I-NEXT: and a4, a5, a4 999dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 2 1000*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 1001*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a4, a1 1002*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 1 1003*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a3 1004*9122c523SPengcheng Wang; RV32I-NEXT: srli a4, a1, 1 1005*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 1006*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a3 1007*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 1 1008*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a4, a3 1009dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 1 1010*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 1011*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a1 1012dcd751b2SCraig Topper; RV32I-NEXT: ret 1013dcd751b2SCraig Topper; 1014dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i64: 1015dcd751b2SCraig Topper; RV64I: # %bb.0: 1016*9122c523SPengcheng Wang; RV64I-NEXT: lui a1, 61681 101738f7c7ebSFlorian Mayer; RV64I-NEXT: lui a2, 209715 1018*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 349525 1019*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a1, -241 102038f7c7ebSFlorian Mayer; RV64I-NEXT: addiw a2, a2, 819 1021*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, 1365 1022*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a1, 32 1023*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a1, a4 1024*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a2, 32 1025*9122c523SPengcheng Wang; RV64I-NEXT: add a2, a2, a4 1026*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a3, 32 1027*9122c523SPengcheng Wang; RV64I-NEXT: add a3, a3, a4 1028*9122c523SPengcheng Wang; RV64I-NEXT: srli a4, a0, 4 1029*9122c523SPengcheng Wang; RV64I-NEXT: and a4, a4, a1 1030*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a1 1031*9122c523SPengcheng Wang; RV64I-NEXT: slli a0, a0, 4 1032*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a4, a0 1033*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a0, 2 103438f7c7ebSFlorian Mayer; RV64I-NEXT: and a0, a0, a2 1035*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1036dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 103738f7c7ebSFlorian Mayer; RV64I-NEXT: or a0, a1, a0 103838f7c7ebSFlorian Mayer; RV64I-NEXT: srli a1, a0, 1 1039*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a3 1040*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 1041dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 104238f7c7ebSFlorian Mayer; RV64I-NEXT: or a0, a1, a0 1043dcd751b2SCraig Topper; RV64I-NEXT: ret 1044dcd751b2SCraig Topper; 1045d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i64: 1046d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 1047d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a2, a0, 4 1048d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a3, 61681 1049*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a4, 209715 1050*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a1, 4 1051d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a3, a3, -241 1052d8f929a5SCraig Topper; RV32ZBB-NEXT: and a2, a2, a3 1053d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a3 1054*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a5, a5, a3 1055d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a3 1056*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a3, 349525 1057*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a4, a4, 819 1058*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a3, a3, 1365 1059*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 4 1060d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 4 1061*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1062*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a5, a1 1063*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 2 1064*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a4 1065*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a1, 2 1066d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a4 1067*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a2, a4 1068*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 2 1069*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a4, a5, a4 1070d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 2 1071*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1072*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a4, a1 1073*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 1 1074*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a3 1075*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a4, a1, 1 1076*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a3 1077*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a2, a3 1078*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 1 1079*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a3, a4, a3 1080d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 1 1081*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1082*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a3, a1 1083d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 1084dcd751b2SCraig Topper; 1085d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i64: 1086d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 1087*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a1, 61681 108838f7c7ebSFlorian Mayer; RV64ZBB-NEXT: lui a2, 209715 1089*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a3, 349525 1090*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a1, a1, -241 109138f7c7ebSFlorian Mayer; RV64ZBB-NEXT: addiw a2, a2, 819 1092*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a3, a3, 1365 1093*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a1, 32 1094*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a1, a1, a4 1095*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a2, 32 1096*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a2, a2, a4 1097*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a3, 32 1098*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a3, a3, a4 1099*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a4, a0, 4 1100*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a4, a4, a1 1101*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a1 1102*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a0, a0, 4 1103*9122c523SPengcheng Wang; RV64ZBB-NEXT: or a0, a4, a0 1104*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a1, a0, 2 110538f7c7ebSFlorian Mayer; RV64ZBB-NEXT: and a0, a0, a2 1106*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1107d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 110838f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 110938f7c7ebSFlorian Mayer; RV64ZBB-NEXT: srli a1, a0, 1 1110*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a3 1111*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a3 1112d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 111338f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 1114d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 1115d8f929a5SCraig Topper; 1116d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i64: 1117d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 1118d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 1119d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a1, a1 1120d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 1121d8f929a5SCraig Topper; 1122d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i64: 1123d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 1124d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 1125d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 1126dcd751b2SCraig Topper %tmp = call i64 @llvm.bswap.i64(i64 %a) 1127dcd751b2SCraig Topper %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp) 1128dcd751b2SCraig Topper ret i64 %tmp2 1129dcd751b2SCraig Topper} 1130dcd751b2SCraig Topper 1131dcd751b2SCraig Topperdefine i16 @test_bitreverse_bswap_i16(i16 %a) nounwind { 1132dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i16: 1133dcd751b2SCraig Topper; RV32I: # %bb.0: 1134dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 1135dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 1 1136dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -241 1137dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 1138dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1139*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 3 1140*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 1141dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 1142dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1143dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 1144dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1145*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 1146*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 5 1147*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 1365 1148dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 1149dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1150dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 1151dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1152*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 1153dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 1154dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1155dcd751b2SCraig Topper; RV32I-NEXT: ret 1156dcd751b2SCraig Topper; 1157dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i16: 1158dcd751b2SCraig Topper; RV64I: # %bb.0: 1159dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 1160dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 1 1161dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -241 1162dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 1163dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1164*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 3 1165*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 1166dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 4 1167dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1168dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 1169dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1170*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1171*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 5 1172*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 1365 1173dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 1174dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1175dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 1176dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1177*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1178dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 1179dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1180dcd751b2SCraig Topper; RV64I-NEXT: ret 1181dcd751b2SCraig Topper; 1182d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i16: 1183d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 1184d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 4 1185d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a2, 1 1186d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a2, a2, -241 1187d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a2 1188d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1189*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 3 1190*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 819 1191d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 1192d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1193d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 2 1194d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1195*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 1196*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 5 1197*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 1198d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 1199d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1200d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 1201d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1202*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 1203d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 1204d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1205d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 1206dcd751b2SCraig Topper; 1207d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i16: 1208d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 1209d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 4 1210d8f929a5SCraig Topper; RV64ZBB-NEXT: lui a2, 1 1211d8f929a5SCraig Topper; RV64ZBB-NEXT: addiw a2, a2, -241 1212d8f929a5SCraig Topper; RV64ZBB-NEXT: and a1, a1, a2 1213d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1214*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 3 1215*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 1216d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 4 1217d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1218d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 1219d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1220*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1221*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 5 1222*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 1223d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 1224d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1225d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 1226d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1227*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1228d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 1229d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1230d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 1231d8f929a5SCraig Topper; 1232d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i16: 1233d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 1234d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 1235d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 1236d8f929a5SCraig Topper; 1237d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i16: 1238d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 1239d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 1240d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 1241dcd751b2SCraig Topper %tmp = call i16 @llvm.bitreverse.i16(i16 %a) 1242dcd751b2SCraig Topper %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp) 1243dcd751b2SCraig Topper ret i16 %tmp2 1244dcd751b2SCraig Topper} 1245dcd751b2SCraig Topper 1246dcd751b2SCraig Topperdefine i32 @test_bitreverse_bswap_i32(i32 %a) nounwind { 1247dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i32: 1248dcd751b2SCraig Topper; RV32I: # %bb.0: 1249dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 4 1250dcd751b2SCraig Topper; RV32I-NEXT: lui a2, 61681 1251dcd751b2SCraig Topper; RV32I-NEXT: addi a2, a2, -241 1252dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a2 1253dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1254*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 1255*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 1256dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 4 1257dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1258dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 2 1259dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1260*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 1261*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 349525 1262*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 1365 1263dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 2 1264dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1265dcd751b2SCraig Topper; RV32I-NEXT: srli a1, a0, 1 1266dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a2 1267*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a2 1268dcd751b2SCraig Topper; RV32I-NEXT: slli a0, a0, 1 1269dcd751b2SCraig Topper; RV32I-NEXT: or a0, a1, a0 1270dcd751b2SCraig Topper; RV32I-NEXT: ret 1271dcd751b2SCraig Topper; 1272dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i32: 1273dcd751b2SCraig Topper; RV64I: # %bb.0: 1274dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 1275dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 61681 1276dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, -241 1277dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 1278dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1279*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 1280*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 1281dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 4 1282dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1283dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 2 1284dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1285*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1286*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 349525 1287*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 1365 1288dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 2 1289dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1290dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 1291dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a2 1292*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1293dcd751b2SCraig Topper; RV64I-NEXT: slliw a0, a0, 1 1294dcd751b2SCraig Topper; RV64I-NEXT: or a0, a1, a0 1295dcd751b2SCraig Topper; RV64I-NEXT: ret 1296dcd751b2SCraig Topper; 1297d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i32: 1298d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 1299d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 4 1300d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a2, 61681 1301d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a2, a2, -241 1302d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a2 1303d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1304*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 209715 1305*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 819 1306d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 4 1307d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1308d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 2 1309d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1310*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 1311*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a2, 349525 1312*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a2, a2, 1365 1313d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 2 1314d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1315d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 1 1316d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a2 1317*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a2 1318d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 1 1319d8f929a5SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 1320d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 1321dcd751b2SCraig Topper; 1322d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i32: 1323d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 1324d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 4 1325d8f929a5SCraig Topper; RV64ZBB-NEXT: lui a2, 61681 1326d8f929a5SCraig Topper; RV64ZBB-NEXT: addiw a2, a2, -241 1327d8f929a5SCraig Topper; RV64ZBB-NEXT: and a1, a1, a2 1328d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1329*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 209715 1330*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 819 1331d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 4 1332d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1333d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 2 1334d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1335*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1336*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a2, 349525 1337*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a2, a2, 1365 1338d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 2 1339d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1340d8f929a5SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 1 1341d8f929a5SCraig Topper; RV64ZBB-NEXT: and a0, a0, a2 1342*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1343d8f929a5SCraig Topper; RV64ZBB-NEXT: slliw a0, a0, 1 1344d8f929a5SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 1345d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 1346d8f929a5SCraig Topper; 1347d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i32: 1348d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 1349d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 1350d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 1351d8f929a5SCraig Topper; 1352d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i32: 1353d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 1354d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 1355d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 1356dcd751b2SCraig Topper %tmp = call i32 @llvm.bitreverse.i32(i32 %a) 1357dcd751b2SCraig Topper %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp) 1358dcd751b2SCraig Topper ret i32 %tmp2 1359dcd751b2SCraig Topper} 1360dcd751b2SCraig Topper 1361dcd751b2SCraig Topperdefine i64 @test_bitreverse_bswap_i64(i64 %a) nounwind { 1362dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i64: 1363dcd751b2SCraig Topper; RV32I: # %bb.0: 1364dcd751b2SCraig Topper; RV32I-NEXT: srli a2, a0, 4 1365dcd751b2SCraig Topper; RV32I-NEXT: lui a3, 61681 1366*9122c523SPengcheng Wang; RV32I-NEXT: lui a4, 209715 1367*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a1, 4 1368dcd751b2SCraig Topper; RV32I-NEXT: addi a3, a3, -241 1369dcd751b2SCraig Topper; RV32I-NEXT: and a2, a2, a3 1370dcd751b2SCraig Topper; RV32I-NEXT: and a0, a0, a3 1371*9122c523SPengcheng Wang; RV32I-NEXT: and a5, a5, a3 1372dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a3 1373*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 349525 1374*9122c523SPengcheng Wang; RV32I-NEXT: addi a4, a4, 819 1375*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 1365 1376*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 4 1377dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 4 1378*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 1379*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a5, a1 1380*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 2 1381*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a4 1382*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a1, 2 1383dcd751b2SCraig Topper; RV32I-NEXT: and a1, a1, a4 1384*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a4 1385*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 2 1386*9122c523SPengcheng Wang; RV32I-NEXT: and a4, a5, a4 1387dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 2 1388*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 1389*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a4, a1 1390*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 1 1391*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a3 1392*9122c523SPengcheng Wang; RV32I-NEXT: srli a4, a1, 1 1393*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 1394*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a2, a3 1395*9122c523SPengcheng Wang; RV32I-NEXT: slli a0, a0, 1 1396*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a4, a3 1397dcd751b2SCraig Topper; RV32I-NEXT: slli a1, a1, 1 1398*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a2, a0 1399*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a1 1400dcd751b2SCraig Topper; RV32I-NEXT: ret 1401dcd751b2SCraig Topper; 1402dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i64: 1403dcd751b2SCraig Topper; RV64I: # %bb.0: 1404*9122c523SPengcheng Wang; RV64I-NEXT: lui a1, 61681 140538f7c7ebSFlorian Mayer; RV64I-NEXT: lui a2, 209715 1406*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 349525 1407*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a1, -241 140838f7c7ebSFlorian Mayer; RV64I-NEXT: addiw a2, a2, 819 1409*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, 1365 1410*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a1, 32 1411*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a1, a4 1412*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a2, 32 1413*9122c523SPengcheng Wang; RV64I-NEXT: add a2, a2, a4 1414*9122c523SPengcheng Wang; RV64I-NEXT: slli a4, a3, 32 1415*9122c523SPengcheng Wang; RV64I-NEXT: add a3, a3, a4 1416*9122c523SPengcheng Wang; RV64I-NEXT: srli a4, a0, 4 1417*9122c523SPengcheng Wang; RV64I-NEXT: and a4, a4, a1 1418*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a1 1419*9122c523SPengcheng Wang; RV64I-NEXT: slli a0, a0, 4 1420*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a4, a0 1421*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a0, 2 142238f7c7ebSFlorian Mayer; RV64I-NEXT: and a0, a0, a2 1423*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a2 1424dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 2 142538f7c7ebSFlorian Mayer; RV64I-NEXT: or a0, a1, a0 142638f7c7ebSFlorian Mayer; RV64I-NEXT: srli a1, a0, 1 1427*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a3 1428*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 1429dcd751b2SCraig Topper; RV64I-NEXT: slli a0, a0, 1 143038f7c7ebSFlorian Mayer; RV64I-NEXT: or a0, a1, a0 1431dcd751b2SCraig Topper; RV64I-NEXT: ret 1432dcd751b2SCraig Topper; 1433d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i64: 1434d8f929a5SCraig Topper; RV32ZBB: # %bb.0: 1435d8f929a5SCraig Topper; RV32ZBB-NEXT: srli a2, a0, 4 1436d8f929a5SCraig Topper; RV32ZBB-NEXT: lui a3, 61681 1437*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a4, 209715 1438*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a1, 4 1439d8f929a5SCraig Topper; RV32ZBB-NEXT: addi a3, a3, -241 1440d8f929a5SCraig Topper; RV32ZBB-NEXT: and a2, a2, a3 1441d8f929a5SCraig Topper; RV32ZBB-NEXT: and a0, a0, a3 1442*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a5, a5, a3 1443d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a3 1444*9122c523SPengcheng Wang; RV32ZBB-NEXT: lui a3, 349525 1445*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a4, a4, 819 1446*9122c523SPengcheng Wang; RV32ZBB-NEXT: addi a3, a3, 1365 1447*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 4 1448d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 4 1449*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1450*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a5, a1 1451*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 2 1452*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a4 1453*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a5, a1, 2 1454d8f929a5SCraig Topper; RV32ZBB-NEXT: and a1, a1, a4 1455*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a2, a4 1456*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 2 1457*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a4, a5, a4 1458d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 2 1459*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1460*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a4, a1 1461*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a2, a0, 1 1462*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a0, a0, a3 1463*9122c523SPengcheng Wang; RV32ZBB-NEXT: srli a4, a1, 1 1464*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a1, a1, a3 1465*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a2, a2, a3 1466*9122c523SPengcheng Wang; RV32ZBB-NEXT: slli a0, a0, 1 1467*9122c523SPengcheng Wang; RV32ZBB-NEXT: and a3, a4, a3 1468d8f929a5SCraig Topper; RV32ZBB-NEXT: slli a1, a1, 1 1469*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a0, a2, a0 1470*9122c523SPengcheng Wang; RV32ZBB-NEXT: or a1, a3, a1 1471d8f929a5SCraig Topper; RV32ZBB-NEXT: ret 1472dcd751b2SCraig Topper; 1473d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i64: 1474d8f929a5SCraig Topper; RV64ZBB: # %bb.0: 1475*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a1, 61681 147638f7c7ebSFlorian Mayer; RV64ZBB-NEXT: lui a2, 209715 1477*9122c523SPengcheng Wang; RV64ZBB-NEXT: lui a3, 349525 1478*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a1, a1, -241 147938f7c7ebSFlorian Mayer; RV64ZBB-NEXT: addiw a2, a2, 819 1480*9122c523SPengcheng Wang; RV64ZBB-NEXT: addiw a3, a3, 1365 1481*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a1, 32 1482*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a1, a1, a4 1483*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a2, 32 1484*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a2, a2, a4 1485*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a4, a3, 32 1486*9122c523SPengcheng Wang; RV64ZBB-NEXT: add a3, a3, a4 1487*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a4, a0, 4 1488*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a4, a4, a1 1489*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a1 1490*9122c523SPengcheng Wang; RV64ZBB-NEXT: slli a0, a0, 4 1491*9122c523SPengcheng Wang; RV64ZBB-NEXT: or a0, a4, a0 1492*9122c523SPengcheng Wang; RV64ZBB-NEXT: srli a1, a0, 2 149338f7c7ebSFlorian Mayer; RV64ZBB-NEXT: and a0, a0, a2 1494*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a2 1495d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 2 149638f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 149738f7c7ebSFlorian Mayer; RV64ZBB-NEXT: srli a1, a0, 1 1498*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a0, a0, a3 1499*9122c523SPengcheng Wang; RV64ZBB-NEXT: and a1, a1, a3 1500d8f929a5SCraig Topper; RV64ZBB-NEXT: slli a0, a0, 1 150138f7c7ebSFlorian Mayer; RV64ZBB-NEXT: or a0, a1, a0 1502d8f929a5SCraig Topper; RV64ZBB-NEXT: ret 1503d8f929a5SCraig Topper; 1504d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i64: 1505d8f929a5SCraig Topper; RV32ZBKB: # %bb.0: 1506d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a0, a0 1507d8f929a5SCraig Topper; RV32ZBKB-NEXT: brev8 a1, a1 1508d8f929a5SCraig Topper; RV32ZBKB-NEXT: ret 1509d8f929a5SCraig Topper; 1510d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i64: 1511d8f929a5SCraig Topper; RV64ZBKB: # %bb.0: 1512d8f929a5SCraig Topper; RV64ZBKB-NEXT: brev8 a0, a0 1513d8f929a5SCraig Topper; RV64ZBKB-NEXT: ret 1514dcd751b2SCraig Topper %tmp = call i64 @llvm.bitreverse.i64(i64 %a) 1515dcd751b2SCraig Topper %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp) 1516dcd751b2SCraig Topper ret i64 %tmp2 1517dcd751b2SCraig Topper} 151874f6ded4SCraig Topper 151974f6ded4SCraig Topperdefine i32 @pr55484(i32 %0) { 152074f6ded4SCraig Topper; RV32I-LABEL: pr55484: 152174f6ded4SCraig Topper; RV32I: # %bb.0: 152278739fdbSSimon Pilgrim; RV32I-NEXT: slli a1, a0, 8 152378739fdbSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 24 152478739fdbSSimon Pilgrim; RV32I-NEXT: or a0, a0, a1 152574f6ded4SCraig Topper; RV32I-NEXT: srai a0, a0, 16 152674f6ded4SCraig Topper; RV32I-NEXT: ret 152774f6ded4SCraig Topper; 152874f6ded4SCraig Topper; RV64I-LABEL: pr55484: 152974f6ded4SCraig Topper; RV64I: # %bb.0: 153078739fdbSSimon Pilgrim; RV64I-NEXT: slli a1, a0, 40 153178739fdbSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 56 153278739fdbSSimon Pilgrim; RV64I-NEXT: or a0, a0, a1 153374f6ded4SCraig Topper; RV64I-NEXT: srai a0, a0, 48 153474f6ded4SCraig Topper; RV64I-NEXT: ret 153574f6ded4SCraig Topper; 153674f6ded4SCraig Topper; RV32ZBB-LABEL: pr55484: 153774f6ded4SCraig Topper; RV32ZBB: # %bb.0: 153846eef768SCraig Topper; RV32ZBB-NEXT: srli a1, a0, 8 153946eef768SCraig Topper; RV32ZBB-NEXT: slli a0, a0, 8 154046eef768SCraig Topper; RV32ZBB-NEXT: or a0, a1, a0 154146eef768SCraig Topper; RV32ZBB-NEXT: sext.h a0, a0 154274f6ded4SCraig Topper; RV32ZBB-NEXT: ret 154374f6ded4SCraig Topper; 154474f6ded4SCraig Topper; RV64ZBB-LABEL: pr55484: 154574f6ded4SCraig Topper; RV64ZBB: # %bb.0: 154646eef768SCraig Topper; RV64ZBB-NEXT: srli a1, a0, 8 1547d64d3c5aSNitin John Raj; RV64ZBB-NEXT: slli a0, a0, 8 154846eef768SCraig Topper; RV64ZBB-NEXT: or a0, a1, a0 154946eef768SCraig Topper; RV64ZBB-NEXT: sext.h a0, a0 155074f6ded4SCraig Topper; RV64ZBB-NEXT: ret 155174f6ded4SCraig Topper; 155274f6ded4SCraig Topper; RV32ZBKB-LABEL: pr55484: 155374f6ded4SCraig Topper; RV32ZBKB: # %bb.0: 155478739fdbSSimon Pilgrim; RV32ZBKB-NEXT: slli a1, a0, 8 155578739fdbSSimon Pilgrim; RV32ZBKB-NEXT: slli a0, a0, 24 155678739fdbSSimon Pilgrim; RV32ZBKB-NEXT: or a0, a0, a1 155774f6ded4SCraig Topper; RV32ZBKB-NEXT: srai a0, a0, 16 155874f6ded4SCraig Topper; RV32ZBKB-NEXT: ret 155974f6ded4SCraig Topper; 156074f6ded4SCraig Topper; RV64ZBKB-LABEL: pr55484: 156174f6ded4SCraig Topper; RV64ZBKB: # %bb.0: 156278739fdbSSimon Pilgrim; RV64ZBKB-NEXT: slli a1, a0, 40 156378739fdbSSimon Pilgrim; RV64ZBKB-NEXT: slli a0, a0, 56 156478739fdbSSimon Pilgrim; RV64ZBKB-NEXT: or a0, a0, a1 156574f6ded4SCraig Topper; RV64ZBKB-NEXT: srai a0, a0, 48 156674f6ded4SCraig Topper; RV64ZBKB-NEXT: ret 156774f6ded4SCraig Topper %2 = lshr i32 %0, 8 156874f6ded4SCraig Topper %3 = shl i32 %0, 8 156974f6ded4SCraig Topper %4 = or i32 %2, %3 157074f6ded4SCraig Topper %5 = trunc i32 %4 to i16 157174f6ded4SCraig Topper %6 = sext i16 %5 to i32 157274f6ded4SCraig Topper ret i32 %6 157374f6ded4SCraig Topper} 1574