Do not generate pseudo variables for literals and local variables
This commit is contained in:
@@ -470,7 +470,8 @@ type
|
||||
jump_if_zero,
|
||||
jump_if_not_zero,
|
||||
label,
|
||||
_return
|
||||
_return,
|
||||
noop
|
||||
);
|
||||
ElnaTacKind = (list, immediate, symbol, pseudo);
|
||||
ElnaTacOperand = record
|
||||
@@ -526,7 +527,8 @@ type
|
||||
bnez,
|
||||
label,
|
||||
allocate_stack,
|
||||
ret
|
||||
ret,
|
||||
noop
|
||||
);
|
||||
ElnaRtlKind = (register, immediate, symbol, pseudo, offset, pseudo_mem);
|
||||
ElnaRtlOperand = record
|
||||
@@ -990,6 +992,35 @@ begin
|
||||
elna_list_append(instructions, instruction)
|
||||
end;
|
||||
|
||||
proc elna_rtl_call_parameter(instructions: ^ElnaList, current_argument: ^ElnaTacOperand, into: ElnaRtlRegister);
|
||||
var
|
||||
instruction: ^ElnaRtlInstruction;
|
||||
begin
|
||||
if current_argument^.kind = ElnaTacKind.pseudo then
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, into, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaTacKind.pseudo,
|
||||
current_argument^.value, current_argument^.length)
|
||||
elsif current_argument^.kind = ElnaTacKind.immediate then
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.li);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, into, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaTacKind.immediate,
|
||||
current_argument^.value, current_argument^.length)
|
||||
elsif current_argument^.kind = ElnaTacKind.symbol then
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.la);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, into, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.symbol,
|
||||
current_argument^.value, current_argument^.length);
|
||||
elna_list_append(instructions, instruction);
|
||||
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.lw);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, into, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.offset, into, 0);
|
||||
elna_list_append(instructions, instruction)
|
||||
end;
|
||||
elna_list_append(instructions, instruction)
|
||||
end;
|
||||
|
||||
proc elna_rtl_call(instructions: ^ElnaList, tac_instruction: ^ElnaTacInstruction, variable_map: ^ElnaSymbolTable);
|
||||
var
|
||||
argument_count: Word;
|
||||
@@ -1007,24 +1038,7 @@ begin
|
||||
if argument_count > 0 then
|
||||
argument_count := argument_count - 1;
|
||||
|
||||
if current_argument^.kind = ElnaTacKind.pseudo then
|
||||
variable_info := elna_symbol_table_lookup(variable_map, current_argument^.value, current_argument^.length);
|
||||
|
||||
if variable_info^.rtl_type^.size <= 4 then
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, ElnaRtlRegister.a0 + current_register, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.pseudo,
|
||||
current_argument^.value, current_argument^.length)
|
||||
elsif variable_info^.rtl_type^.size <= 8 then
|
||||
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(instruction, 1, ElnaRtlKind.register, ElnaRtlRegister.a0 + current_register, 0);
|
||||
elna_rtl_instruction_set_operand(instruction, 2, ElnaRtlKind.pseudo,
|
||||
current_argument^.value, current_argument^.length)
|
||||
end
|
||||
end;
|
||||
elna_list_append(instructions, instruction);
|
||||
|
||||
elna_rtl_call_parameter(instructions, current_argument, ElnaRtlRegister.a0 + current_register);
|
||||
current_argument := current_argument + #size(ElnaTacOperand);
|
||||
current_register := current_register + 1;
|
||||
|
||||
@@ -1148,6 +1162,11 @@ begin
|
||||
elna_tac_instruction_set_operand(instruction, 2, ElnaRtlKind.register, ElnaRtlRegister.t4, 0);
|
||||
elna_list_append(instructions, instruction)
|
||||
end
|
||||
elsif tac_instruction^.operator = ElnaTacOperator.noop then
|
||||
instruction := elna_rtl_instruction_create(ElnaRtlOperator.noop);
|
||||
elna_rtl_copy_operand(tac_instruction, 1, instruction);
|
||||
elna_rtl_copy_operand(tac_instruction, 2, instruction);
|
||||
elna_list_append(instructions, instruction)
|
||||
end
|
||||
end;
|
||||
|
||||
@@ -1469,6 +1488,15 @@ begin
|
||||
(* Write the epilogue. *)
|
||||
printf("\tlw ra, %i(sp)\n\tlw s0, %i(sp)\n\taddi sp, sp, %i\n\0", operand_value + 4, operand_value, operand_value + 8);
|
||||
fflush(nil)
|
||||
elsif instruction^.operator = ElnaRtlOperator.noop then
|
||||
operand_value := instruction^.operands[2].value;
|
||||
|
||||
if operand_value = 0 then
|
||||
printf("# Debug start\n\0");
|
||||
else
|
||||
printf("# Debug end\n\0");
|
||||
end;
|
||||
fflush(nil)
|
||||
else
|
||||
argument_count := elna_riscv_instruction_name(instruction^.operator)
|
||||
end;
|
||||
@@ -2009,17 +2037,14 @@ begin
|
||||
elna_tac_instruction_set_operand(instruction, 1, base.kind, base.value, base.length);
|
||||
elna_tac_instruction_set_operand(instruction, 2, operand^.kind, operand^.value, operand^.length);
|
||||
elna_list_append(instructions, instruction)
|
||||
elsif base.kind = ElnaTacKind.pseudo then
|
||||
else
|
||||
(* Debug
|
||||
printf("# Here %i %.*s\n\0", base.value, base.length, base.value);
|
||||
fflush(nil); *)
|
||||
|
||||
operand^.kind := base.kind;
|
||||
operand^.value := base.value;
|
||||
operand^.length := base.length
|
||||
else
|
||||
elna_tac_generate_pseudo(@operand^.kind, @operand^.value, @operand^.length, symbol_table);
|
||||
|
||||
instruction := elna_tac_instruction_create(ElnaTacOperator.copy);
|
||||
elna_tac_instruction_set_operand(instruction, 1, operand^.kind, operand^.value, operand^.length);
|
||||
elna_tac_instruction_set_operand(instruction, 2, base.kind, base.value, base.length);
|
||||
elna_list_append(instructions, instruction)
|
||||
end
|
||||
end;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user