Skip to content

Commit 73d7a55

Browse files
author
Dan Gohman
committed
[WebAssembly] Basic TargetTransformInfo support for SIMD128.
llvm-svn: 270508
1 parent 478c1a2 commit 73d7a55

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,59 @@ WebAssemblyTTIImpl::getPopcntSupport(unsigned TyWidth) const {
2525
assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
2626
return TargetTransformInfo::PSK_FastHardware;
2727
}
28+
29+
unsigned WebAssemblyTTIImpl::getNumberOfRegisters(bool Vector) {
30+
unsigned Result = BaseT::getNumberOfRegisters(Vector);
31+
32+
// For SIMD, use at least 16 registers, as a rough guess.
33+
if (Vector)
34+
Result = std::max(Result, 16u);
35+
36+
return Result;
37+
}
38+
39+
unsigned WebAssemblyTTIImpl::getRegisterBitWidth(bool Vector) {
40+
if (Vector && getST()->hasSIMD128())
41+
return 128;
42+
43+
return 64;
44+
}
45+
46+
unsigned WebAssemblyTTIImpl::getArithmeticInstrCost(
47+
unsigned Opcode, Type *Ty, TTI::OperandValueKind Opd1Info,
48+
TTI::OperandValueKind Opd2Info, TTI::OperandValueProperties Opd1PropInfo,
49+
TTI::OperandValueProperties Opd2PropInfo) {
50+
51+
unsigned Cost = BasicTTIImplBase<WebAssemblyTTIImpl>::getArithmeticInstrCost(
52+
Opcode, Ty, Opd1Info, Opd2Info, Opd1PropInfo, Opd2PropInfo);
53+
54+
if (VectorType *VTy = dyn_cast<VectorType>(Ty)) {
55+
switch (Opcode) {
56+
case Instruction::LShr:
57+
case Instruction::AShr:
58+
case Instruction::Shl:
59+
// SIMD128's shifts currently only accept a scalar shift count. For each
60+
// element, we'll need to extract, op, insert. The following is a rough
61+
// approxmation.
62+
if (Opd2Info != TTI::OK_UniformValue &&
63+
Opd2Info != TTI::OK_UniformConstantValue)
64+
Cost = VTy->getNumElements() *
65+
(TargetTransformInfo::TCC_Basic +
66+
getArithmeticInstrCost(Opcode, VTy->getElementType()) +
67+
TargetTransformInfo::TCC_Basic);
68+
break;
69+
}
70+
}
71+
return Cost;
72+
}
73+
74+
unsigned WebAssemblyTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
75+
unsigned Index) {
76+
unsigned Cost = BasicTTIImplBase::getVectorInstrCost(Opcode, Val, Index);
77+
78+
// SIMD128's insert/extract currently only take constant indices.
79+
if (Index == -1u)
80+
return Cost + 25 * TargetTransformInfo::TCC_Expensive;
81+
82+
return Cost;
83+
}

llvm/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,15 @@ class WebAssemblyTTIImpl final : public BasicTTIImplBase<WebAssemblyTTIImpl> {
6161
/// \name Vector TTI Implementations
6262
/// @{
6363

64-
// TODO: Implement Vector TTI for WebAssembly
64+
unsigned getNumberOfRegisters(bool Vector);
65+
unsigned getRegisterBitWidth(bool Vector);
66+
unsigned getArithmeticInstrCost(
67+
unsigned Opcode, Type *Ty,
68+
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
69+
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
70+
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
71+
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None);
72+
unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index);
6573

6674
/// @}
6775
};

0 commit comments

Comments
 (0)