Lowering.h (2849B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 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_Lowering_h 8 #define jit_Lowering_h 9 10 // This file declares the structures that are used for attaching LIR to a 11 // MIRGraph. 12 13 #include "jit/LIR.h" 14 #if defined(JS_CODEGEN_X86) 15 # include "jit/x86/Lowering-x86.h" 16 #elif defined(JS_CODEGEN_X64) 17 # include "jit/x64/Lowering-x64.h" 18 #elif defined(JS_CODEGEN_ARM) 19 # include "jit/arm/Lowering-arm.h" 20 #elif defined(JS_CODEGEN_ARM64) 21 # include "jit/arm64/Lowering-arm64.h" 22 #elif defined(JS_CODEGEN_MIPS64) 23 # include "jit/mips64/Lowering-mips64.h" 24 #elif defined(JS_CODEGEN_LOONG64) 25 # include "jit/loong64/Lowering-loong64.h" 26 #elif defined(JS_CODEGEN_RISCV64) 27 # include "jit/riscv64/Lowering-riscv64.h" 28 #elif defined(JS_CODEGEN_WASM32) 29 # include "jit/wasm32/Lowering-wasm32.h" 30 #elif defined(JS_CODEGEN_NONE) 31 # include "jit/none/Lowering-none.h" 32 #else 33 # error "Unknown architecture!" 34 #endif 35 36 namespace js { 37 namespace jit { 38 39 class LIRGenerator final : public LIRGeneratorSpecific { 40 void updateResumeState(MInstruction* ins); 41 void updateResumeState(MBasicBlock* block); 42 43 // The maximum depth, for framesizeclass determination. 44 uint32_t maxargslots_; 45 46 public: 47 LIRGenerator(MIRGenerator* gen, MIRGraph& graph, LIRGraph& lirGraph) 48 : LIRGeneratorSpecific(gen, graph, lirGraph), maxargslots_(0) {} 49 50 [[nodiscard]] bool generate(); 51 52 private: 53 LBoxAllocation useBoxFixedAtStart(MDefinition* mir, Register reg1, 54 Register reg2) { 55 return useBoxFixed(mir, reg1, reg2, /* useAtStart = */ true); 56 } 57 58 LBoxAllocation useBoxFixedAtStart(MDefinition* mir, ValueOperand op); 59 LBoxAllocation useBoxAtStart(MDefinition* mir, 60 LUse::Policy policy = LUse::REGISTER); 61 62 void lowerBitOp(JSOp op, MBinaryInstruction* ins); 63 void lowerShiftOp(JSOp op, MShiftInstruction* ins); 64 bool definePhis(); 65 66 template <typename T> 67 [[nodiscard]] bool lowerCallArguments(T* call); 68 69 friend class LIRGeneratorShared; 70 void visitInstructionDispatch(MInstruction* ins); 71 72 void visitReturnImpl(MDefinition* def, bool isGenerator = false); 73 74 [[nodiscard]] bool visitInstruction(MInstruction* ins); 75 [[nodiscard]] bool visitBlock(MBasicBlock* block); 76 77 #define MIR_OP(op) void visit##op(M##op* ins); 78 MIR_OPCODE_LIST(MIR_OP) 79 #undef MIR_OP 80 81 template <class MWasmCallT> 82 void visitWasmCall(MWasmCallT ins); 83 84 WasmRefIsSubtypeDefs useWasmRefIsSubtype(wasm::RefType destType, 85 MDefinition* superSTV); 86 }; 87 88 } // namespace jit 89 } // namespace js 90 91 #endif /* jit_Lowering_h */