Ignore:
Timestamp:
Nov 29, 2017, 12:12:32 PM (8 years ago)
Author:
[email protected]
Message:

Source/JavaScriptCore:
[MIPS][JSC] Implement MacroAssembler::probe support on MIPS
https://bugs.webkit.org/show_bug.cgi?id=175447

Patch by Stanislav Ocovaj <[email protected]> on 2017-11-29
Reviewed by Carlos Alberto Lopez Perez.

This patch allows DFG JIT to be enabled on MIPS platforms.

  • Sources.txt:
  • assembler/MIPSAssembler.h:

(JSC::MIPSAssembler::lastSPRegister):
(JSC::MIPSAssembler::numberOfSPRegisters):
(JSC::MIPSAssembler::sprName):

  • assembler/MacroAssemblerMIPS.cpp: Added.

(JSC::MacroAssembler::probe):

  • assembler/ProbeContext.cpp:

(JSC::Probe::executeProbe):

  • assembler/ProbeContext.h:

(JSC::Probe::CPUState::pc):

  • assembler/testmasm.cpp:

(JSC::isSpecialGPR):
(JSC::testProbePreservesGPRS):
(JSC::testProbeModifiesStackPointer):
(JSC::testProbeModifiesStackValues):

Source/WTF:
[DFG][MIPS] Enable DFG JIT on MIPS.
https://bugs.webkit.org/show_bug.cgi?id=175447

Patch by Stanislav Ocovaj <[email protected]> on 2017-11-29
Reviewed by Carlos Alberto Lopez Perez.

  • wtf/Platform.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/testmasm.cpp

    • Property svn:executable set to *
    r225271 r225286  
    136136    if (id == ARM64Registers::x18)
    137137        return true;
     138#elif CPU(MIPS)
     139    if (id == MIPSRegisters::zero || id == MIPSRegisters::k0 || id == MIPSRegisters::k1)
     140        return true;
    138141#endif
    139142    return false;
     
    401404            }
    402405            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
     406#if CPU(MIPS)
     407                if (!(id & 1))
     408#endif
    403409                CHECK_EQ(cpu.fpr<uint64_t>(id), testWord64(id));
    404410        });
     
    427433            }
    428434            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
     435#if CPU(MIPS)
     436                if (!(id & 1))
     437#endif
    429438                CHECK_EQ(cpu.fpr<uint64_t>(id), originalState.fpr<uint64_t>(id));
    430439        });
     
    442451    void* originalSP { nullptr };
    443452    void* modifiedSP { nullptr };
     453#if !(CPU(MIPS))
    444454    uintptr_t modifiedFlags { 0 };
     455#endif
    445456   
    446457#if CPU(X86) || CPU(X86_64)
     
    474485            }
    475486
     487#if !(CPU(MIPS))
    476488            originalState.spr(flagsSPR) = cpu.spr(flagsSPR);
    477489            modifiedFlags = originalState.spr(flagsSPR) ^ flagsMask;
    478490            cpu.spr(flagsSPR) = modifiedFlags;
     491#endif
    479492
    480493            originalSP = cpu.sp();
     
    497510            }
    498511            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
     512#if CPU(MIPS)
     513                if (!(id & 1))
     514#endif
    499515                CHECK_EQ(cpu.fpr<uint64_t>(id), testWord64(id));
     516#if !(CPU(MIPS))
    500517            CHECK_EQ(cpu.spr(flagsSPR) & flagsMask, modifiedFlags & flagsMask);
     518#endif
    501519            CHECK_EQ(cpu.sp(), modifiedSP);
    502520        });
     
    513531            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
    514532                cpu.fpr(id) = originalState.fpr(id);
     533#if !(CPU(MIPS))
    515534            cpu.spr(flagsSPR) = originalState.spr(flagsSPR);
     535#endif
    516536            cpu.sp() = originalSP;
    517537        });
     
    527547            }
    528548            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
     549#if CPU(MIPS)
     550                if (!(id & 1))
     551#endif
    529552                CHECK_EQ(cpu.fpr<uint64_t>(id), originalState.fpr<uint64_t>(id));
     553#if !(CPU(MIPS))
    530554            CHECK_EQ(cpu.spr(flagsSPR) & flagsMask, originalState.spr(flagsSPR) & flagsMask);
     555#endif
    531556            CHECK_EQ(cpu.sp(), originalSP);
    532557        });
     
    641666                cpu.fpr(id) = bitwise_cast<double>(testWord64(id));
    642667            }
     668#if !(CPU(MIPS))
    643669            originalState.spr(flagsSPR) = cpu.spr(flagsSPR);
    644670            modifiedFlags = originalState.spr(flagsSPR) ^ flagsMask;
    645671            cpu.spr(flagsSPR) = modifiedFlags;
     672#endif
    646673
    647674            // Ensure that we'll be writing over the regions of the stack where the Probe::State is.
     
    677704            }
    678705            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
     706#if CPU(MIPS)
     707                if (!(id & 1))
     708#endif
    679709                CHECK_EQ(cpu.fpr<uint64_t>(id), testWord64(id));
     710#if !(CPU(MIPS))
    680711            CHECK_EQ(cpu.spr(flagsSPR) & flagsMask, modifiedFlags & flagsMask);
     712#endif
    681713            CHECK_EQ(cpu.sp(), newSP);
    682714
     
    702734            for (auto id = CCallHelpers::firstFPRegister(); id <= CCallHelpers::lastFPRegister(); id = nextID(id))
    703735                cpu.fpr(id) = originalState.fpr(id);
     736#if !(CPU(MIPS))
    704737            cpu.spr(flagsSPR) = originalState.spr(flagsSPR);
     738#endif
    705739            cpu.sp() = originalSP;
    706740        });
Note: See TracChangeset for help on using the changeset viewer.