From 4e1ea552f1b1502cb4609d14dd2a71c20b101ed8 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Wed, 13 Feb 2013 20:59:11 +0000 Subject: [PATCH] More VM callable functions --- src/pim/Generator.cpp | 9 +-------- src/pim/Machine.cpp | 2 +- src/pim/Parser.cpp | 14 +++++--------- src/pim/X86Native.cpp | 6 ++++-- src/simulation/Simulation.h | 2 +- 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/pim/Generator.cpp b/src/pim/Generator.cpp index 49d59ea61..f2f013f50 100644 --- a/src/pim/Generator.cpp +++ b/src/pim/Generator.cpp @@ -36,19 +36,16 @@ namespace pim void Generator::writeOpcode(int opcode) { programCounter++; - printf("Opcode: %d\n", opcode); program.push_back(opcode); } void Generator::writeConstant(std::string constant) { - printf("Constant: %s\n", constant.c_str()); writeConstant(format::StringToNumber(constant)); } void Generator::writeConstant(int constant) { - printf("Constant: %d\n", constant); program.push_back(constant & 0xFF); program.push_back((constant>>8) & 0xFF); program.push_back((constant>>16) & 0xFF); @@ -57,7 +54,6 @@ namespace pim void Generator::writeConstantPlaceholderOffset(int value, int * offset) { - printf("Constant: %d\n", value); valueOffsetPlaceholders.push_back(ValueOffsetPlaceholder(program.size(), std::pair(value, offset))); program.push_back(0); program.push_back(0); @@ -67,7 +63,6 @@ namespace pim void Generator::writeConstantPlaceholder(std::string label) { - printf("Constant: %s\n", label.c_str()); placeholders.push_back(Placeholder(program.size(), label)); program.push_back(0); program.push_back(0); @@ -77,7 +72,6 @@ namespace pim void Generator::writeConstantPlaceholder(int * value) { - printf("Constant: %p\n", value); valuePlaceholders.push_back(ValuePlaceholder(program.size(), value)); program.push_back(0); program.push_back(0); @@ -87,7 +81,6 @@ namespace pim void Generator::writeConstantPropertyPlaceholder(std::string property) { - printf("Constant: %s\n", property.c_str()); propertyPlaceholders.push_back(PropertyPlaceholder(program.size(), property)); program.push_back(0); program.push_back(0); @@ -97,7 +90,6 @@ namespace pim void Generator::writeConstantMacroPlaceholder(std::string macro) { - printf("Constant: %s\n", macro.c_str()); macroPlaceholders.push_back(MacroPlaceholder(program.size(), macro)); program.push_back(0); program.push_back(0); @@ -710,6 +702,7 @@ namespace pim { popType(1); writeOpcode(Opcode::Kill); + pushType(DataType::Integer); output << "kill" << std::endl; } diff --git a/src/pim/Machine.cpp b/src/pim/Machine.cpp index 28e15ea3e..8d82a4a88 100644 --- a/src/pim/Machine.cpp +++ b/src/pim/Machine.cpp @@ -272,7 +272,7 @@ namespace pim tempInt |= programData[programPosition+3] << 24; - std::cout << "Got integer " << tempInt << std::endl; + //std::cout << "Got integer " << tempInt << std::endl; if(instruction.Opcode == Opcode::LoadProperty || instruction.Opcode == Opcode::StoreProperty) { diff --git a/src/pim/Parser.cpp b/src/pim/Parser.cpp index 2474cf66e..7ef0ec141 100644 --- a/src/pim/Parser.cpp +++ b/src/pim/Parser.cpp @@ -406,10 +406,6 @@ namespace pim generator->ScopeLabel(loopLabel+"Next"); - - - - //Check X generator->LoadVariable(xVar); generator->LoadVariable(xMax); @@ -643,7 +639,11 @@ namespace pim void Parser::variableValue() { std::string variable = token.Source; - if(accept(Token::Identifier)) + if(look(Token::CreateSymbol) || look(Token::KillSymbol) || look(Token::GetSymbol) || look(Token::TransformSymbol)) + { + particleAction(); + } + else if(accept(Token::Identifier)) { if(look(Token::LeftBracket)) { @@ -669,10 +669,6 @@ namespace pim { generator->RTConstant(variable); } - else - { - particleAction(); - } } bool Parser::accept(int symbol) diff --git a/src/pim/X86Native.cpp b/src/pim/X86Native.cpp index 7d29a0d99..38961bf53 100644 --- a/src/pim/X86Native.cpp +++ b/src/pim/X86Native.cpp @@ -186,8 +186,10 @@ namespace pim } break; case Opcode::Kill: - //sim->kill_part(PSPop().Integer); - //PSPush((Word)0); + emit("8B 06"); //mov eax, [esi] + emit("50"); //push eax + emitCall((intptr_t)sim, (intptr_t)((void*)&Simulation::kill_part), 4); + emit("C7 06 00 00 00 00"); //mov [esi], eax break; case Opcode::LoadProperty: { diff --git a/src/simulation/Simulation.h b/src/simulation/Simulation.h index a67b74a53..a84640e2e 100644 --- a/src/simulation/Simulation.h +++ b/src/simulation/Simulation.h @@ -140,7 +140,7 @@ public: void init_can_move(); void create_cherenkov_photon(int pp); void create_gain_photon(int pp); - TPT_NO_INLINE void kill_part(int i); + TPT_NO_INLINE TPT_VM_CALLABLE void kill_part(int i); int flood_prop(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype); int flood_prop_2(int x, int y, size_t propoffset, void * propvalue, StructProperty::PropertyType proptype, int parttype, char * bitmap); int flood_water(int x, int y, int i, int originaly, int check);