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_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_MIPS32) 23 #include "jit/mips32/Lowering-mips32.h" 24 #elif defined(JS_CODEGEN_MIPS64) 25 #include "jit/mips64/Lowering-mips64.h" 26 #elif defined(JS_CODEGEN_NONE) 27 #include "jit/none/Lowering-none.h" 28 #else 29 #error "Unknown architecture!" 30 #endif 31 32 namespace js { 33 namespace jit { 34 35 class LIRGenerator : public LIRGeneratorSpecific { 36 void updateResumeState(MInstruction* ins); 37 void updateResumeState(MBasicBlock* block); 38 39 // The maximum depth, for framesizeclass determination. 40 uint32_t maxargslots_; 41 42 public: LIRGenerator(MIRGenerator * gen,MIRGraph & graph,LIRGraph & lirGraph)43 LIRGenerator(MIRGenerator* gen, MIRGraph& graph, LIRGraph& lirGraph) 44 : LIRGeneratorSpecific(gen, graph, lirGraph), maxargslots_(0) {} 45 46 MOZ_MUST_USE bool generate(); 47 48 private: useBoxFixedAtStart(MDefinition * mir,Register reg1,Register reg2)49 LBoxAllocation useBoxFixedAtStart(MDefinition* mir, Register reg1, 50 Register reg2) { 51 return useBoxFixed(mir, reg1, reg2, /* useAtStart = */ true); 52 } 53 54 LBoxAllocation useBoxFixedAtStart(MDefinition* mir, ValueOperand op); 55 LBoxAllocation useBoxAtStart(MDefinition* mir, 56 LUse::Policy policy = LUse::REGISTER); 57 58 void lowerBitOp(JSOp op, MInstruction* ins); 59 void lowerShiftOp(JSOp op, MShiftInstruction* ins); 60 void lowerBinaryV(JSOp op, MBinaryInstruction* ins); 61 void definePhis(); 62 63 MOZ_MUST_USE bool lowerCallArguments(MCall* call); 64 65 template <typename LClass> 66 LInstruction* lowerWasmCall(MWasmCall* ins, bool needsBoundsCheck); 67 68 public: 69 MOZ_MUST_USE bool visitInstruction(MInstruction* ins); 70 MOZ_MUST_USE bool visitBlock(MBasicBlock* block); 71 72 // Visitor hooks are explicit, to give CPU-specific versions a chance to 73 // intercept without a bunch of explicit gunk in the .cpp. 74 void visitCloneLiteral(MCloneLiteral* ins) override; 75 void visitParameter(MParameter* param) override; 76 void visitCallee(MCallee* callee) override; 77 void visitIsConstructing(MIsConstructing* ins) override; 78 void visitGoto(MGoto* ins) override; 79 void visitTableSwitch(MTableSwitch* tableswitch) override; 80 void visitNewArray(MNewArray* ins) override; 81 void visitNewArrayCopyOnWrite(MNewArrayCopyOnWrite* ins) override; 82 void visitNewArrayDynamicLength(MNewArrayDynamicLength* ins) override; 83 void visitNewIterator(MNewIterator* ins) override; 84 void visitNewTypedArray(MNewTypedArray* ins) override; 85 void visitNewTypedArrayDynamicLength( 86 MNewTypedArrayDynamicLength* ins) override; 87 void visitNewObject(MNewObject* ins) override; 88 void visitNewTypedObject(MNewTypedObject* ins) override; 89 void visitNewNamedLambdaObject(MNewNamedLambdaObject* ins) override; 90 void visitNewCallObject(MNewCallObject* ins) override; 91 void visitNewSingletonCallObject(MNewSingletonCallObject* ins) override; 92 void visitNewStringObject(MNewStringObject* ins) override; 93 void visitNewDerivedTypedObject(MNewDerivedTypedObject* ins) override; 94 void visitInitElem(MInitElem* ins) override; 95 void visitInitElemGetterSetter(MInitElemGetterSetter* ins) override; 96 void visitMutateProto(MMutateProto* ins) override; 97 void visitInitPropGetterSetter(MInitPropGetterSetter* ins) override; 98 void visitCheckOverRecursed(MCheckOverRecursed* ins) override; 99 void visitDefVar(MDefVar* ins) override; 100 void visitDefLexical(MDefLexical* ins) override; 101 void visitDefFun(MDefFun* ins) override; 102 void visitCreateThisWithTemplate(MCreateThisWithTemplate* ins) override; 103 void visitCreateThisWithProto(MCreateThisWithProto* ins) override; 104 void visitCreateThis(MCreateThis* ins) override; 105 void visitCreateArgumentsObject(MCreateArgumentsObject* ins) override; 106 void visitGetArgumentsObjectArg(MGetArgumentsObjectArg* ins) override; 107 void visitSetArgumentsObjectArg(MSetArgumentsObjectArg* ins) override; 108 void visitReturnFromCtor(MReturnFromCtor* ins) override; 109 void visitComputeThis(MComputeThis* ins) override; 110 void visitImplicitThis(MImplicitThis* ins) override; 111 void visitCall(MCall* call) override; 112 void visitApplyArgs(MApplyArgs* apply) override; 113 void visitApplyArray(MApplyArray* apply) override; 114 void visitBail(MBail* bail) override; 115 void visitUnreachable(MUnreachable* unreachable) override; 116 void visitEncodeSnapshot(MEncodeSnapshot* ins) override; 117 void visitAssertFloat32(MAssertFloat32* ins) override; 118 void visitAssertRecoveredOnBailout(MAssertRecoveredOnBailout* ins) override; 119 void visitGetDynamicName(MGetDynamicName* ins) override; 120 void visitCallDirectEval(MCallDirectEval* ins) override; 121 void visitTest(MTest* test) override; 122 void visitGotoWithFake(MGotoWithFake* ins) override; 123 void visitFunctionDispatch(MFunctionDispatch* ins) override; 124 void visitObjectGroupDispatch(MObjectGroupDispatch* ins) override; 125 void visitCompare(MCompare* comp) override; 126 void visitSameValue(MSameValue* comp) override; 127 void visitTypeOf(MTypeOf* ins) override; 128 void visitToAsync(MToAsync* ins) override; 129 void visitToAsyncGen(MToAsyncGen* ins) override; 130 void visitToAsyncIter(MToAsyncIter* ins) override; 131 void visitToId(MToId* ins) override; 132 void visitBitNot(MBitNot* ins) override; 133 void visitBitAnd(MBitAnd* ins) override; 134 void visitBitOr(MBitOr* ins) override; 135 void visitBitXor(MBitXor* ins) override; 136 void visitLsh(MLsh* ins) override; 137 void visitRsh(MRsh* ins) override; 138 void visitUrsh(MUrsh* ins) override; 139 void visitSignExtendInt32(MSignExtendInt32* ins) override; 140 void visitRotate(MRotate* ins) override; 141 void visitFloor(MFloor* ins) override; 142 void visitCeil(MCeil* ins) override; 143 void visitRound(MRound* ins) override; 144 void visitNearbyInt(MNearbyInt* ins) override; 145 void visitMinMax(MMinMax* ins) override; 146 void visitAbs(MAbs* ins) override; 147 void visitClz(MClz* ins) override; 148 void visitCtz(MCtz* ins) override; 149 void visitSqrt(MSqrt* ins) override; 150 void visitPopcnt(MPopcnt* ins) override; 151 void visitAtan2(MAtan2* ins) override; 152 void visitHypot(MHypot* ins) override; 153 void visitPow(MPow* ins) override; 154 void visitMathFunction(MMathFunction* ins) override; 155 void visitAdd(MAdd* ins) override; 156 void visitSub(MSub* ins) override; 157 void visitMul(MMul* ins) override; 158 void visitDiv(MDiv* ins) override; 159 void visitMod(MMod* ins) override; 160 void visitConcat(MConcat* ins) override; 161 void visitCharCodeAt(MCharCodeAt* ins) override; 162 void visitFromCharCode(MFromCharCode* ins) override; 163 void visitFromCodePoint(MFromCodePoint* ins) override; 164 void visitStringConvertCase(MStringConvertCase* ins) override; 165 void visitSinCos(MSinCos* ins) override; 166 void visitStringSplit(MStringSplit* ins) override; 167 void visitStart(MStart* start) override; 168 void visitOsrEntry(MOsrEntry* entry) override; 169 void visitNop(MNop* nop) override; 170 void visitLimitedTruncate(MLimitedTruncate* nop) override; 171 void visitOsrValue(MOsrValue* value) override; 172 void visitOsrEnvironmentChain(MOsrEnvironmentChain* object) override; 173 void visitOsrReturnValue(MOsrReturnValue* value) override; 174 void visitOsrArgumentsObject(MOsrArgumentsObject* object) override; 175 void visitToDouble(MToDouble* convert) override; 176 void visitToFloat32(MToFloat32* convert) override; 177 void visitToNumberInt32(MToNumberInt32* convert) override; 178 void visitTruncateToInt32(MTruncateToInt32* truncate) override; 179 void visitWasmTruncateToInt32(MWasmTruncateToInt32* truncate) override; 180 void visitWrapInt64ToInt32(MWrapInt64ToInt32* ins) override; 181 void visitToString(MToString* convert) override; 182 void visitToObject(MToObject* convert) override; 183 void visitToObjectOrNull(MToObjectOrNull* convert) override; 184 void visitRegExp(MRegExp* ins) override; 185 void visitRegExpMatcher(MRegExpMatcher* ins) override; 186 void visitRegExpSearcher(MRegExpSearcher* ins) override; 187 void visitRegExpTester(MRegExpTester* ins) override; 188 void visitRegExpPrototypeOptimizable( 189 MRegExpPrototypeOptimizable* ins) override; 190 void visitRegExpInstanceOptimizable(MRegExpInstanceOptimizable* ins) override; 191 void visitGetFirstDollarIndex(MGetFirstDollarIndex* ins) override; 192 void visitStringReplace(MStringReplace* ins) override; 193 void visitBinarySharedStub(MBinarySharedStub* ins) override; 194 void visitUnarySharedStub(MUnarySharedStub* ins) override; 195 void visitNullarySharedStub(MNullarySharedStub* ins) override; 196 void visitClassConstructor(MClassConstructor* ins) override; 197 void visitLambda(MLambda* ins) override; 198 void visitLambdaArrow(MLambdaArrow* ins) override; 199 void visitSetFunName(MSetFunName* ins) override; 200 void visitNewLexicalEnvironmentObject( 201 MNewLexicalEnvironmentObject* ins) override; 202 void visitCopyLexicalEnvironmentObject( 203 MCopyLexicalEnvironmentObject* ins) override; 204 void visitKeepAliveObject(MKeepAliveObject* ins) override; 205 void visitSlots(MSlots* ins) override; 206 void visitElements(MElements* ins) override; 207 void visitConstantElements(MConstantElements* ins) override; 208 void visitConvertElementsToDoubles(MConvertElementsToDoubles* ins) override; 209 void visitMaybeToDoubleElement(MMaybeToDoubleElement* ins) override; 210 void visitMaybeCopyElementsForWrite(MMaybeCopyElementsForWrite* ins) override; 211 void visitLoadSlot(MLoadSlot* ins) override; 212 void visitLoadFixedSlotAndUnbox(MLoadFixedSlotAndUnbox* ins) override; 213 void visitFunctionEnvironment(MFunctionEnvironment* ins) override; 214 void visitHomeObject(MHomeObject* ins) override; 215 void visitHomeObjectSuperBase(MHomeObjectSuperBase* ins) override; 216 void visitInterruptCheck(MInterruptCheck* ins) override; 217 void visitWasmTrap(MWasmTrap* ins) override; 218 void visitWasmReinterpret(MWasmReinterpret* ins) override; 219 void visitStoreSlot(MStoreSlot* ins) override; 220 void visitFilterTypeSet(MFilterTypeSet* ins) override; 221 void visitTypeBarrier(MTypeBarrier* ins) override; 222 void visitPostWriteBarrier(MPostWriteBarrier* ins) override; 223 void visitPostWriteElementBarrier(MPostWriteElementBarrier* ins) override; 224 void visitArrayLength(MArrayLength* ins) override; 225 void visitSetArrayLength(MSetArrayLength* ins) override; 226 void visitGetNextEntryForIterator(MGetNextEntryForIterator* ins) override; 227 void visitTypedArrayLength(MTypedArrayLength* ins) override; 228 void visitTypedArrayElements(MTypedArrayElements* ins) override; 229 void visitSetDisjointTypedElements(MSetDisjointTypedElements* ins) override; 230 void visitTypedObjectElements(MTypedObjectElements* ins) override; 231 void visitSetTypedObjectOffset(MSetTypedObjectOffset* ins) override; 232 void visitTypedObjectDescr(MTypedObjectDescr* ins) override; 233 void visitInitializedLength(MInitializedLength* ins) override; 234 void visitSetInitializedLength(MSetInitializedLength* ins) override; 235 void visitNot(MNot* ins) override; 236 void visitBoundsCheck(MBoundsCheck* ins) override; 237 void visitBoundsCheckLower(MBoundsCheckLower* ins) override; 238 void visitSpectreMaskIndex(MSpectreMaskIndex* ins) override; 239 void visitLoadElement(MLoadElement* ins) override; 240 void visitLoadElementHole(MLoadElementHole* ins) override; 241 void visitLoadUnboxedObjectOrNull(MLoadUnboxedObjectOrNull* ins) override; 242 void visitLoadUnboxedString(MLoadUnboxedString* ins) override; 243 void visitLoadElementFromState(MLoadElementFromState* ins) override; 244 void visitStoreElement(MStoreElement* ins) override; 245 void visitStoreElementHole(MStoreElementHole* ins) override; 246 void visitFallibleStoreElement(MFallibleStoreElement* ins) override; 247 void visitStoreUnboxedObjectOrNull(MStoreUnboxedObjectOrNull* ins) override; 248 void visitStoreUnboxedString(MStoreUnboxedString* ins) override; 249 void visitConvertUnboxedObjectToNative( 250 MConvertUnboxedObjectToNative* ins) override; 251 void visitEffectiveAddress(MEffectiveAddress* ins) override; 252 void visitArrayPopShift(MArrayPopShift* ins) override; 253 void visitArrayPush(MArrayPush* ins) override; 254 void visitArraySlice(MArraySlice* ins) override; 255 void visitArrayJoin(MArrayJoin* ins) override; 256 void visitLoadUnboxedScalar(MLoadUnboxedScalar* ins) override; 257 void visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole* ins) override; 258 void visitStoreUnboxedScalar(MStoreUnboxedScalar* ins) override; 259 void visitStoreTypedArrayElementHole( 260 MStoreTypedArrayElementHole* ins) override; 261 void visitClampToUint8(MClampToUint8* ins) override; 262 void visitLoadFixedSlot(MLoadFixedSlot* ins) override; 263 void visitStoreFixedSlot(MStoreFixedSlot* ins) override; 264 void visitGetPropSuperCache(MGetPropSuperCache* ins) override; 265 void visitGetPropertyCache(MGetPropertyCache* ins) override; 266 void visitGetPropertyPolymorphic(MGetPropertyPolymorphic* ins) override; 267 void visitSetPropertyPolymorphic(MSetPropertyPolymorphic* ins) override; 268 void visitBindNameCache(MBindNameCache* ins) override; 269 void visitCallBindVar(MCallBindVar* ins) override; 270 void visitGuardObjectIdentity(MGuardObjectIdentity* ins) override; 271 void visitGuardShape(MGuardShape* ins) override; 272 void visitGuardObjectGroup(MGuardObjectGroup* ins) override; 273 void visitGuardObject(MGuardObject* ins) override; 274 void visitGuardString(MGuardString* ins) override; 275 void visitGuardReceiverPolymorphic(MGuardReceiverPolymorphic* ins) override; 276 void visitGuardUnboxedExpando(MGuardUnboxedExpando* ins) override; 277 void visitLoadUnboxedExpando(MLoadUnboxedExpando* ins) override; 278 void visitPolyInlineGuard(MPolyInlineGuard* ins) override; 279 void visitAssertRange(MAssertRange* ins) override; 280 void visitCallGetProperty(MCallGetProperty* ins) override; 281 void visitDeleteProperty(MDeleteProperty* ins) override; 282 void visitDeleteElement(MDeleteElement* ins) override; 283 void visitGetNameCache(MGetNameCache* ins) override; 284 void visitCallGetIntrinsicValue(MCallGetIntrinsicValue* ins) override; 285 void visitCallGetElement(MCallGetElement* ins) override; 286 void visitCallSetElement(MCallSetElement* ins) override; 287 void visitCallInitElementArray(MCallInitElementArray* ins) override; 288 void visitSetPropertyCache(MSetPropertyCache* ins) override; 289 void visitCallSetProperty(MCallSetProperty* ins) override; 290 void visitGetIteratorCache(MGetIteratorCache* ins) override; 291 void visitIteratorMore(MIteratorMore* ins) override; 292 void visitIsNoIter(MIsNoIter* ins) override; 293 void visitIteratorEnd(MIteratorEnd* ins) override; 294 void visitStringLength(MStringLength* ins) override; 295 void visitArgumentsLength(MArgumentsLength* ins) override; 296 void visitGetFrameArgument(MGetFrameArgument* ins) override; 297 void visitSetFrameArgument(MSetFrameArgument* ins) override; 298 void visitRunOncePrologue(MRunOncePrologue* ins) override; 299 void visitRest(MRest* ins) override; 300 void visitThrow(MThrow* ins) override; 301 void visitInCache(MInCache* ins) override; 302 void visitInArray(MInArray* ins) override; 303 void visitHasOwnCache(MHasOwnCache* ins) override; 304 void visitInstanceOf(MInstanceOf* ins) override; 305 void visitInstanceOfCache(MInstanceOfCache* ins) override; 306 void visitIsCallable(MIsCallable* ins) override; 307 void visitIsConstructor(MIsConstructor* ins) override; 308 void visitIsArray(MIsArray* ins) override; 309 void visitIsTypedArray(MIsTypedArray* ins) override; 310 void visitIsObject(MIsObject* ins) override; 311 void visitHasClass(MHasClass* ins) override; 312 void visitGuardToClass(MGuardToClass* ins) override; 313 void visitObjectClassToString(MObjectClassToString* ins) override; 314 void visitWasmAddOffset(MWasmAddOffset* ins) override; 315 void visitWasmLoadTls(MWasmLoadTls* ins) override; 316 void visitWasmBoundsCheck(MWasmBoundsCheck* ins) override; 317 void visitWasmAlignmentCheck(MWasmAlignmentCheck* ins) override; 318 void visitWasmLoadGlobalVar(MWasmLoadGlobalVar* ins) override; 319 void visitWasmStoreGlobalVar(MWasmStoreGlobalVar* ins) override; 320 void visitWasmParameter(MWasmParameter* ins) override; 321 void visitWasmReturn(MWasmReturn* ins) override; 322 void visitWasmReturnVoid(MWasmReturnVoid* ins) override; 323 void visitWasmStackArg(MWasmStackArg* ins) override; 324 void visitWasmCall(MWasmCall* ins) override; 325 void visitSetDOMProperty(MSetDOMProperty* ins) override; 326 void visitGetDOMProperty(MGetDOMProperty* ins) override; 327 void visitGetDOMMember(MGetDOMMember* ins) override; 328 void visitRecompileCheck(MRecompileCheck* ins) override; 329 void visitSimdBox(MSimdBox* ins) override; 330 void visitSimdUnbox(MSimdUnbox* ins) override; 331 void visitSimdUnaryArith(MSimdUnaryArith* ins) override; 332 void visitSimdBinaryComp(MSimdBinaryComp* ins) override; 333 void visitSimdBinaryBitwise(MSimdBinaryBitwise* ins) override; 334 void visitSimdShift(MSimdShift* ins) override; 335 void visitSimdConstant(MSimdConstant* ins) override; 336 void visitSimdConvert(MSimdConvert* ins) override; 337 void visitSimdReinterpretCast(MSimdReinterpretCast* ins) override; 338 void visitSimdAllTrue(MSimdAllTrue* ins) override; 339 void visitSimdAnyTrue(MSimdAnyTrue* ins) override; 340 void visitPhi(MPhi* ins) override; 341 void visitBeta(MBeta* ins) override; 342 void visitObjectState(MObjectState* ins) override; 343 void visitArrayState(MArrayState* ins) override; 344 void visitArgumentState(MArgumentState* ins) override; 345 void visitUnknownValue(MUnknownValue* ins) override; 346 void visitLexicalCheck(MLexicalCheck* ins) override; 347 void visitThrowRuntimeLexicalError(MThrowRuntimeLexicalError* ins) override; 348 void visitGlobalNameConflictsCheck(MGlobalNameConflictsCheck* ins) override; 349 void visitDebugger(MDebugger* ins) override; 350 void visitNewTarget(MNewTarget* ins) override; 351 void visitArrowNewTarget(MArrowNewTarget* ins) override; 352 void visitNaNToZero(MNaNToZero* ins) override; 353 void visitAtomicIsLockFree(MAtomicIsLockFree* ins) override; 354 void visitGuardSharedTypedArray(MGuardSharedTypedArray* ins) override; 355 void visitCheckReturn(MCheckReturn* ins) override; 356 void visitCheckIsObj(MCheckIsObj* ins) override; 357 void visitCheckIsCallable(MCheckIsCallable* ins) override; 358 void visitCheckObjCoercible(MCheckObjCoercible* ins) override; 359 void visitDebugCheckSelfHosted(MDebugCheckSelfHosted* ins) override; 360 void visitFinishBoundFunctionInit(MFinishBoundFunctionInit* ins) override; 361 void visitIsPackedArray(MIsPackedArray* ins) override; 362 void visitGetPrototypeOf(MGetPrototypeOf* ins) override; 363 }; 364 365 } // namespace jit 366 } // namespace js 367 368 #endif /* jit_Lowering_h */ 369