xref: /llvm-project/llvm/test/CodeGen/RISCV/bswap-shift.ll (revision 4477500533281c90c6ce70eb87271f61fd6a415f)
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