Native code generation for put_global_var instruction on X86_64 platform
Hi! Trying to understand how put_global_var is translated to x86_64 native code. But still have several questions Lets say i have following bytecode instruction put_global_var 4, Int32: 6(@k1) Lets look at the source code void JIT::emit_op_put_global_var(Instruction* currentInstruction) { JSGlobalObject* globalObject = m_codeBlock->globalObject(); emitGetVirtualRegister(currentInstruction[2].u.operand, regT0); move(TrustedImmPtr(globalObject), regT1); loadPtr(Address(regT1, JSVariableObject::offsetOfRegisters()), regT1); storePtr(regT0, Address(regT1, currentInstruction[1].u.operand * sizeof(Register))); emitWriteBarrier(globalObject, regT0, regT2, ShouldFilterImmediates, WriteBarrierForVariableAccess); } 1. What is mean of currentInstruction[2]? As I Understand it's holds information about "Int32: 6(@k1)". Am I right?? 2. As I understand after emitGetVirtualRegister(currentInstruction[2].u.operand, regT0) we have encoded value of "Int32: 6(@k1)" in regT0. 3. Cant't understad mean of move(TrustedImmPtr(globalObject), regT1). globalObject is a pretty big class. Can't figure out what is happening here 4. loadPtr(Address(regT1, JSVariableObject::offsetOfRegisters()), regT1); // What the mean of JSVariableObject::offsetOfRegisters()?? 5. storePtr(regT0, Address(regT1, currentInstruction[1].u.operand * sizeof(Register))); // As I understand currentInstruction[1].u.operand holds address where to put my constant, i.e "4". Am I right? And question about mov instruction on x86_64 platform JSC::X86Assembler::movq_i64r void movq_i64r(int64_t imm, RegisterID dst) { m_formatter.oneByteOp64(OP_MOV_EAXIv, dst); m_formatter.immediate64(imm); } How will look appropriate assembly for this code?? Thanks for attention!!
participants (1)
-
wingoog moon