1780eb9f5SChenbing Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2780eb9f5SChenbing Zheng; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \ 3*522b4bfeSSimon Pilgrim; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBKB 4780eb9f5SChenbing Zheng; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \ 5*522b4bfeSSimon Pilgrim; RUN: | FileCheck %s -check-prefixes=CHECK,RV64ZBKB 6780eb9f5SChenbing Zheng 7*522b4bfeSSimon Pilgrim; These tests can be optimised 8780eb9f5SChenbing Zheng; fold (bitreverse(srl (bitreverse c), x)) -> (shl c, x) 9780eb9f5SChenbing Zheng; fold (bitreverse(shl (bitreverse c), x)) -> (srl c, x) 10780eb9f5SChenbing Zheng 11780eb9f5SChenbing Zhengdeclare i8 @llvm.bitreverse.i8(i8) 12780eb9f5SChenbing Zhengdeclare i16 @llvm.bitreverse.i16(i16) 13780eb9f5SChenbing Zhengdeclare i32 @llvm.bitreverse.i32(i32) 14780eb9f5SChenbing Zhengdeclare i64 @llvm.bitreverse.i64(i64) 15780eb9f5SChenbing Zheng 16780eb9f5SChenbing Zhengdefine i8 @test_bitreverse_srli_bitreverse_i8(i8 %a) nounwind { 17*522b4bfeSSimon Pilgrim; CHECK-LABEL: test_bitreverse_srli_bitreverse_i8: 18*522b4bfeSSimon Pilgrim; CHECK: # %bb.0: 19*522b4bfeSSimon Pilgrim; CHECK-NEXT: slli a0, a0, 3 20*522b4bfeSSimon Pilgrim; CHECK-NEXT: ret 21780eb9f5SChenbing Zheng %1 = call i8 @llvm.bitreverse.i8(i8 %a) 22780eb9f5SChenbing Zheng %2 = lshr i8 %1, 3 23780eb9f5SChenbing Zheng %3 = call i8 @llvm.bitreverse.i8(i8 %2) 24780eb9f5SChenbing Zheng ret i8 %3 25780eb9f5SChenbing Zheng} 26780eb9f5SChenbing Zheng 27780eb9f5SChenbing Zhengdefine i16 @test_bitreverse_srli_bitreverse_i16(i16 %a) nounwind { 28*522b4bfeSSimon Pilgrim; CHECK-LABEL: test_bitreverse_srli_bitreverse_i16: 29*522b4bfeSSimon Pilgrim; CHECK: # %bb.0: 30*522b4bfeSSimon Pilgrim; CHECK-NEXT: slli a0, a0, 7 31*522b4bfeSSimon Pilgrim; CHECK-NEXT: ret 32780eb9f5SChenbing Zheng %1 = call i16 @llvm.bitreverse.i16(i16 %a) 33780eb9f5SChenbing Zheng %2 = lshr i16 %1, 7 34780eb9f5SChenbing Zheng %3 = call i16 @llvm.bitreverse.i16(i16 %2) 35780eb9f5SChenbing Zheng ret i16 %3 36780eb9f5SChenbing Zheng} 37780eb9f5SChenbing Zheng 38780eb9f5SChenbing Zhengdefine i32 @test_bitreverse_srli_bitreverse_i32(i32 %a) nounwind { 39780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32: 40780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 41*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: slli a0, a0, 15 42780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 43780eb9f5SChenbing Zheng; 44780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32: 45780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 46*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: slliw a0, a0, 15 47780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 48780eb9f5SChenbing Zheng %1 = call i32 @llvm.bitreverse.i32(i32 %a) 49780eb9f5SChenbing Zheng %2 = lshr i32 %1, 15 50780eb9f5SChenbing Zheng %3 = call i32 @llvm.bitreverse.i32(i32 %2) 51780eb9f5SChenbing Zheng ret i32 %3 52780eb9f5SChenbing Zheng} 53780eb9f5SChenbing Zheng 54780eb9f5SChenbing Zhengdefine i64 @test_bitreverse_srli_bitreverse_i64(i64 %a) nounwind { 55780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64: 56780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 57*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: slli a1, a0, 1 58780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: li a0, 0 59780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 60780eb9f5SChenbing Zheng; 61780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64: 62780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 63*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: slli a0, a0, 33 64780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 65780eb9f5SChenbing Zheng %1 = call i64 @llvm.bitreverse.i64(i64 %a) 66780eb9f5SChenbing Zheng %2 = lshr i64 %1, 33 67780eb9f5SChenbing Zheng %3 = call i64 @llvm.bitreverse.i64(i64 %2) 68780eb9f5SChenbing Zheng ret i64 %3 69780eb9f5SChenbing Zheng} 70780eb9f5SChenbing Zheng 71780eb9f5SChenbing Zhengdefine i8 @test_bitreverse_shli_bitreverse_i8(i8 %a) nounwind { 72780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8: 73780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 74*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: slli a0, a0, 24 75*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: srli a0, a0, 27 76780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 77780eb9f5SChenbing Zheng; 78780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8: 79780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 80*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: slli a0, a0, 56 81*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: srli a0, a0, 59 82780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 83780eb9f5SChenbing Zheng %1 = call i8 @llvm.bitreverse.i8(i8 %a) 84780eb9f5SChenbing Zheng %2 = shl i8 %1, 3 85780eb9f5SChenbing Zheng %3 = call i8 @llvm.bitreverse.i8(i8 %2) 86780eb9f5SChenbing Zheng ret i8 %3 87780eb9f5SChenbing Zheng} 88780eb9f5SChenbing Zheng 89780eb9f5SChenbing Zhengdefine i16 @test_bitreverse_shli_bitreverse_i16(i16 %a) nounwind { 90780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16: 91780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 92*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: slli a0, a0, 16 93*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: srli a0, a0, 23 94780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 95780eb9f5SChenbing Zheng; 96780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16: 97780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 98*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: slli a0, a0, 48 99*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: srli a0, a0, 55 100780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 101780eb9f5SChenbing Zheng %1 = call i16 @llvm.bitreverse.i16(i16 %a) 102780eb9f5SChenbing Zheng %2 = shl i16 %1, 7 103780eb9f5SChenbing Zheng %3 = call i16 @llvm.bitreverse.i16(i16 %2) 104780eb9f5SChenbing Zheng ret i16 %3 105780eb9f5SChenbing Zheng} 106780eb9f5SChenbing Zheng 107780eb9f5SChenbing Zhengdefine i32 @test_bitreverse_shli_bitreverse_i32(i32 %a) nounwind { 108780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32: 109780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 110*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: srli a0, a0, 15 111780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 112780eb9f5SChenbing Zheng; 113780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32: 114780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 115*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: srliw a0, a0, 15 116780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 117780eb9f5SChenbing Zheng %1 = call i32 @llvm.bitreverse.i32(i32 %a) 118780eb9f5SChenbing Zheng %2 = shl i32 %1, 15 119780eb9f5SChenbing Zheng %3 = call i32 @llvm.bitreverse.i32(i32 %2) 120780eb9f5SChenbing Zheng ret i32 %3 121780eb9f5SChenbing Zheng} 122780eb9f5SChenbing Zheng 123780eb9f5SChenbing Zhengdefine i64 @test_bitreverse_shli_bitreverse_i64(i64 %a) nounwind { 124780eb9f5SChenbing Zheng; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64: 125780eb9f5SChenbing Zheng; RV32ZBKB: # %bb.0: 126*522b4bfeSSimon Pilgrim; RV32ZBKB-NEXT: srli a0, a1, 1 127780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: li a1, 0 128780eb9f5SChenbing Zheng; RV32ZBKB-NEXT: ret 129780eb9f5SChenbing Zheng; 130780eb9f5SChenbing Zheng; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64: 131780eb9f5SChenbing Zheng; RV64ZBKB: # %bb.0: 132*522b4bfeSSimon Pilgrim; RV64ZBKB-NEXT: srli a0, a0, 33 133780eb9f5SChenbing Zheng; RV64ZBKB-NEXT: ret 134780eb9f5SChenbing Zheng %1 = call i64 @llvm.bitreverse.i64(i64 %a) 135780eb9f5SChenbing Zheng %2 = shl i64 %1, 33 136780eb9f5SChenbing Zheng %3 = call i64 @llvm.bitreverse.i64(i64 %2) 137780eb9f5SChenbing Zheng ret i64 %3 138780eb9f5SChenbing Zheng} 139