; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=XTENSA %s
declare i16 @llvm.bswap.i16(i16)
declare i32 @llvm.bswap.i32(i32)
declare i64 @llvm.bswap.i64(i64)
declare i8 @llvm.bitreverse.i8(i8)
declare i16 @llvm.bitreverse.i16(i16)
declare i32 @llvm.bitreverse.i32(i32)
declare i64 @llvm.bitreverse.i64(i64)
define i16 @test_bswap_i16(i16 %a) nounwind {
; XTENSA-LABEL: test_bswap_i16:
; XTENSA: l32r a8, .LCPI0_0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: srli a8, a8, 8
; XTENSA-NEXT: slli a9, a2, 8
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i16 @llvm.bswap.i16(i16 %a)
ret i16 %tmp
}
define i32 @test_bswap_i32(i32 %a) nounwind {
; XTENSA-LABEL: test_bswap_i32:
; XTENSA: srli a8, a2, 8
; XTENSA-NEXT: l32r a9, .LCPI1_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: extui a10, a2, 24, 8
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 8
; XTENSA-NEXT: slli a10, a2, 24
; XTENSA-NEXT: or a9, a10, a9
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i32 @llvm.bswap.i32(i32 %a)
ret i32 %tmp
}
define i64 @test_bswap_i64(i64 %a) nounwind {
; XTENSA-LABEL: test_bswap_i64:
; XTENSA: srli a8, a3, 8
; XTENSA-NEXT: l32r a9, .LCPI2_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: extui a10, a3, 24, 8
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: and a10, a3, a9
; XTENSA-NEXT: slli a10, a10, 8
; XTENSA-NEXT: slli a11, a3, 24
; XTENSA-NEXT: or a10, a11, a10
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a2, 8
; XTENSA-NEXT: and a10, a10, a9
; XTENSA-NEXT: extui a11, a2, 24, 8
; XTENSA-NEXT: or a10, a10, a11
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 8
; XTENSA-NEXT: slli a11, a2, 24
; XTENSA-NEXT: or a9, a11, a9
; XTENSA-NEXT: or a3, a9, a10
; XTENSA-NEXT: or a2, a8, a8
; XTENSA-NEXT: ret
%tmp = call i64 @llvm.bswap.i64(i64 %a)
ret i64 %tmp
}
define i8 @test_bitreverse_i8(i8 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_i8:
; XTENSA: movi a8, 15
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: slli a8, a8, 4
; XTENSA-NEXT: movi a9, 240
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: srli a9, a9, 4
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: movi a10, 51
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: movi a10, 85
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i8 @llvm.bitreverse.i8(i8 %a)
ret i8 %tmp
}
define i16 @test_bitreverse_i16(i16 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_i16:
; XTENSA: l32r a8, .LCPI4_0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: srli a8, a8, 8
; XTENSA-NEXT: slli a9, a2, 8
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 4
; XTENSA-NEXT: l32r a10, .LCPI4_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 4
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI4_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI4_3
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i16 @llvm.bitreverse.i16(i16 %a)
ret i16 %tmp
}
define i32 @test_bitreverse_i32(i32 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_i32:
; XTENSA: srli a8, a2, 8
; XTENSA-NEXT: l32r a9, .LCPI5_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: extui a10, a2, 24, 8
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 8
; XTENSA-NEXT: slli a10, a2, 24
; XTENSA-NEXT: or a9, a10, a9
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 4
; XTENSA-NEXT: l32r a10, .LCPI5_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 4
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI5_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI5_3
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i32 @llvm.bitreverse.i32(i32 %a)
ret i32 %tmp
}
define i64 @test_bitreverse_i64(i64 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_i64:
; XTENSA: srli a8, a3, 8
; XTENSA-NEXT: l32r a9, .LCPI6_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: extui a10, a3, 24, 8
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: and a10, a3, a9
; XTENSA-NEXT: slli a10, a10, 8
; XTENSA-NEXT: slli a11, a3, 24
; XTENSA-NEXT: or a10, a11, a10
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a8, 4
; XTENSA-NEXT: l32r a11, .LCPI6_1
; XTENSA-NEXT: and a10, a10, a11
; XTENSA-NEXT: and a8, a8, a11
; XTENSA-NEXT: slli a8, a8, 4
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a8, 2
; XTENSA-NEXT: l32r a7, .LCPI6_2
; XTENSA-NEXT: and a10, a10, a7
; XTENSA-NEXT: and a8, a8, a7
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a8, 1
; XTENSA-NEXT: l32r a6, .LCPI6_3
; XTENSA-NEXT: and a10, a10, a6
; XTENSA-NEXT: and a8, a8, a6
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a2, 8
; XTENSA-NEXT: and a10, a10, a9
; XTENSA-NEXT: extui a5, a2, 24, 8
; XTENSA-NEXT: or a10, a10, a5
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 8
; XTENSA-NEXT: slli a5, a2, 24
; XTENSA-NEXT: or a9, a5, a9
; XTENSA-NEXT: or a9, a9, a10
; XTENSA-NEXT: srli a10, a9, 4
; XTENSA-NEXT: and a10, a10, a11
; XTENSA-NEXT: and a9, a9, a11
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a9, a10, a9
; XTENSA-NEXT: srli a10, a9, 2
; XTENSA-NEXT: and a10, a10, a7
; XTENSA-NEXT: and a9, a9, a7
; XTENSA-NEXT: slli a9, a9, 2
; XTENSA-NEXT: or a9, a10, a9
; XTENSA-NEXT: srli a10, a9, 1
; XTENSA-NEXT: and a10, a10, a6
; XTENSA-NEXT: and a9, a9, a6
; XTENSA-NEXT: slli a9, a9, 1
; XTENSA-NEXT: or a3, a10, a9
; XTENSA-NEXT: or a2, a8, a8
; XTENSA-NEXT: ret
%tmp = call i64 @llvm.bitreverse.i64(i64 %a)
ret i64 %tmp
}
define i16 @test_bswap_bitreverse_i16(i16 %a) nounwind {
; XTENSA-LABEL: test_bswap_bitreverse_i16:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI7_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI7_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI7_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i16 @llvm.bswap.i16(i16 %a)
%tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp)
ret i16 %tmp2
}
define i32 @test_bswap_bitreverse_i32(i32 %a) nounwind {
; XTENSA-LABEL: test_bswap_bitreverse_i32:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI8_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI8_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI8_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i32 @llvm.bswap.i32(i32 %a)
%tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp)
ret i32 %tmp2
}
define i64 @test_bswap_bitreverse_i64(i64 %a) nounwind {
; XTENSA-LABEL: test_bswap_bitreverse_i64:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI9_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a10, a2, a9
; XTENSA-NEXT: slli a10, a10, 4
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: srli a10, a8, 2
; XTENSA-NEXT: l32r a11, .LCPI9_1
; XTENSA-NEXT: and a10, a10, a11
; XTENSA-NEXT: and a8, a8, a11
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a8, 1
; XTENSA-NEXT: l32r a7, .LCPI9_2
; XTENSA-NEXT: and a10, a10, a7
; XTENSA-NEXT: and a8, a8, a7
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a10, a8
; XTENSA-NEXT: srli a8, a3, 4
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a3, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: and a9, a9, a11
; XTENSA-NEXT: and a8, a8, a11
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: and a9, a9, a7
; XTENSA-NEXT: and a8, a8, a7
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a3, a9, a8
; XTENSA-NEXT: ret
%tmp = call i64 @llvm.bswap.i64(i64 %a)
%tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp)
ret i64 %tmp2
}
define i16 @test_bitreverse_bswap_i16(i16 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_bswap_i16:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI10_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI10_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI10_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i16 @llvm.bitreverse.i16(i16 %a)
%tmp2 = call i16 @llvm.bswap.i16(i16 %tmp)
ret i16 %tmp2
}
define i32 @test_bitreverse_bswap_i32(i32 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_bswap_i32:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI11_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a2, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: l32r a10, .LCPI11_1
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: l32r a10, .LCPI11_2
; XTENSA-NEXT: and a9, a9, a10
; XTENSA-NEXT: and a8, a8, a10
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a9, a8
; XTENSA-NEXT: ret
%tmp = call i32 @llvm.bitreverse.i32(i32 %a)
%tmp2 = call i32 @llvm.bswap.i32(i32 %tmp)
ret i32 %tmp2
}
define i64 @test_bitreverse_bswap_i64(i64 %a) nounwind {
; XTENSA-LABEL: test_bitreverse_bswap_i64:
; XTENSA: srli a8, a2, 4
; XTENSA-NEXT: l32r a9, .LCPI12_0
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a10, a2, a9
; XTENSA-NEXT: slli a10, a10, 4
; XTENSA-NEXT: or a8, a8, a10
; XTENSA-NEXT: srli a10, a8, 2
; XTENSA-NEXT: l32r a11, .LCPI12_1
; XTENSA-NEXT: and a10, a10, a11
; XTENSA-NEXT: and a8, a8, a11
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a10, a8
; XTENSA-NEXT: srli a10, a8, 1
; XTENSA-NEXT: l32r a7, .LCPI12_2
; XTENSA-NEXT: and a10, a10, a7
; XTENSA-NEXT: and a8, a8, a7
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a2, a10, a8
; XTENSA-NEXT: srli a8, a3, 4
; XTENSA-NEXT: and a8, a8, a9
; XTENSA-NEXT: and a9, a3, a9
; XTENSA-NEXT: slli a9, a9, 4
; XTENSA-NEXT: or a8, a8, a9
; XTENSA-NEXT: srli a9, a8, 2
; XTENSA-NEXT: and a9, a9, a11
; XTENSA-NEXT: and a8, a8, a11
; XTENSA-NEXT: slli a8, a8, 2
; XTENSA-NEXT: or a8, a9, a8
; XTENSA-NEXT: srli a9, a8, 1
; XTENSA-NEXT: and a9, a9, a7
; XTENSA-NEXT: and a8, a8, a7
; XTENSA-NEXT: slli a8, a8, 1
; XTENSA-NEXT: or a3, a9, a8
; XTENSA-NEXT: ret
%tmp = call i64 @llvm.bitreverse.i64(i64 %a)
%tmp2 = call i64 @llvm.bswap.i64(i64 %tmp)
ret i64 %tmp2
}