From f86d06236cefe3de17965f641586c14a9ccb9f82 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 2 Jan 2026 18:28:29 +0100 Subject: [PATCH] Remove support for hardware registers in TAC --- Rakefile | 13 ++----- boot/stage18/cl.elna | 84 ++++++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 56 deletions(-) diff --git a/Rakefile b/Rakefile index 9eb4f04..4e8cbbc 100644 --- a/Rakefile +++ b/Rakefile @@ -43,19 +43,10 @@ end desc 'Convert previous stage language into the current stage language' task :convert do - File.open('boot/stage17/cl.elna', 'w') do |current_stage| - File.readlines('boot/stage16/cl.elna').each do |line| + File.open('boot/stage18/cl.elna', 'w') do |current_stage| + File.readlines('boot/stage17/cl.elna').each do |line| current_stage << line end - current_stage << <<~STAGE - - proc f(x: ElnaTreeExpression); - var - y: Word; - begin - y := x.kind - end; - STAGE end end 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