16a01b676SChenbing Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 26a01b676SChenbing Zheng; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \ 36a01b676SChenbing Zheng; RUN: | FileCheck %s -check-prefixes=RV32ZB 46a01b676SChenbing Zheng; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \ 56a01b676SChenbing Zheng; RUN: | FileCheck %s -check-prefixes=RV64ZB 66a01b676SChenbing Zheng; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \ 76a01b676SChenbing Zheng; RUN: | FileCheck %s -check-prefixes=RV32ZB 86a01b676SChenbing Zheng; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \ 96a01b676SChenbing Zheng; RUN: | FileCheck %s -check-prefixes=RV64ZB 106a01b676SChenbing Zheng 116a01b676SChenbing Zheng; TODO: These tests can be optmised, with x%8 == 0 126a01b676SChenbing Zheng; fold (bswap(srl (bswap c), x)) -> (shl c, x) 136a01b676SChenbing Zheng; fold (bswap(shl (bswap c), x)) -> (srl c, x) 146a01b676SChenbing Zheng 156a01b676SChenbing Zhengdeclare i16 @llvm.bswap.i16(i16) 166a01b676SChenbing Zhengdeclare i32 @llvm.bswap.i32(i32) 176a01b676SChenbing Zhengdeclare i64 @llvm.bswap.i64(i64) 186a01b676SChenbing Zheng 196a01b676SChenbing Zhengdefine i16 @test_bswap_srli_7_bswap_i16(i16 %a) nounwind { 206a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_7_bswap_i16: 216a01b676SChenbing Zheng; RV32ZB: # %bb.0: 226a01b676SChenbing Zheng; RV32ZB-NEXT: rev8 a0, a0 236a01b676SChenbing Zheng; RV32ZB-NEXT: srli a0, a0, 23 246a01b676SChenbing Zheng; RV32ZB-NEXT: rev8 a0, a0 256a01b676SChenbing Zheng; RV32ZB-NEXT: srli a0, a0, 16 266a01b676SChenbing Zheng; RV32ZB-NEXT: ret 276a01b676SChenbing Zheng; 286a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_7_bswap_i16: 296a01b676SChenbing Zheng; RV64ZB: # %bb.0: 306a01b676SChenbing Zheng; RV64ZB-NEXT: rev8 a0, a0 316a01b676SChenbing Zheng; RV64ZB-NEXT: srli a0, a0, 55 326a01b676SChenbing Zheng; RV64ZB-NEXT: rev8 a0, a0 336a01b676SChenbing Zheng; RV64ZB-NEXT: srli a0, a0, 48 346a01b676SChenbing Zheng; RV64ZB-NEXT: ret 356a01b676SChenbing Zheng %1 = call i16 @llvm.bswap.i16(i16 %a) 366a01b676SChenbing Zheng %2 = lshr i16 %1, 7 376a01b676SChenbing Zheng %3 = call i16 @llvm.bswap.i16(i16 %2) 386a01b676SChenbing Zheng ret i16 %3 396a01b676SChenbing Zheng} 406a01b676SChenbing Zheng 416a01b676SChenbing Zhengdefine i16 @test_bswap_srli_8_bswap_i16(i16 %a) nounwind { 426a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_8_bswap_i16: 436a01b676SChenbing Zheng; RV32ZB: # %bb.0: 44e18cc527SSanjay Patel; RV32ZB-NEXT: slli a0, a0, 8 456a01b676SChenbing Zheng; RV32ZB-NEXT: ret 466a01b676SChenbing Zheng; 476a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_8_bswap_i16: 486a01b676SChenbing Zheng; RV64ZB: # %bb.0: 49e18cc527SSanjay Patel; RV64ZB-NEXT: slli a0, a0, 8 506a01b676SChenbing Zheng; RV64ZB-NEXT: ret 516a01b676SChenbing Zheng %1 = call i16 @llvm.bswap.i16(i16 %a) 526a01b676SChenbing Zheng %2 = lshr i16 %1, 8 536a01b676SChenbing Zheng %3 = call i16 @llvm.bswap.i16(i16 %2) 546a01b676SChenbing Zheng ret i16 %3 556a01b676SChenbing Zheng} 566a01b676SChenbing Zheng 576a01b676SChenbing Zhengdefine i32 @test_bswap_srli_8_bswap_i32(i32 %a) nounwind { 586a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_8_bswap_i32: 596a01b676SChenbing Zheng; RV32ZB: # %bb.0: 60e18cc527SSanjay Patel; RV32ZB-NEXT: slli a0, a0, 8 616a01b676SChenbing Zheng; RV32ZB-NEXT: ret 626a01b676SChenbing Zheng; 636a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_8_bswap_i32: 646a01b676SChenbing Zheng; RV64ZB: # %bb.0: 65e18cc527SSanjay Patel; RV64ZB-NEXT: slliw a0, a0, 8 666a01b676SChenbing Zheng; RV64ZB-NEXT: ret 676a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 686a01b676SChenbing Zheng %2 = lshr i32 %1, 8 696a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 706a01b676SChenbing Zheng ret i32 %3 716a01b676SChenbing Zheng} 726a01b676SChenbing Zheng 736a01b676SChenbing Zhengdefine i32 @test_bswap_srli_16_bswap_i32(i32 %a) nounwind { 746a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_16_bswap_i32: 756a01b676SChenbing Zheng; RV32ZB: # %bb.0: 76e18cc527SSanjay Patel; RV32ZB-NEXT: slli a0, a0, 16 776a01b676SChenbing Zheng; RV32ZB-NEXT: ret 786a01b676SChenbing Zheng; 796a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_16_bswap_i32: 806a01b676SChenbing Zheng; RV64ZB: # %bb.0: 81e18cc527SSanjay Patel; RV64ZB-NEXT: slliw a0, a0, 16 826a01b676SChenbing Zheng; RV64ZB-NEXT: ret 836a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 846a01b676SChenbing Zheng %2 = lshr i32 %1, 16 856a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 866a01b676SChenbing Zheng ret i32 %3 876a01b676SChenbing Zheng} 886a01b676SChenbing Zheng 896a01b676SChenbing Zhengdefine i32 @test_bswap_srli_24_bswap_i32(i32 %a) nounwind { 906a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_24_bswap_i32: 916a01b676SChenbing Zheng; RV32ZB: # %bb.0: 92e18cc527SSanjay Patel; RV32ZB-NEXT: slli a0, a0, 24 936a01b676SChenbing Zheng; RV32ZB-NEXT: ret 946a01b676SChenbing Zheng; 956a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_24_bswap_i32: 966a01b676SChenbing Zheng; RV64ZB: # %bb.0: 97e18cc527SSanjay Patel; RV64ZB-NEXT: slliw a0, a0, 24 986a01b676SChenbing Zheng; RV64ZB-NEXT: ret 996a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 1006a01b676SChenbing Zheng %2 = lshr i32 %1, 24 1016a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 1026a01b676SChenbing Zheng ret i32 %3 1036a01b676SChenbing Zheng} 1046a01b676SChenbing Zheng 1056a01b676SChenbing Zhengdefine i64 @test_bswap_srli_48_bswap_i64(i64 %a) nounwind { 1066a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_srli_48_bswap_i64: 1076a01b676SChenbing Zheng; RV32ZB: # %bb.0: 108e18cc527SSanjay Patel; RV32ZB-NEXT: slli a1, a0, 16 1096a01b676SChenbing Zheng; RV32ZB-NEXT: li a0, 0 1106a01b676SChenbing Zheng; RV32ZB-NEXT: ret 1116a01b676SChenbing Zheng; 1126a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_srli_48_bswap_i64: 1136a01b676SChenbing Zheng; RV64ZB: # %bb.0: 114e18cc527SSanjay Patel; RV64ZB-NEXT: slli a0, a0, 48 1156a01b676SChenbing Zheng; RV64ZB-NEXT: ret 1166a01b676SChenbing Zheng %1 = call i64 @llvm.bswap.i64(i64 %a) 1176a01b676SChenbing Zheng %2 = lshr i64 %1, 48 1186a01b676SChenbing Zheng %3 = call i64 @llvm.bswap.i64(i64 %2) 1196a01b676SChenbing Zheng ret i64 %3 1206a01b676SChenbing Zheng} 1216a01b676SChenbing Zheng 1226a01b676SChenbing Zhengdefine i16 @test_bswap_shli_7_bswap_i16(i16 %a) nounwind { 1236a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_7_bswap_i16: 1246a01b676SChenbing Zheng; RV32ZB: # %bb.0: 1256a01b676SChenbing Zheng; RV32ZB-NEXT: rev8 a0, a0 126*44775005SCraig Topper; RV32ZB-NEXT: srli a0, a0, 16 127*44775005SCraig Topper; RV32ZB-NEXT: slli a0, a0, 7 1286a01b676SChenbing Zheng; RV32ZB-NEXT: rev8 a0, a0 1296a01b676SChenbing Zheng; RV32ZB-NEXT: srli a0, a0, 16 1306a01b676SChenbing Zheng; RV32ZB-NEXT: ret 1316a01b676SChenbing Zheng; 1326a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_7_bswap_i16: 1336a01b676SChenbing Zheng; RV64ZB: # %bb.0: 1346a01b676SChenbing Zheng; RV64ZB-NEXT: rev8 a0, a0 135*44775005SCraig Topper; RV64ZB-NEXT: srli a0, a0, 48 136*44775005SCraig Topper; RV64ZB-NEXT: slli a0, a0, 7 1376a01b676SChenbing Zheng; RV64ZB-NEXT: rev8 a0, a0 1386a01b676SChenbing Zheng; RV64ZB-NEXT: srli a0, a0, 48 1396a01b676SChenbing Zheng; RV64ZB-NEXT: ret 1406a01b676SChenbing Zheng %1 = call i16 @llvm.bswap.i16(i16 %a) 1416a01b676SChenbing Zheng %2 = shl i16 %1, 7 1426a01b676SChenbing Zheng %3 = call i16 @llvm.bswap.i16(i16 %2) 1436a01b676SChenbing Zheng ret i16 %3 1446a01b676SChenbing Zheng} 1456a01b676SChenbing Zheng 1466a01b676SChenbing Zhengdefine i16 @test_bswap_shli_8_bswap_i16(i16 %a) nounwind { 1476a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_8_bswap_i16: 1486a01b676SChenbing Zheng; RV32ZB: # %bb.0: 149e18cc527SSanjay Patel; RV32ZB-NEXT: slli a0, a0, 16 150e18cc527SSanjay Patel; RV32ZB-NEXT: srli a0, a0, 24 1516a01b676SChenbing Zheng; RV32ZB-NEXT: ret 1526a01b676SChenbing Zheng; 1536a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_8_bswap_i16: 1546a01b676SChenbing Zheng; RV64ZB: # %bb.0: 155e18cc527SSanjay Patel; RV64ZB-NEXT: slli a0, a0, 48 156e18cc527SSanjay Patel; RV64ZB-NEXT: srli a0, a0, 56 1576a01b676SChenbing Zheng; RV64ZB-NEXT: ret 1586a01b676SChenbing Zheng %1 = call i16 @llvm.bswap.i16(i16 %a) 1596a01b676SChenbing Zheng %2 = shl i16 %1, 8 1606a01b676SChenbing Zheng %3 = call i16 @llvm.bswap.i16(i16 %2) 1616a01b676SChenbing Zheng ret i16 %3 1626a01b676SChenbing Zheng} 1636a01b676SChenbing Zheng 1646a01b676SChenbing Zhengdefine i32 @test_bswap_shli_8_bswap_i32(i32 %a) nounwind { 1656a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_8_bswap_i32: 1666a01b676SChenbing Zheng; RV32ZB: # %bb.0: 167e18cc527SSanjay Patel; RV32ZB-NEXT: srli a0, a0, 8 1686a01b676SChenbing Zheng; RV32ZB-NEXT: ret 1696a01b676SChenbing Zheng; 1706a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_8_bswap_i32: 1716a01b676SChenbing Zheng; RV64ZB: # %bb.0: 172e18cc527SSanjay Patel; RV64ZB-NEXT: srliw a0, a0, 8 1736a01b676SChenbing Zheng; RV64ZB-NEXT: ret 1746a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 1756a01b676SChenbing Zheng %2 = shl i32 %1, 8 1766a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 1776a01b676SChenbing Zheng ret i32 %3 1786a01b676SChenbing Zheng} 1796a01b676SChenbing Zheng 1806a01b676SChenbing Zhengdefine i32 @test_bswap_shli_16_bswap_i32(i32 %a) nounwind { 1816a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_16_bswap_i32: 1826a01b676SChenbing Zheng; RV32ZB: # %bb.0: 183e18cc527SSanjay Patel; RV32ZB-NEXT: srli a0, a0, 16 1846a01b676SChenbing Zheng; RV32ZB-NEXT: ret 1856a01b676SChenbing Zheng; 1866a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_16_bswap_i32: 1876a01b676SChenbing Zheng; RV64ZB: # %bb.0: 188e18cc527SSanjay Patel; RV64ZB-NEXT: srliw a0, a0, 16 1896a01b676SChenbing Zheng; RV64ZB-NEXT: ret 1906a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 1916a01b676SChenbing Zheng %2 = shl i32 %1, 16 1926a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 1936a01b676SChenbing Zheng ret i32 %3 1946a01b676SChenbing Zheng} 1956a01b676SChenbing Zheng 1966a01b676SChenbing Zhengdefine i32 @test_bswap_shli_24_bswap_i32(i32 %a) nounwind { 1976a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_24_bswap_i32: 1986a01b676SChenbing Zheng; RV32ZB: # %bb.0: 199e18cc527SSanjay Patel; RV32ZB-NEXT: srli a0, a0, 24 2006a01b676SChenbing Zheng; RV32ZB-NEXT: ret 2016a01b676SChenbing Zheng; 2026a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_24_bswap_i32: 2036a01b676SChenbing Zheng; RV64ZB: # %bb.0: 204e18cc527SSanjay Patel; RV64ZB-NEXT: srliw a0, a0, 24 2056a01b676SChenbing Zheng; RV64ZB-NEXT: ret 2066a01b676SChenbing Zheng %1 = call i32 @llvm.bswap.i32(i32 %a) 2076a01b676SChenbing Zheng %2 = shl i32 %1, 24 2086a01b676SChenbing Zheng %3 = call i32 @llvm.bswap.i32(i32 %2) 2096a01b676SChenbing Zheng ret i32 %3 2106a01b676SChenbing Zheng} 2116a01b676SChenbing Zheng 2126a01b676SChenbing Zhengdefine i64 @test_bswap_shli_48_bswap_i64(i64 %a) nounwind { 2136a01b676SChenbing Zheng; RV32ZB-LABEL: test_bswap_shli_48_bswap_i64: 2146a01b676SChenbing Zheng; RV32ZB: # %bb.0: 215e18cc527SSanjay Patel; RV32ZB-NEXT: srli a0, a1, 16 2166a01b676SChenbing Zheng; RV32ZB-NEXT: li a1, 0 2176a01b676SChenbing Zheng; RV32ZB-NEXT: ret 2186a01b676SChenbing Zheng; 2196a01b676SChenbing Zheng; RV64ZB-LABEL: test_bswap_shli_48_bswap_i64: 2206a01b676SChenbing Zheng; RV64ZB: # %bb.0: 221e18cc527SSanjay Patel; RV64ZB-NEXT: srli a0, a0, 48 2226a01b676SChenbing Zheng; RV64ZB-NEXT: ret 2236a01b676SChenbing Zheng %1 = call i64 @llvm.bswap.i64(i64 %a) 2246a01b676SChenbing Zheng %2 = shl i64 %1, 48 2256a01b676SChenbing Zheng %3 = call i64 @llvm.bswap.i64(i64 %2) 2266a01b676SChenbing Zheng ret i64 %3 2276a01b676SChenbing Zheng} 228