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);