Remove support for hardware registers in TAC

This commit is contained in:
2026-01-02 18:28:29 +01:00
parent 58e708f44c
commit f86d06236c
2 changed files with 41 additions and 56 deletions

View File

@@ -43,19 +43,10 @@ end
desc 'Convert previous stage language into the current stage language' desc 'Convert previous stage language into the current stage language'
task :convert do task :convert do
File.open('boot/stage17/cl.elna', 'w') do |current_stage| File.open('boot/stage18/cl.elna', 'w') do |current_stage|
File.readlines('boot/stage16/cl.elna').each do |line| File.readlines('boot/stage17/cl.elna').each do |line|
current_stage << line current_stage << line
end end
current_stage << <<~STAGE
proc f(x: ElnaTreeExpression);
var
y: Word;
begin
y := x.kind
end;
STAGE
end end
end end

View File

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