static void swap() { int left_var = variable(), right_var = variable(); int reg_one = next_register(), reg_two = next_register(); CodeGen(LOAD, reg_one, left_var, EMPTY_FIELD); CodeGen(LOAD, reg_two, right_var, EMPTY_FIELD); CodeGen(STORE, left_var, reg_two, EMPTY_FIELD); CodeGen(STORE, right_var, reg_one, EMPTY_FIELD); }
static int expr() { int reg, left_reg, right_reg; switch (token) { case '+': next_token(); left_reg = expr(); right_reg = expr(); reg = next_register(); CodeGen(ADD, reg, left_reg, right_reg); return reg; case '*': next_token(); left_reg = expr(); right_reg = expr(); reg = next_register(); CodeGen(MUL, reg, left_reg, right_reg); return reg; case '-': next_token(); left_reg = expr(); right_reg = expr(); reg = next_register(); CodeGen(SUB, reg, left_reg, right_reg); return reg; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return digit(); case 'a': case 'b': case 'c': case 'd': case 'e': return variable(); default: ERROR("Symbol %c unknown\n", token); exit(EXIT_FAILURE); } }
static int variable() /* only called for R-values */ { int reg; if(!is_identifier(token)){ ERROR("Expected identifier\n"); exit(EXIT_FAILURE); } reg = next_register(); CodeGen(LOAD, reg, token, EMPTY_FIELD); next_token(); return reg; }
static int variable() { int reg; if (!is_identifier(token)) { ERROR("Expected identifier\n"); exit(EXIT_FAILURE); } reg = next_register(); CodeGen(LOADAI, 0, (token-'a')*4, reg); /* token - 'a' is offset of varible, *4 for byte address */ next_token(); return reg; }
static int digit() { int reg; if (!is_digit(token)) { ERROR("Expected digit\n"); exit(EXIT_FAILURE); } reg = next_register(); CodeGen(LOADI, to_digit(token), reg, EMPTY_FIELD); next_token(); return reg; }