diff --git a/js/src/jit/BacktrackingAllocator.cpp b/js/src/jit/BacktrackingAllocator.cpp index 64e46a4edfcc..b06c2f039fdf 100644 --- a/js/src/jit/BacktrackingAllocator.cpp +++ b/js/src/jit/BacktrackingAllocator.cpp @@ -1128,7 +1128,9 @@ BacktrackingAllocator::populateSafepoints() if (ins == reg->ins() && !reg->isTemp()) { DebugOnly def = reg->def(); JS_ASSERT_IF(def->policy() == LDefinition::MUST_REUSE_INPUT, - def->type() == LDefinition::GENERAL || def->type() == LDefinition::DOUBLE); + def->type() == LDefinition::GENERAL || + def->type() == LDefinition::FLOAT32 || + def->type() == LDefinition::DOUBLE); continue; } diff --git a/js/src/jit/LIR.cpp b/js/src/jit/LIR.cpp index fc672bdb356e..70bf0e01a659 100644 --- a/js/src/jit/LIR.cpp +++ b/js/src/jit/LIR.cpp @@ -197,10 +197,11 @@ static const char * const TypeChars[] = { "i", // INTEGER "o", // OBJECT - "f", // DOUBLE + "f", // FLOAT32 + "d", // DOUBLE #ifdef JS_NUNBOX32 "t", // TYPE - "d" // PAYLOAD + "p" // PAYLOAD #elif JS_PUNBOX64 "x" // BOX #endif diff --git a/js/src/jit/LIR.h b/js/src/jit/LIR.h index 1f802ba79186..5e020fe01ba5 100644 --- a/js/src/jit/LIR.h +++ b/js/src/jit/LIR.h @@ -446,7 +446,8 @@ class LDefinition GENERAL, // Generic, integer or pointer-width data (GPR). OBJECT, // Pointer that may be collected as garbage (GPR). SLOTS, // Slots/elements pointer that may be moved by minor GCs (GPR). - DOUBLE, // 64-bit point value (FPU). + FLOAT32, // 32-bit floating-point value (FPU). + DOUBLE, // 64-bit floating-point value (FPU). #ifdef JS_NUNBOX32 // A type virtual register must be followed by a payload virtual // register, as both will be tracked as a single gcthing. @@ -540,8 +541,9 @@ class LDefinition case MIRType_Object: return LDefinition::OBJECT; case MIRType_Double: - case MIRType_Float32: return LDefinition::DOUBLE; + case MIRType_Float32: + return LDefinition::FLOAT32; #if defined(JS_PUNBOX64) case MIRType_Value: return LDefinition::BOX; diff --git a/js/src/jit/LinearScan.cpp b/js/src/jit/LinearScan.cpp index cd22f4d36818..86731c3ece01 100644 --- a/js/src/jit/LinearScan.cpp +++ b/js/src/jit/LinearScan.cpp @@ -515,7 +515,9 @@ LinearScanAllocator::populateSafepoints() if (ins == reg->ins() && !reg->isTemp()) { DebugOnly def = reg->def(); JS_ASSERT_IF(def->policy() == LDefinition::MUST_REUSE_INPUT, - def->type() == LDefinition::GENERAL || def->type() == LDefinition::DOUBLE); + def->type() == LDefinition::GENERAL || + def->type() == LDefinition::FLOAT32 || + def->type() == LDefinition::DOUBLE); continue; } @@ -792,7 +794,7 @@ LinearScanAllocator::allocateSlotFor(const LiveInterval *interval) LinearScanVirtualRegister *reg = &vregs[interval->vreg()]; SlotList *freed; - if (reg->type() == LDefinition::DOUBLE) + if (reg->type() == LDefinition::DOUBLE || reg->type() == LDefinition::FLOAT32) freed = &finishedDoubleSlots_; #ifdef JS_NUNBOX32 else if (IsNunbox(reg)) diff --git a/js/src/jit/LiveRangeAllocator.cpp b/js/src/jit/LiveRangeAllocator.cpp index 361fdb60ebcd..0d457286657e 100644 --- a/js/src/jit/LiveRangeAllocator.cpp +++ b/js/src/jit/LiveRangeAllocator.cpp @@ -468,6 +468,7 @@ AddRegisterToSafepoint(LSafepoint *safepoint, AnyRegister reg, const LDefinition JS_ASSERT(def.type() == LDefinition::GENERAL || def.type() == LDefinition::DOUBLE || + def.type() == LDefinition::FLOAT32 || def.type() == LDefinition::OBJECT); if (def.type() == LDefinition::OBJECT) diff --git a/js/src/jit/LiveRangeAllocator.h b/js/src/jit/LiveRangeAllocator.h index a469ebda4aeb..cfff988c4163 100644 --- a/js/src/jit/LiveRangeAllocator.h +++ b/js/src/jit/LiveRangeAllocator.h @@ -136,7 +136,7 @@ static inline bool DefinitionCompatibleWith(LInstruction *ins, const LDefinition *def, LAllocation alloc) { if (ins->isPhi()) { - if (def->type() == LDefinition::DOUBLE) + if (def->type() == LDefinition::DOUBLE || def->type() == LDefinition::FLOAT32) return alloc.isFloatReg() || alloc.kind() == LAllocation::DOUBLE_SLOT; return alloc.isGeneralReg() || alloc.kind() == LAllocation::STACK_SLOT; } @@ -145,7 +145,7 @@ DefinitionCompatibleWith(LInstruction *ins, const LDefinition *def, LAllocation case LDefinition::DEFAULT: if (!alloc.isRegister()) return false; - return alloc.isFloatReg() == (def->type() == LDefinition::DOUBLE); + return alloc.isFloatReg() == (def->type() == LDefinition::DOUBLE || def->type() == LDefinition::FLOAT32); case LDefinition::PRESET: return alloc == *def->output(); case LDefinition::MUST_REUSE_INPUT: @@ -473,7 +473,7 @@ class VirtualRegister return intervals_.insert(found, interval); } bool isDouble() const { - return def_->type() == LDefinition::DOUBLE; + return def_->type() == LDefinition::DOUBLE || def_->type() == LDefinition::FLOAT32; } LiveInterval *intervalFor(CodePosition pos); diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index 480ca2ae611f..67d8af974949 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -660,7 +660,7 @@ LIRGenerator::visitTest(MTest *test) temp0 = LDefinition::BogusTemp(); temp1 = LDefinition::BogusTemp(); } - LTestVAndBranch *lir = new(alloc()) LTestVAndBranch(ifTrue, ifFalse, tempFloat(), temp0, temp1); + LTestVAndBranch *lir = new(alloc()) LTestVAndBranch(ifTrue, ifFalse, tempDouble(), temp0, temp1); if (!useBox(lir, LTestVAndBranch::Input, opd)) return false; return add(lir, test); @@ -1027,7 +1027,7 @@ LIRGenerator::visitTypeOf(MTypeOf *ins) bool LIRGenerator::visitToId(MToId *ins) { - LToIdV *lir = new(alloc()) LToIdV(tempFloat()); + LToIdV *lir = new(alloc()) LToIdV(tempDouble()); if (!useBox(lir, LToIdV::Object, ins->lhs())) return false; if (!useBox(lir, LToIdV::Index, ins->rhs())) @@ -1176,7 +1176,7 @@ bool LIRGenerator::visitRound(MRound *ins) { JS_ASSERT(ins->num()->type() == MIRType_Double); - LRound *lir = new(alloc()) LRound(useRegister(ins->num()), tempFloat()); + LRound *lir = new(alloc()) LRound(useRegister(ins->num()), tempDouble()); if (!assignSnapshot(lir)) return false; return define(lir, ins); @@ -1755,7 +1755,7 @@ LIRGenerator::visitToInt32(MToInt32 *convert) switch (opd->type()) { case MIRType_Value: { - LValueToInt32 *lir = new(alloc()) LValueToInt32(tempFloat(), temp(), LValueToInt32::NORMAL); + LValueToInt32 *lir = new(alloc()) LValueToInt32(tempDouble(), temp(), LValueToInt32::NORMAL); if (!useBox(lir, LValueToInt32::Input, opd)) return false; return assignSnapshot(lir) && define(lir, convert) && assignSafepoint(lir, convert); @@ -1800,7 +1800,7 @@ LIRGenerator::visitTruncateToInt32(MTruncateToInt32 *truncate) switch (opd->type()) { case MIRType_Value: { - LValueToInt32 *lir = new(alloc()) LValueToInt32(tempFloat(), temp(), LValueToInt32::TRUNCATE); + LValueToInt32 *lir = new(alloc()) LValueToInt32(tempDouble(), temp(), LValueToInt32::TRUNCATE); if (!useBox(lir, LValueToInt32::Input, opd)) return false; return assignSnapshot(lir) && define(lir, truncate) && assignSafepoint(lir, truncate); @@ -2026,7 +2026,7 @@ LIRGenerator::visitMaybeToDoubleElement(MMaybeToDoubleElement *ins) LMaybeToDoubleElement *lir = new(alloc()) LMaybeToDoubleElement(useRegisterAtStart(ins->elements()), useRegisterAtStart(ins->value()), - tempFloat()); + tempDouble()); return defineBox(lir, ins); } @@ -2343,7 +2343,7 @@ LIRGenerator::visitNot(MNot *ins) temp1 = LDefinition::BogusTemp(); } - LNotV *lir = new(alloc()) LNotV(tempFloat(), temp0, temp1); + LNotV *lir = new(alloc()) LNotV(tempDouble(), temp0, temp1); if (!useBox(lir, LNotV::Input, op)) return false; return define(lir, ins); @@ -2626,7 +2626,7 @@ LIRGenerator::visitClampToUint8(MClampToUint8 *ins) case MIRType_Value: { - LClampVToUint8 *lir = new(alloc()) LClampVToUint8(tempFloat()); + LClampVToUint8 *lir = new(alloc()) LClampVToUint8(tempDouble()); if (!useBox(lir, LClampVToUint8::Input, in)) return false; return assignSnapshot(lir) && define(lir, ins) && assignSafepoint(lir, ins); @@ -2913,15 +2913,15 @@ LIRGenerator::visitAssertRange(MAssertRange *ins) break; case MIRType_Double: - lir = new(alloc()) LAssertRangeD(useRegister(input), tempFloat()); + lir = new(alloc()) LAssertRangeD(useRegister(input), tempDouble()); break; case MIRType_Float32: - lir = new(alloc()) LAssertRangeF(useRegister(input), tempFloat()); + lir = new(alloc()) LAssertRangeF(useRegister(input), tempFloat32()); break; case MIRType_Value: - lir = new(alloc()) LAssertRangeV(tempToUnbox(), tempFloat(), tempFloat()); + lir = new(alloc()) LAssertRangeV(tempToUnbox(), tempDouble(), tempDouble()); if (!useBox(lir, LAssertRangeV::Input, input)) return false; break; @@ -3027,7 +3027,7 @@ LIRGenerator::visitSetElementCache(MSetElementCache *ins) LInstruction *lir; if (ins->value()->type() == MIRType_Value) { lir = new(alloc()) LSetElementCacheV(useByteOpRegister(ins->object()), tempToUnbox(), - temp(), tempFloat()); + temp(), tempDouble()); if (!useBox(lir, LSetElementCacheV::Index, ins->index())) return false; @@ -3036,7 +3036,7 @@ LIRGenerator::visitSetElementCache(MSetElementCache *ins) } else { lir = new(alloc()) LSetElementCacheT(useByteOpRegister(ins->object()), useRegisterOrConstant(ins->value()), - tempToUnbox(), temp(), tempFloat()); + tempToUnbox(), temp(), tempDouble()); if (!useBox(lir, LSetElementCacheT::Index, ins->index())) return false; diff --git a/js/src/jit/RegisterAllocator.h b/js/src/jit/RegisterAllocator.h index e6059eaef31d..f5f0d2770cfd 100644 --- a/js/src/jit/RegisterAllocator.h +++ b/js/src/jit/RegisterAllocator.h @@ -369,7 +369,7 @@ class RegisterAllocator static inline AnyRegister GetFixedRegister(const LDefinition *def, const LUse *use) { - return def->type() == LDefinition::DOUBLE + return (def->type() == LDefinition::DOUBLE || def->type() == LDefinition::FLOAT32) ? AnyRegister(FloatRegister::FromCode(use->registerCode())) : AnyRegister(Register::FromCode(use->registerCode())); } diff --git a/js/src/jit/StupidAllocator.cpp b/js/src/jit/StupidAllocator.cpp index 921bdf9d08d4..9c350555d9cc 100644 --- a/js/src/jit/StupidAllocator.cpp +++ b/js/src/jit/StupidAllocator.cpp @@ -28,7 +28,9 @@ StupidAllocator::stackLocation(uint32_t vreg) if (def->policy() == LDefinition::PRESET && def->output()->isArgument()) return def->output(); - return new(alloc()) LStackSlot(DefaultStackSlot(vreg), def->type() == LDefinition::DOUBLE); + return new(alloc()) LStackSlot(DefaultStackSlot(vreg), + def->type() == LDefinition::DOUBLE || + def->type() == LDefinition::FLOAT32); } StupidAllocator::RegisterIndex @@ -162,7 +164,7 @@ StupidAllocator::allocateRegister(LInstruction *ins, uint32_t vreg) for (size_t i = 0; i < registerCount; i++) { AnyRegister reg = registers[i].reg; - if (reg.isFloat() != (def->type() == LDefinition::DOUBLE)) + if (reg.isFloat() != (def->type() == LDefinition::DOUBLE || def->type() == LDefinition::FLOAT32)) continue; // Skip the register if it is in use for an allocated input or output. diff --git a/js/src/jit/arm/Lowering-arm.cpp b/js/src/jit/arm/Lowering-arm.cpp index 8f4ca0c78d19..b74971f3e3f6 100644 --- a/js/src/jit/arm/Lowering-arm.cpp +++ b/js/src/jit/arm/Lowering-arm.cpp @@ -362,7 +362,7 @@ LIRGeneratorARM::newLTableSwitch(const LAllocation &in, const LDefinition &input LTableSwitchV * LIRGeneratorARM::newLTableSwitchV(MTableSwitch *tableswitch) { - return new(alloc()) LTableSwitchV(temp(), tempFloat(), tableswitch); + return new(alloc()) LTableSwitchV(temp(), tempDouble(), tableswitch); } bool diff --git a/js/src/jit/shared/Lowering-shared-inl.h b/js/src/jit/shared/Lowering-shared-inl.h index 940d346cae9d..fcc6fdc68ca7 100644 --- a/js/src/jit/shared/Lowering-shared-inl.h +++ b/js/src/jit/shared/Lowering-shared-inl.h @@ -149,12 +149,14 @@ LIRGeneratorShared::defineReturn(LInstruction *lir, MDefinition *mir) #endif break; case MIRType_Float32: + lir->setDef(0, LDefinition(vreg, LDefinition::FLOAT32, LFloatReg(ReturnFloatReg))); + break; case MIRType_Double: lir->setDef(0, LDefinition(vreg, LDefinition::DOUBLE, LFloatReg(ReturnFloatReg))); break; default: LDefinition::Type type = LDefinition::TypeFrom(mir->type()); - JS_ASSERT(type != LDefinition::DOUBLE); + JS_ASSERT(type != LDefinition::DOUBLE && type != LDefinition::FLOAT32); lir->setDef(0, LDefinition(vreg, type, LGeneralReg(ReturnReg))); break; } @@ -421,7 +423,13 @@ LIRGeneratorShared::tempFixed(Register reg) } LDefinition -LIRGeneratorShared::tempFloat() +LIRGeneratorShared::tempFloat32() +{ + return temp(LDefinition::FLOAT32); +} + +LDefinition +LIRGeneratorShared::tempDouble() { return temp(LDefinition::DOUBLE); } diff --git a/js/src/jit/shared/Lowering-shared.h b/js/src/jit/shared/Lowering-shared.h index fdfb74276682..35075335af13 100644 --- a/js/src/jit/shared/Lowering-shared.h +++ b/js/src/jit/shared/Lowering-shared.h @@ -104,7 +104,8 @@ class LIRGeneratorShared : public MInstructionVisitorWithDefaults // These create temporary register requests. inline LDefinition temp(LDefinition::Type type = LDefinition::GENERAL, LDefinition::Policy policy = LDefinition::DEFAULT); - inline LDefinition tempFloat(); + inline LDefinition tempFloat32(); + inline LDefinition tempDouble(); inline LDefinition tempCopy(MDefinition *input, uint32_t reusedInput); // Note that the fixed register has a GENERAL type. diff --git a/js/src/jit/shared/Lowering-x86-shared.cpp b/js/src/jit/shared/Lowering-x86-shared.cpp index 8895dba562bc..71d687543dfa 100644 --- a/js/src/jit/shared/Lowering-x86-shared.cpp +++ b/js/src/jit/shared/Lowering-x86-shared.cpp @@ -27,7 +27,7 @@ LIRGeneratorX86Shared::newLTableSwitch(const LAllocation &in, const LDefinition LTableSwitchV * LIRGeneratorX86Shared::newLTableSwitchV(MTableSwitch *tableswitch) { - return new(alloc()) LTableSwitchV(temp(), tempFloat(), temp(), tableswitch); + return new(alloc()) LTableSwitchV(temp(), tempDouble(), temp(), tableswitch); } bool @@ -333,7 +333,7 @@ LIRGeneratorX86Shared::lowerTruncateDToInt32(MTruncateToInt32 *ins) MDefinition *opd = ins->input(); JS_ASSERT(opd->type() == MIRType_Double); - LDefinition maybeTemp = Assembler::HasSSE3() ? LDefinition::BogusTemp() : tempFloat(); + LDefinition maybeTemp = Assembler::HasSSE3() ? LDefinition::BogusTemp() : tempDouble(); return define(new(alloc()) LTruncateDToInt32(useRegister(opd), maybeTemp), ins); } @@ -343,6 +343,6 @@ LIRGeneratorX86Shared::lowerTruncateFToInt32(MTruncateToInt32 *ins) MDefinition *opd = ins->input(); JS_ASSERT(opd->type() == MIRType_Float32); - LDefinition maybeTemp = Assembler::HasSSE3() ? LDefinition::BogusTemp() : tempFloat(); + LDefinition maybeTemp = Assembler::HasSSE3() ? LDefinition::BogusTemp() : tempFloat32(); return define(new(alloc()) LTruncateFToInt32(useRegister(opd), maybeTemp), ins); }