struct to_pass *emit_mult(FILE *outFile, struct to_pass *leftSide, char operator, struct to_pass *rightSide){ struct to_pass *multRes = NULL; int reg_num = getRegNum(); int currObj; multRes = malloc(sizeof(struct to_pass)); multRes->base_reg_num = reg_num; multRes->offSet = 0; multRes->isLocal = 0; multRes->isVar = 1;//Results won't have an actual value, therefore should be referred to with a register fprintf(outFile, "Emit Multi\n"); currObj = getObjCount(); if(leftSide->isLocal){ fprintf(outFile, "%d r%d := contents b, %d %c ", currObj, reg_num, leftSide->offSet, operator); } else if(leftSide->offSet == 0){ fprintf(outFile, "%d r%d := r%d %c ", currObj, reg_num, leftSide->base_reg_num, operator); } else { fprintf(outFile, "%d r%d := contents r%d, %d %c ", currObj, reg_num, leftSide->base_reg_num, leftSide->offSet, operator); } if(rightSide->isLocal){ fprintf(outFile, "contents b, %d\n", rightSide->offSet); } else if(rightSide->offSet == 0){ fprintf(outFile, "r%d\n", rightSide->base_reg_num); } else { fprintf(outFile, "contents r%d, %d\n", rightSide->base_reg_num, rightSide->offSet); } return multRes; }
void emit_assign(FILE *outFile, char * assMe, struct to_pass *reg){ int currOCount; /*currOCount = getObjCount(); fprintf(outFile, "%d r%d := %d\n", currOCount, reg.base_reg_num , expr_value); */ int walk_back = 0; struct node *result; fprintf(outFile, "Searching for variable %s on the left side\n", assMe); result = search_stack(assMe, &walk_back); if(result != NULL){ if(walk_back > 0){ int current_reg = getRegNum(); emit_walkback(outFile, current_reg, walk_back, 0); currOCount = getObjCount(); if(reg->isLocal){ fprintf(outFile, "%d contents r%d, %d := contents b, %d\n", currOCount, current_reg, result->offSet, reg->offSet); } else { fprintf(outFile, "%d contents r%d, %d := ", currOCount, current_reg, result->offSet); if(reg->offSet == 0){ fprintf(outFile, "r%d\n", reg->base_reg_num); } else{ fprintf(outFile, "contents r%d, %d\n", reg->base_reg_num, reg->offSet); } } } else{ currOCount = getObjCount(); if(reg->isLocal){ fprintf(outFile, "%d contents b, %d := contents b, %d\n", currOCount, result->offSet, reg->offSet); } else { fprintf(outFile, "%d contents b, %d := ", currOCount, result->offSet); if(reg->offSet == 0){ fprintf(outFile, "r%d\n", reg->base_reg_num); } else { fprintf(outFile, "contents r%d, %d\n", reg->base_reg_num, reg->offSet); } } } } else{ fprintf(outFile, "Variable %s was not found\n", assMe); } return; }
void IceVariable::emit(IceOstream &Str, uint32_t Option) const { assert(DefOrUseNode == NULL || DefOrUseNode == Str.getCurrentNode()); if (getRegNum() >= 0) { Str << Str.Cfg->physicalRegName(RegNum); return; } Str << "[" << Str.Cfg->physicalRegName(Str.Cfg->getTarget()->getFrameOrStackReg()); int Offset = getStackOffset() + Str.Cfg->getTarget()->getStackAdjustment(); if (Offset) { if (Offset > 0) Str << "+"; Str << Offset; } Str << "]"; }
struct to_pass *emit_relat(FILE *outFile, int left_reg, char *operator, int right_reg){ struct to_pass *multRes = NULL; int reg_num = getRegNum(); int currObj; multRes = malloc(sizeof(struct to_pass)); multRes->base_reg_num = reg_num; multRes->offSet = 0; multRes->isLocal = 0; multRes->isVar = 1; //Results won't have an actual value, therefore should be referred to with a register fprintf(outFile, "Emit Bool\n"); currObj = getObjCount(); if((strcmp(operator, ">") == 0)){ fprintf(outFile, "%d r%d := r%d < r%d\n", currObj, multRes->base_reg_num, right_reg, left_reg); } else if((strcmp(operator, ">=") == 0)){ fprintf(outFile, "%d r%d := r%d <= r%d\n", currObj, multRes->base_reg_num, right_reg, left_reg); } else { fprintf(outFile, "%d r%d := r%d %s r%d\n", currObj, multRes->base_reg_num, left_reg, operator, right_reg); } /*if(leftSide->isLocal){ fprintf(outFile, "%d r%d := contents b, %d ", currObj, reg_num, leftSide->offSet); } else if(leftSide->offSet == 0){ fprintf(outFile, "%d r%d := r%d ", currObj, reg_num, leftSide->base_reg_num); } else { fprintf(outFile, "%d r%d := contents r%d, %d ", currObj, reg_num, leftSide->base_reg_num, leftSide->offSet); }*/ /*if(strcmp(operator, ">") == 0){ fprintf(outFile, "< "); } else if(strcmp(operator, ">=") == 0){ fprintf(outFile, "<= "); } else { fprintf(outFile, "%s ", operator); }*/ /*if(rightSide->isLocal){ fprintf(outFile, "contents b, %d\n", rightSide->offSet); } else if(rightSide->offSet == 0){ fprintf(outFile, "r%d\n", rightSide->base_reg_num); } else { fprintf(outFile, "contents r%d, %d\n", rightSide->base_reg_num, rightSide->offSet); }*/ return multRes; }
struct to_pass *emit_expo(FILE *outFile, struct to_pass *base, struct to_pass *power){ int currObj; char *baseRef; int powerReg; int compReg; struct to_pass *multRes = NULL; multRes = malloc(sizeof(struct to_pass)); multRes->offSet = 0; multRes->isLocal = 0; multRes->isVar = 1; //Results won't have an actual value, therefore should be referred to with a register //Set up reference for the base and the power if(base->isVar){ if(base->isLocal){ baseRef = malloc(sizeof("contents b, 0 ") + 1); sprintf(baseRef, "contents b, %d ", base->offSet); } else { baseRef = malloc(sizeof("contents r0, 0 ") + 1); sprintf(baseRef, "contents r%d, %d ", base->base_reg_num, base->offSet); } } else { baseRef = malloc(sizeof("r0 ") + 1); sprintf(baseRef, "r%d ", base->base_reg_num); } //Store power in register if(power->isVar){ currObj = getObjCount(); if(power->isLocal){ currObj = getObjCount(); powerReg = getRegNum(); fprintf(outFile, "%d r%d := contents b, %d\n", currObj, powerReg, power->offSet); } else { powerReg = getRegNum(); fprintf(outFile, "%d r%d := contents r%d, %d\n", currObj, powerReg, power->base_reg_num, power->offSet); } } else { powerReg = power->base_reg_num; } //Set registers for zero, one and the result int regZero = getRegNum(); int regOne = getRegNum(); int result_reg = getRegNum(); multRes->base_reg_num = result_reg; //Pass up result's register fprintf(outFile, "Emit Exponent\n"); currObj = getObjCount(); fprintf(outFile, "%d r%d := 0\n", currObj, regZero); currObj = getObjCount(); fprintf(outFile, "%d r%d := 1\n", currObj, regOne); //Store base in result register currObj = getObjCount(); fprintf(outFile, "%d r%d := %s\n", currObj, result_reg, baseRef); //Output if power <= 0 jump? currObj = getObjCount(); compReg = getRegNum(); //First store comparison fprintf(outFile, "%d r%d := r%d <= r%d\n", currObj, compReg, powerReg, regZero); currObj = getObjCount(); fprintf(outFile, "%d pc := %d if r%d\n", currObj, currObj + 6, compReg); //Output multiplication currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d * %s\n", currObj, result_reg, result_reg, baseRef); //Output decrement of power currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d - r%d\n", currObj, powerReg, powerReg, regOne); //Output if power > 0 multiply again currObj = getObjCount(); compReg = getRegNum(); //First store comparison fprintf(outFile, "%d r%d := r%d < r%d\n", currObj, compReg, regZero, powerReg); currObj = getObjCount(); fprintf(outFile, "%d pc := %d if r%d\n", currObj, currObj - 3, compReg); //Mult is 3 lines back //Output jump out of expression currObj = getObjCount(); fprintf(outFile, "%d pc := %d\n", currObj, currObj + 10); //Output jump to setting result to 1 because power started at 0 currObj = getObjCount(); compReg = getRegNum(); //First store comparison fprintf(outFile, "%d r%d := r%d = r%d\n", currObj, compReg, powerReg, regZero); currObj = getObjCount(); fprintf(outFile, "%d pc := %d if r%d\n", currObj, currObj + 7, compReg); //Output mult for negative exponents currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d * %s\n", currObj, result_reg, result_reg, baseRef); //Output exponent increment currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d + r%d\n", currObj, powerReg, powerReg, regOne); //Output jump if power is less than zero currObj = getObjCount(); compReg = getRegNum(); //First Store Comparison fprintf(outFile, "%d r%d := r%d < r%d\n", currObj, compReg, powerReg, regZero); currObj = getObjCount(); fprintf(outFile, "%d pc := %d if r%d\n", currObj, currObj - 3, compReg); //Output division of result for negative exponents currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d / r%d\n", currObj, result_reg, regOne, result_reg); //Output leave expression currObj = getObjCount(); fprintf(outFile, "%d pc := %d\n", currObj, currObj + 2); //Output setting result to 1 when exponent is 0 currObj = getObjCount(); fprintf(outFile, "%d r%d := r%d\n", currObj, result_reg, regOne); return multRes; }