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;
}
Exemple #3
0
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;

}