void ShortDataType::AssignToVariable(VariableSymbol* variable) { Instruction* instruction; Parser* parser = g_app->GetParser(); // Allocate register. Register reg = parser->AllocateRegister(this); Register reg16Bit = parser->Register32BitTo16Bit(reg); Register thisReg = parser->AllocateRegister(new IntDataType()); // Pop value into a register. instruction = new Instruction(parser->GetInstructionScope(), OPCODE_POP, parser->GetCurrentToken()); instruction->AddRegisterOperand(reg); // Pop the pointer to the class off the stack. if (variable->VariableType == VT_FIELD) { instruction = new Instruction(parser->GetInstructionScope(), OPCODE_POP, parser->GetCurrentToken()); instruction->AddRegisterOperand(thisReg); } // Assign value to variable. instruction = new Instruction(parser->GetInstructionScope(), OPCODE_MOV, parser->GetCurrentToken()); instruction->AddOperand(parser->GetVariableAccessOperand(variable, 0, thisReg)); instruction->AddRegisterOperand(reg16Bit); // Push "this" variable back into stack. if (variable->VariableType == VT_FIELD) { instruction = new Instruction(parser->GetInstructionScope(), OPCODE_PUSH, parser->GetCurrentToken()); instruction->AddRegisterOperand(thisReg); } // Deallocate register. parser->DeallocateRegister(reg); parser->DeallocateRegister(thisReg); }
void ShortDataType::PushVariableValue(VariableSymbol* variable) { Instruction* instruction; Parser* parser = g_app->GetParser(); // Allocate register. Register reg = parser->AllocateRegister(this); Register thisReg = parser->AllocateRegister(new IntDataType()); // Pop the pointer to the class off the stack. if (variable->VariableType == VT_FIELD) { instruction = new Instruction(parser->GetInstructionScope(), OPCODE_POP, parser->GetCurrentToken()); instruction->AddRegisterOperand(thisReg); } // Move into register so we can pad to 32bit. instruction = new Instruction(parser->GetInstructionScope(), OPCODE_MOVZX, parser->GetCurrentToken()); instruction->AddRegisterOperand(reg); instruction->AddOperand(parser->GetVariableAccessOperand(variable, 0, thisReg)); // Push "this" variable back into stack. if (variable->VariableType == VT_FIELD) { instruction = new Instruction(parser->GetInstructionScope(), OPCODE_PUSH, parser->GetCurrentToken()); instruction->AddRegisterOperand(thisReg); } // Push register onto the stack. instruction = new Instruction(parser->GetInstructionScope(), OPCODE_PUSH, parser->GetCurrentToken()); instruction->AddRegisterOperand(reg); // Deallocate register. parser->DeallocateRegister(reg); parser->DeallocateRegister(thisReg); }