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