mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 06:15:43 +00:00
Bug 1069956: SIMD x86-x64 backend: implement SimdReinterpretCast; r=sunfish
This commit is contained in:
parent
50c6f26e9d
commit
dbfbf336f5
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -16,6 +16,7 @@ namespace jit {
|
||||
_(SimdSplatX4) \
|
||||
_(SimdConstant) \
|
||||
_(SimdConvert) \
|
||||
_(SimdReinterpretCast) \
|
||||
_(SimdExtractElement) \
|
||||
_(SimdInsertElement) \
|
||||
_(SimdSignMask) \
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user