expressions labels jumps registers
Transcript
expressions labels jumps registers
EXPRESSIONS t_axe_expression handle_bin_numeric_op (t_program_infos *program, t_axe_expression exp1, t_axe_expression exp2, int binop) binop: ADD, ANDB, ORB, SUB, SHL, SHR, MUL, DIV Date due espressioni ed un tipo di operazione si occupa di allocare i registri, produrre l'operazione binaria a livello di assembly e restituisce una nuova espressione contenente il risultato dell'operazione. ESEMPIO: t_axe_expression e_split = handle_bin_numeric_op(program, e_arraysize, $3, SUB); ------------------------------------------------------------------------------------------------------------------------------------------------------------t_axe_expression handle_binary_comparison (t_program_infos *program, t_axe_expression exp1, t_axe_expression exp2, int condition) condition: _LT_, _GT_, _EQ_, _NOTEQ_, _LTEQ_, _GTEQ_ Date due espressioni e una condizione da verificare, restituisce una nuova espressione con il risultato del confronto, 1 se vero, 0 altrimenti. ESEMPIO: t_axe_expression gt = handle_binary_comparison(program, $1, $3, _GT_); LABELS t_axe_label * newLabel(t_program_infos *program); Crea una nuova etichetta, senza assegnarla, utilizzata per i forward jump (nel momento in cui genero l'istruzione di salto non ho ancora assegnato l'etichetta nel punto di arrivo) ESEMPIO: $1 = newLabel(program); ------------------------------------------------------------------------------------------------------------------------------------------------------------t_axe_label * assignLabel(t_program_infos *program, t_axe_label *label); Assegna un'etichetta creata precedentemente. ESEMPIO: assignLabel(program, $1); ------------------------------------------------------------------------------------------------------------------------------------------------------------t_axe_label * assignNewLabel(t_program_infos *program); Crea e assegna una nuova etichetta (usata nei backward jump). ESEMPIO: condition_label = assignNewLabel(program); JUMPS t_axe_instruction gen_<JUMP>_instruction(t_program_infos *program, t_axe_label * dest, int addr); Genera un'istruzione di salto, la cui condizione è espressa da <JUMP> alla posizione indicata dalla label dest. <JUMP>: bt, bne, beq, bge, bgt, ble, blt ESEMPIO: gen_bt_instruction(program, start, 0); REGISTERS int getNewRegister(t_program_infos *program); Restituisce un intero che identifica il registro libero che viene riservato. ------------------------------------------------------------------------------------------------------------------------------------------------------------int gen_load_immediate(t_program_infos *program, int immediate); Carica un immediato in un registro. Viene restituito l'identificativo del registro. ------------------------------------------------------------------------------------------------------------------------------------------------------------t_axe_expression create_expression(int value, int type); Crea un'espressione da registro, può essere IMMEDIATE o REGISTER. ESEMPIO (Caricare un'espressione in un registro) if(start.expression_type == IMMEDIATE) { from_reg = gen_load_immediate(program, start.value); } else { from_reg = getNewRegister(program); gen_andb_instruction(program, from_reg, start.value, start.value, CG_DIRECT_ALL); } from_expr = create_expression(from_reg, REGISTER); ARRAYS int loadArrayElement(t_program_infos *program, char *ID, t_axe_expression index); Restituisce un riferimento al registro in cui è stato caricato l'elemento dell'array ID situato all'indice index. ESEMPIO: el1_reg = loadArrayElement(program, array -> ID, from_expr); ------------------------------------------------------------------------------------------------------------------------------------------------------------void storeArrayElement (t_program_infos *program, char *ID, t_axe_expression index, t_axe_expression data); Carica in posizion index l'espressione data. ESEMPIO: storeArrayElement(program, array -> ID, to_expr, el1_expr); LOOPS ESEMPIO (COMPLETO): condition_label = assignNewLabel(program); gen_subi_instruction(program, index_reg, index_reg, 1); end_label = newLabel(program); gen_beq_instruction(program, end_label, 0); [loop body] gen_bt_instruction(program, condition_label, 0); assignLabel(program, end_label);