Bug 1069956: SIMD x86-x64 backend: implement SimdReinterpretCast; r=sunfish

This commit is contained in:
Benjamin Bouvier 2014-09-25 13:18:14 +02:00
parent 50c6f26e9d
commit dbfbf336f5
6 changed files with 41 additions and 0 deletions

View File

@ -3726,6 +3726,13 @@ LIRGenerator::visitSimdConvert(MSimdConvert *ins)
MOZ_CRASH("Unknown SIMD kind when generating constant");
}
bool
LIRGenerator::visitSimdReinterpretCast(MSimdReinterpretCast *ins)
{
MOZ_ASSERT(IsSimdType(ins->type()) && IsSimdType(ins->input()->type()));
return redefine(ins, ins->input());
}
bool
LIRGenerator::visitSimdExtractElement(MSimdExtractElement *ins)
{

View File

@ -276,6 +276,7 @@ class LIRGenerator : public LIRGeneratorSpecific
bool visitSimdBinaryBitwise(MSimdBinaryBitwise *ins);
bool visitSimdConstant(MSimdConstant *ins);
bool visitSimdConvert(MSimdConvert *ins);
bool visitSimdReinterpretCast(MSimdReinterpretCast *ins);
bool visitPhi(MPhi *ins);
bool visitBeta(MBeta *ins);
bool visitObjectState(MObjectState *ins);

View File

@ -1389,6 +1389,34 @@ class MSimdConvert : public MUnaryInstruction
ALLOW_CLONE(MSimdConvert)
};
// Casts bits of a vector input to another SIMD type (doesn't generate code).
class MSimdReinterpretCast : public MUnaryInstruction
{
MSimdReinterpretCast(MDefinition *obj, MIRType fromType, MIRType toType)
: MUnaryInstruction(obj)
{
MOZ_ASSERT(IsSimdType(obj->type()) && fromType == obj->type());
MOZ_ASSERT(IsSimdType(toType));
setResultType(toType);
}
public:
INSTRUCTION_HEADER(SimdReinterpretCast);
static MSimdReinterpretCast* NewAsmJS(TempAllocator &alloc, MDefinition *obj, MIRType fromType,
MIRType toType)
{
return new(alloc) MSimdReinterpretCast(obj, fromType, toType);
}
AliasSet getAliasSet() const {
return AliasSet::None();
}
bool congruentTo(const MDefinition *ins) const {
return congruentIfOperandsEqual(ins);
}
ALLOW_CLONE(MSimdReinterpretCast)
};
// Extracts a lane element from a given vector type, given by its lane symbol.
class MSimdExtractElement : public MUnaryInstruction
{

View File

@ -16,6 +16,7 @@ namespace jit {
_(SimdSplatX4) \
_(SimdConstant) \
_(SimdConvert) \
_(SimdReinterpretCast) \
_(SimdExtractElement) \
_(SimdInsertElement) \
_(SimdSignMask) \

View File

@ -115,6 +115,7 @@ class ParallelSafetyVisitor : public MDefinitionVisitor
SAFE_OP(SimdSplatX4)
SAFE_OP(SimdConstant)
SAFE_OP(SimdConvert)
SAFE_OP(SimdReinterpretCast)
SAFE_OP(SimdExtractElement)
SAFE_OP(SimdInsertElement)
SAFE_OP(SimdSignMask)

View File

@ -192,6 +192,9 @@ IsCompatibleLIRCoercion(MIRType to, MIRType from)
(from == MIRType_Int32 || from == MIRType_Boolean)) {
return true;
}
// SIMD types can be coerced with from*Bits operators.
if (IsSimdType(to) && IsSimdType(from))
return true;
return false;
}