Remove support for hardware registers in TAC
This commit is contained in:
@@ -472,7 +472,7 @@ type
|
||||
allocate_stack,
|
||||
ret
|
||||
);
|
||||
ElnaTacOperand = (temporary, immediate, symbol, pseudo, list);
|
||||
ElnaTacOperand = (list, immediate, symbol, pseudo);
|
||||
ElnaRtlOperand = (register, immediate, symbol, pseudo, offset);
|
||||
ElnaRtlRegister = (
|
||||
zero,
|
||||
@@ -848,10 +848,6 @@ begin
|
||||
elna_rtl_instruction_set_operand(next_instruction, 2, ElnaRtlOperand.offset, into, 0);
|
||||
|
||||
result^.next := next_instruction
|
||||
elsif operand_type = ElnaTacOperand.temporary then
|
||||
result := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(result, 1, ElnaRtlOperand.register, into, 0);
|
||||
elna_rtl_instruction_set_operand(result, 2, ElnaRtlOperand.register, operand_value, 0)
|
||||
elsif operand_type = ElnaTacOperand.pseudo then
|
||||
result := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(result, 1, ElnaRtlOperand.register, into, 0);
|
||||
@@ -1051,6 +1047,16 @@ begin
|
||||
else
|
||||
elna_instruction_list_concatenate(current_instruction, argument_move)
|
||||
end;
|
||||
current_instruction := argument_move;
|
||||
|
||||
argument_type := _elna_tac_instruction_get_operand_type(tac_instruction, 3);
|
||||
argument_value := _elna_tac_instruction_get_operand_value(tac_instruction, 3);
|
||||
argument_length := _elna_tac_instruction_get_operand_length(tac_instruction, 3);
|
||||
argument_move := elna_rtl_instruction_create(ElnaRtlOperator.move);
|
||||
elna_rtl_instruction_set_operand(argument_move, 1, argument_type, argument_value, argument_length);
|
||||
elna_rtl_instruction_set_operand(argument_move, 2, ElnaRtlOperand.register, ElnaRtlRegister.a0, 0);
|
||||
elna_instruction_list_concatenate(current_instruction, argument_move);
|
||||
|
||||
next_instruction^ := argument_move;
|
||||
|
||||
return first_instruction
|
||||
@@ -2206,44 +2212,28 @@ begin
|
||||
if operator = '@' then
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.get_address);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^)
|
||||
elsif operator = '-' then
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.negate);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^)
|
||||
elsif operator = '~' then
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.complement);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^)
|
||||
elsif is_address then
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.load);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, operand_type^, operand_value^, operand_length^);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6
|
||||
_elna_tac_instruction_set_operand(instruction, 2, ElnaTacOperand.pseudo, "$unary", 6)
|
||||
else
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.copy);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type^, operand_value^, operand_length^)
|
||||
end;
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6;
|
||||
|
||||
return elna_instruction_list_concatenate(first_instruction, instruction)
|
||||
end;
|
||||
|
||||
@@ -2466,7 +2456,7 @@ begin
|
||||
return result
|
||||
end;
|
||||
|
||||
proc elna_tac_call(parsed_call: Word, symbol_table: Word);
|
||||
proc elna_tac_call(parsed_call: Word, symbol_table: Word, operand_type: Word, operand_value: Word, operand_length: Word);
|
||||
var
|
||||
argument_count: Word;
|
||||
name_length: Word;
|
||||
@@ -2475,9 +2465,9 @@ var
|
||||
instruction: Word;
|
||||
first_instruction: Word;
|
||||
current_instruction: Word;
|
||||
operand_type: Word;
|
||||
operand_value: Word;
|
||||
operand_length: Word;
|
||||
argument_type: Word;
|
||||
argument_value: Word;
|
||||
argument_length: Word;
|
||||
arguments_operand: Word;
|
||||
call_instruction: Word;
|
||||
name_buffer: Word;
|
||||
@@ -2500,6 +2490,11 @@ begin
|
||||
call_instruction := _elna_tac_instruction_create(ElnaTacOperator.proc_call);
|
||||
_elna_tac_instruction_set_operand(call_instruction, 1, ElnaTacOperand.symbol, name, name_length);
|
||||
_elna_tac_instruction_set_operand(call_instruction, 2, ElnaTacOperand.list, arguments_operand, argument_count);
|
||||
_elna_tac_instruction_set_operand(call_instruction, 3, ElnaTacOperand.pseudo, "$unary", 6);
|
||||
|
||||
operand_type^ := ElnaTacOperand.pseudo;
|
||||
operand_value^ := "$unary";
|
||||
operand_length^ := 6;
|
||||
|
||||
argument_count := 0;
|
||||
.elna_tac_call_loop;
|
||||
@@ -2508,10 +2503,10 @@ begin
|
||||
if parsed_expression = 0 then
|
||||
goto elna_tac_call_finalize
|
||||
else
|
||||
operand_type := 0;
|
||||
operand_value := 0;
|
||||
operand_length := 0;
|
||||
instruction := elna_tac_binary_expression(parsed_expression, symbol_table, @operand_type, @operand_value, @operand_length);
|
||||
argument_type := 0;
|
||||
argument_value := 0;
|
||||
argument_length := 0;
|
||||
instruction := elna_tac_binary_expression(parsed_expression, symbol_table, @argument_type, @argument_value, @argument_length);
|
||||
if first_instruction = 0 then
|
||||
first_instruction := instruction
|
||||
else
|
||||
@@ -2526,7 +2521,7 @@ begin
|
||||
sprintf(name_buffer, "$ar%i\0", argument_count);
|
||||
instruction := _elna_tac_instruction_create(ElnaTacOperator.copy);
|
||||
_elna_tac_instruction_set_operand(instruction, 1, ElnaTacOperand.pseudo, name_buffer, 4);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, operand_type, operand_value, operand_length);
|
||||
_elna_tac_instruction_set_operand(instruction, 2, argument_type, argument_value, argument_length);
|
||||
if first_instruction = 0 then
|
||||
first_instruction := instruction
|
||||
else
|
||||
@@ -2736,11 +2731,7 @@ begin
|
||||
first_instruction := elna_instruction_list_concatenate(first_instruction, last_instruction)
|
||||
end;
|
||||
elsif parser_node^.kind = ElnaTreeKind.call then
|
||||
first_instruction := elna_tac_call(parser_node, symbol_table);
|
||||
|
||||
operand_type^ := ElnaTacOperand.temporary;
|
||||
operand_value^ := 11;
|
||||
operand_length^ := 0;
|
||||
first_instruction := elna_tac_call(parser_node, symbol_table, operand_type, operand_value, operand_length);
|
||||
is_address^ := 0
|
||||
else
|
||||
first_instruction := elna_tac_simple_expression(parser_node, symbol_table, operand_type, operand_value, operand_length);
|
||||
@@ -3138,6 +3129,9 @@ end;
|
||||
proc elna_tac_statement(parser_node: ^ElnaTreeNode, symbol_table: Word);
|
||||
var
|
||||
instruction: Word;
|
||||
operand_type: Word;
|
||||
operand_value: Word;
|
||||
operand_length: Word;
|
||||
begin
|
||||
if parser_node^.kind = ElnaTreeKind.goto_statement then
|
||||
instruction := elna_tac_goto_statement(parser_node)
|
||||
@@ -3148,7 +3142,7 @@ begin
|
||||
elsif parser_node^.kind = ElnaTreeKind.label_declaration then
|
||||
instruction := elna_tac_label_declaration(parser_node)
|
||||
elsif parser_node^.kind = ElnaTreeKind.call then
|
||||
instruction := elna_tac_call(parser_node, symbol_table)
|
||||
instruction := elna_tac_call(parser_node, symbol_table, @operand_type, @operand_value, @operand_length)
|
||||
elsif parser_node^.kind = ElnaTreeKind.assign_statement then
|
||||
instruction := elna_tac_assign_statement(parser_node, symbol_table)
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user