1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 2 * vim: set ts=8 sts=4 et sw=4 tw=99: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef jit_mips64_CodeGenerator_mips64_h 8 #define jit_mips64_CodeGenerator_mips64_h 9 10 #include "jit/mips-shared/CodeGenerator-mips-shared.h" 11 12 namespace js { 13 namespace jit { 14 15 class CodeGeneratorMIPS64 : public CodeGeneratorMIPSShared { 16 protected: testNullEmitBranch(Assembler::Condition cond,const ValueOperand & value,MBasicBlock * ifTrue,MBasicBlock * ifFalse)17 void testNullEmitBranch(Assembler::Condition cond, const ValueOperand& value, 18 MBasicBlock* ifTrue, MBasicBlock* ifFalse) { 19 MOZ_ASSERT(value.valueReg() != SecondScratchReg); 20 masm.splitTag(value.valueReg(), SecondScratchReg); 21 emitBranch(SecondScratchReg, ImmTag(JSVAL_TAG_NULL), cond, ifTrue, ifFalse); 22 } testUndefinedEmitBranch(Assembler::Condition cond,const ValueOperand & value,MBasicBlock * ifTrue,MBasicBlock * ifFalse)23 void testUndefinedEmitBranch(Assembler::Condition cond, 24 const ValueOperand& value, MBasicBlock* ifTrue, 25 MBasicBlock* ifFalse) { 26 MOZ_ASSERT(value.valueReg() != SecondScratchReg); 27 masm.splitTag(value.valueReg(), SecondScratchReg); 28 emitBranch(SecondScratchReg, ImmTag(JSVAL_TAG_UNDEFINED), cond, ifTrue, 29 ifFalse); 30 } testObjectEmitBranch(Assembler::Condition cond,const ValueOperand & value,MBasicBlock * ifTrue,MBasicBlock * ifFalse)31 void testObjectEmitBranch(Assembler::Condition cond, 32 const ValueOperand& value, MBasicBlock* ifTrue, 33 MBasicBlock* ifFalse) { 34 MOZ_ASSERT(value.valueReg() != SecondScratchReg); 35 masm.splitTag(value.valueReg(), SecondScratchReg); 36 emitBranch(SecondScratchReg, ImmTag(JSVAL_TAG_OBJECT), cond, ifTrue, 37 ifFalse); 38 } 39 40 template <typename T> 41 void emitWasmLoadI64(T* ins); 42 template <typename T> 43 void emitWasmStoreI64(T* ins); 44 45 public: 46 void visitCompareB(LCompareB* lir); 47 void visitCompareBAndBranch(LCompareBAndBranch* lir); 48 void visitCompareBitwise(LCompareBitwise* lir); 49 void visitCompareBitwiseAndBranch(LCompareBitwiseAndBranch* lir); 50 void visitCompareI64(LCompareI64* lir); 51 void visitCompareI64AndBranch(LCompareI64AndBranch* lir); 52 void visitDivOrModI64(LDivOrModI64* lir); 53 void visitUDivOrModI64(LUDivOrModI64* lir); 54 void visitWasmLoadI64(LWasmLoadI64* lir); 55 void visitWasmUnalignedLoadI64(LWasmUnalignedLoadI64* lir); 56 void visitWasmStoreI64(LWasmStoreI64* ins); 57 void visitWasmUnalignedStoreI64(LWasmUnalignedStoreI64* ins); 58 void visitWasmSelectI64(LWasmSelectI64* ins); 59 void visitWasmReinterpretFromI64(LWasmReinterpretFromI64* lir); 60 void visitWasmReinterpretToI64(LWasmReinterpretToI64* lir); 61 void visitExtendInt32ToInt64(LExtendInt32ToInt64* lir); 62 void visitWrapInt64ToInt32(LWrapInt64ToInt32* lir); 63 void visitSignExtendInt64(LSignExtendInt64* ins); 64 void visitClzI64(LClzI64* lir); 65 void visitCtzI64(LCtzI64* lir); 66 void visitNotI64(LNotI64* lir); 67 void visitWasmTruncateToInt64(LWasmTruncateToInt64* lir); 68 void visitInt64ToFloatingPoint(LInt64ToFloatingPoint* lir); 69 void visitTestI64AndBranch(LTestI64AndBranch* lir); 70 71 // Out of line visitors. 72 void visitOutOfLineBailout(OutOfLineBailout* ool); 73 74 protected: 75 ValueOperand ToValue(LInstruction* ins, size_t pos); 76 ValueOperand ToTempValue(LInstruction* ins, size_t pos); 77 78 // Functions for LTestVAndBranch. 79 void splitTagForTest(const ValueOperand& value, ScratchTagScope& tag); 80 81 public: CodeGeneratorMIPS64(MIRGenerator * gen,LIRGraph * graph,MacroAssembler * masm)82 CodeGeneratorMIPS64(MIRGenerator* gen, LIRGraph* graph, MacroAssembler* masm) 83 : CodeGeneratorMIPSShared(gen, graph, masm) {} 84 85 public: 86 void visitBox(LBox* box); 87 void visitUnbox(LUnbox* unbox); 88 89 void setReturnDoubleRegs(LiveRegisterSet* regs); 90 }; 91 92 typedef CodeGeneratorMIPS64 CodeGeneratorSpecific; 93 94 } // namespace jit 95 } // namespace js 96 97 #endif /* jit_mips64_CodeGenerator_mips64_h */ 98