mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 11:15:34 +00:00
Bug 1272640: Implement wasm copysign opcode; r=sunfish
MozReview-Commit-ID: GT0Znmk0Dkl --HG-- extra : rebase_source : 205140ab0f22c82d29d4a5a35c707c451ee7caa2
This commit is contained in:
parent
71c7696397
commit
12b06802d9
@ -339,18 +339,16 @@ DecodeExpr(FunctionDecoder& f)
|
||||
case Expr::F32Div:
|
||||
case Expr::F32Min:
|
||||
case Expr::F32Max:
|
||||
return f.iter().readBinary(ValType::F32, nullptr, nullptr);
|
||||
case Expr::F32CopySign:
|
||||
return f.iter().notYetImplemented("copysign");
|
||||
return f.iter().readBinary(ValType::F32, nullptr, nullptr);
|
||||
case Expr::F64Add:
|
||||
case Expr::F64Sub:
|
||||
case Expr::F64Mul:
|
||||
case Expr::F64Div:
|
||||
case Expr::F64Min:
|
||||
case Expr::F64Max:
|
||||
return f.iter().readBinary(ValType::F64, nullptr, nullptr);
|
||||
case Expr::F64CopySign:
|
||||
return f.iter().notYetImplemented("copysign");
|
||||
return f.iter().readBinary(ValType::F64, nullptr, nullptr);
|
||||
case Expr::I32Eq:
|
||||
case Expr::I32Ne:
|
||||
case Expr::I32LtS:
|
||||
|
@ -2030,6 +2030,39 @@ EmitMinMax(FunctionCompiler& f, ValType operandType, MIRType mirType, bool isMax
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
EmitCopySign(FunctionCompiler& f, ValType operandType)
|
||||
{
|
||||
MDefinition* lhs;
|
||||
MDefinition* rhs;
|
||||
if (!f.iter().readBinary(operandType, &lhs, &rhs))
|
||||
return false;
|
||||
|
||||
MIRType intType;
|
||||
MDefinition* intMax;
|
||||
MDefinition* intMin;
|
||||
if (operandType == ValType::F32) {
|
||||
intType = MIRType::Int32;
|
||||
intMax = f.constant(Int32Value(INT32_MAX), MIRType::Int32);
|
||||
intMin = f.constant(Int32Value(INT32_MIN), MIRType::Int32);
|
||||
} else {
|
||||
MOZ_ASSERT(operandType == ValType::F64);
|
||||
intType = MIRType::Int64;
|
||||
intMax = f.constant(int64_t(INT64_MAX));
|
||||
intMin = f.constant(int64_t(INT64_MIN));
|
||||
}
|
||||
|
||||
MDefinition* lhsi = f.unary<MAsmReinterpret>(lhs, intType);
|
||||
MDefinition* rhsi = f.unary<MAsmReinterpret>(rhs, intType);
|
||||
|
||||
MDefinition* lhsNoSign = f.bitwise<MBitAnd>(lhsi, intMax, intType);
|
||||
MDefinition* rhsSign = f.bitwise<MBitAnd>(rhsi, intMin, intType);
|
||||
|
||||
MDefinition* resi = f.bitwise<MBitOr>(lhsNoSign, rhsSign, intType);
|
||||
f.iter().setResult(f.unary<MAsmReinterpret>(resi, ToMIRType(operandType)));
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
EmitComparison(FunctionCompiler& f,
|
||||
ValType operandType, JSOp compareOp, MCompare::CompareType compareType)
|
||||
@ -3005,6 +3038,8 @@ EmitExpr(FunctionCompiler& f)
|
||||
case Expr::F32Min:
|
||||
case Expr::F32Max:
|
||||
return EmitMinMax(f, ValType::F32, MIRType::Float32, expr == Expr::F32Max);
|
||||
case Expr::F32CopySign:
|
||||
return EmitCopySign(f, ValType::F32);
|
||||
case Expr::F32Neg:
|
||||
return EmitUnaryWithType<MAsmJSNeg>(f, ValType::F32, MIRType::Float32);
|
||||
case Expr::F32Abs:
|
||||
@ -3061,6 +3096,8 @@ EmitExpr(FunctionCompiler& f)
|
||||
case Expr::F64Min:
|
||||
case Expr::F64Max:
|
||||
return EmitMinMax(f, ValType::F64, MIRType::Double, expr == Expr::F64Max);
|
||||
case Expr::F64CopySign:
|
||||
return EmitCopySign(f, ValType::F64);
|
||||
case Expr::F64Neg:
|
||||
return EmitUnaryWithType<MAsmJSNeg>(f, ValType::F64, MIRType::Double);
|
||||
case Expr::F64Abs:
|
||||
@ -3333,8 +3370,6 @@ EmitExpr(FunctionCompiler& f)
|
||||
return EmitAtomicsExchange(f);
|
||||
|
||||
// Future opcodes
|
||||
case Expr::F32CopySign:
|
||||
case Expr::F64CopySign:
|
||||
case Expr::I64Load8S:
|
||||
case Expr::I64Load16S:
|
||||
case Expr::I64Load32S:
|
||||
|
Loading…
Reference in New Issue
Block a user