summaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-01-02 18:28:29 +0100
committerEugen Wissner <belka@caraus.de>2026-01-04 13:04:22 +0100
commitf86d06236cefe3de17965f641586c14a9ccb9f82 (patch)
treec663be87f3791f9b7619d381c0e52f38a26f28c9 /boot
parent58e708f44c23144622a9a5546b07d5c01d18db56 (diff)
downloadelna-f86d06236cefe3de17965f641586c14a9ccb9f82.tar.gz
Remove support for hardware registers in TAC
Diffstat (limited to 'boot')
-rw-r--r--boot/stage18/cl.elna84
1 files changed, 39 insertions, 45 deletions
diff --git a/boot/stage18/cl.elna b/boot/stage18/cl.elna
index f579c0a..44645ae 100644
--- a/boot/stage18/cl.elna
+++ b/boot/stage18/cl.elna
@@ -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