mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[WebAssembly] Replace @llvm.wasm.popcnt with @llvm.ctpop.v16i8
Use the standard target-independent intrinsic to take advantage of standard optimizations. Differential Revision: https://reviews.llvm.org/D106506
This commit is contained in:
parent
2ef5dd8386
commit
8403ff42b3
@ -172,11 +172,6 @@ def int_wasm_pmax :
|
||||
[LLVMMatchType<0>, LLVMMatchType<0>],
|
||||
[IntrNoMem, IntrSpeculatable]>;
|
||||
|
||||
// TODO: Replace this intrinsic with normal ISel patterns once popcnt is merged
|
||||
// to the proposal.
|
||||
def int_wasm_popcnt :
|
||||
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty], [IntrNoMem, IntrSpeculatable]>;
|
||||
|
||||
def int_wasm_extmul_low_signed :
|
||||
Intrinsic<[llvm_anyvector_ty],
|
||||
[LLVMSubdivide2VectorType<0>, LLVMSubdivide2VectorType<0>],
|
||||
|
@ -212,6 +212,9 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
||||
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32})
|
||||
setOperationAction(Op, T, Legal);
|
||||
|
||||
// And we have popcnt for i8x16
|
||||
setOperationAction(ISD::CTPOP, MVT::v16i8, Legal);
|
||||
|
||||
// Expand float operations supported for scalars but not SIMD
|
||||
for (auto Op : {ISD::FCOPYSIGN, ISD::FLOG, ISD::FLOG2, ISD::FLOG10,
|
||||
ISD::FEXP, ISD::FEXP2, ISD::FRINT})
|
||||
|
@ -833,7 +833,7 @@ defm ABS : SIMDUnaryInt<abs, "abs", 96>;
|
||||
defm NEG : SIMDUnaryInt<ivneg, "neg", 97>;
|
||||
|
||||
// Population count: popcnt
|
||||
defm POPCNT : SIMDUnary<I8x16, int_wasm_popcnt, "popcnt", 0x62>;
|
||||
defm POPCNT : SIMDUnary<I8x16, ctpop, "popcnt", 0x62>;
|
||||
|
||||
// Any lane true: any_true
|
||||
defm ANYTRUE : SIMD_I<(outs I32:$dst), (ins V128:$vec), (outs), (ins), [],
|
||||
|
@ -78,9 +78,9 @@ define <16 x i8> @avgr_u_v16i8(<16 x i8> %x, <16 x i8> %y) {
|
||||
; CHECK-NEXT: .functype popcnt_v16i8 (v128) -> (v128){{$}}
|
||||
; CHECK-NEXT: i8x16.popcnt $push[[R:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[R]]{{$}}
|
||||
declare <16 x i8> @llvm.wasm.popcnt(<16 x i8>)
|
||||
declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
|
||||
define <16 x i8> @popcnt_v16i8(<16 x i8> %x) {
|
||||
%a = call <16 x i8> @llvm.wasm.popcnt(<16 x i8> %x)
|
||||
%a = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %x)
|
||||
ret <16 x i8> %a
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@ target triple = "wasm32-unknown-unknown"
|
||||
; ==============================================================================
|
||||
|
||||
; CHECK-LABEL: ctlz_v16i8:
|
||||
; CHECK: i32.clz
|
||||
; CHECK: i8x16.popcnt
|
||||
declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1)
|
||||
define <16 x i8> @ctlz_v16i8(<16 x i8> %x) {
|
||||
%v = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %x, i1 false)
|
||||
@ -18,14 +18,14 @@ define <16 x i8> @ctlz_v16i8(<16 x i8> %x) {
|
||||
}
|
||||
|
||||
; CHECK-LABEL: ctlz_v16i8_undef:
|
||||
; CHECK: i32.clz
|
||||
; CHECK: i8x16.popcnt
|
||||
define <16 x i8> @ctlz_v16i8_undef(<16 x i8> %x) {
|
||||
%v = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %x, i1 true)
|
||||
ret <16 x i8> %v
|
||||
}
|
||||
|
||||
; CHECK-LABEL: cttz_v16i8:
|
||||
; CHECK: i32.ctz
|
||||
; CHECK: i8x16.popcnt
|
||||
declare <16 x i8> @llvm.cttz.v16i8(<16 x i8>, i1)
|
||||
define <16 x i8> @cttz_v16i8(<16 x i8> %x) {
|
||||
%v = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %x, i1 false)
|
||||
@ -33,21 +33,12 @@ define <16 x i8> @cttz_v16i8(<16 x i8> %x) {
|
||||
}
|
||||
|
||||
; CHECK-LABEL: cttz_v16i8_undef:
|
||||
; CHECK: i32.ctz
|
||||
; CHECK: i8x16.popcnt
|
||||
define <16 x i8> @cttz_v16i8_undef(<16 x i8> %x) {
|
||||
%v = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %x, i1 true)
|
||||
ret <16 x i8> %v
|
||||
}
|
||||
|
||||
; CHECK-LABEL: ctpop_v16i8:
|
||||
; Note: expansion does not use i32.popcnt
|
||||
; CHECK: v128.and
|
||||
declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
|
||||
define <16 x i8> @ctpop_v16i8(<16 x i8> %x) {
|
||||
%v = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %x)
|
||||
ret <16 x i8> %v
|
||||
}
|
||||
|
||||
; CHECK-LABEL: sdiv_v16i8:
|
||||
; CHECK: i32.div_s
|
||||
define <16 x i8> @sdiv_v16i8(<16 x i8> %x, <16 x i8> %y) {
|
||||
|
Loading…
Reference in New Issue
Block a user