int CodeGen(tnode* t) { int r,r1,r2; int value; int loc,l1,l2; //r is the root of AST //returntype of CodeGen is int that is it returns the register Number switch(t->NODETYPE) { case NUM: value=t->val; r=getReg(); fprintf(fp,"MOV R%d, %d\n",r,value); return r; break; case ID: loc=t->var-'a'; r=getReg(); fprintf(fp, "MOV R%d, [%d]\n",r,loc); return r; break; case PLUS: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "ADD R%d, R%d\n",r1,r2); freeReg(); return r1; break; case MINUS: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "SUB R%d, R%d\n",r1,r2); freeReg(); return r1; break; case MUL: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "MUL R%d, R%d\n",r1,r2); freeReg(); return r1; break; case DIV: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "DIV R%d, R%d\n",r1,r2); freeReg(); return r1; break; case MOD: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "MOD R%d, R%d\n",r1,r2); freeReg(); return r1; break; case LT: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "LT R%d, R%d\n",r1,r2); freeReg(); return r1; break; case GT: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "GT R%d, R%d\n",r1,r2); freeReg(); return r1; break; case EQ: r1=CodeGen(t->left); r2=CodeGen(t->right); fprintf(fp, "EQ R%d, R%d\n",r1,r2); freeReg(); return r1; break; case EQUALS: r1=getBinding(t->left); r2=CodeGen(t->right); fprintf(fp, "MOV [R%d], R%d\n",r1,r2); freeReg(); freeReg(); return 0; break; case READ: r=getBinding(t->left); r1=getReg(); fprintf(fp, "IN R%d\n",r1); fprintf(fp, "MOV [R%d], R%d\n",r,r1); freeReg(); freeReg(); return 0; break; case WRITE: r=CodeGen(t->left); fprintf(fp, "OUT R%d\n",r); freeReg(); return 0; break; case IF: l1=getLabel(); r=CodeGen(t->left); r1=getReg(); fprintf(fp, "MOV R%d, 0\n",r1); fprintf(fp, "NE R%d, R%d\n",r,r1); fprintf(fp, "JZ R%d, L%d\n",r,l1); freeReg(); freeReg(); CodeGen(t->right); fprintf(fp, "L%d:\n",l1); return 0; break; case WHILE: { l1=getLabel(); l2=getLabel(); fprintf(fp, "L%d:\n",l1); r=CodeGen(t->left); r1=getReg(); fprintf(fp, "MOV R%d, 0\n",r1); fprintf(fp, "NE R%d, R%d\n",r,r1); fprintf(fp, "JZ R%d, L%d\n",r,l2); freeReg(); freeReg(); CodeGen(t->right); fprintf(fp, "JMP L%d\n",l1); fprintf(fp, "L%d:\n",l2); return 0; } break; case CONNECT: CodeGen(t->left); CodeGen(t->right); return 0; break; } }
virtual PE* createPE( unsigned id, unsigned uid ) { PE * pe = NEW OpenCLProcessor( getBinding( id ) , id, uid ); pe->setNUMANode( sys.getNodeOfPE( pe->getId() ) ); return pe; }
void InputService::handleKeyEvent(const Event &event) { InputKey binding(getBinding(event.rawInputKey.key)); // unrecognized key if (binding == KEY_UNKNOWN) return; // quit if (binding == KEY_EXIT) { Logger::logDebug("Exit key pressed, quitting"); Locator::locate<RenderService>()->getWindow()->close(); return; } EventService *es = Locator::locate<EventService>(); bool hasEntity = hasPlayerEntity(); Event e; // assign entity id e.entityID = hasEntity ? *playerEntity : CAMERA_ENTITY; // yield entity control if (binding == KEY_YIELD_CONTROL) { if (hasEntity) { e.type = EVENT_INPUT_YIELD_CONTROL; clearPlayerEntity(); es->callEvent(e); } return; } // sprint if (binding == KEY_SPRINT) { e.type = EVENT_INPUT_SPRINT; e.sprintToggle.start = event.rawInputKey.pressed; es->callEvent(e); return; } // input bool startMoving = event.rawInputKey.pressed; e.type = startMoving ? EVENT_INPUT_START_MOVING : EVENT_INPUT_STOP_MOVING; DirectionType direction; switch (binding) { case KEY_UP: direction = DIRECTION_NORTH; break; case KEY_LEFT: direction = DIRECTION_WEST; break; case KEY_DOWN: direction = DIRECTION_SOUTH; break; case KEY_RIGHT: direction = DIRECTION_EAST; break; default: error("An invalid movement key slipped through InputService's onEvent: %1%", _str(binding)); return; } if (startMoving) e.startMove.direction = direction; else e.stopMove.direction = direction; es->callEvent(e); }