Remove support for hardware registers in TAC
This commit is contained in:
13
Rakefile
13
Rakefile
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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^)
|
||||||
|
end;
|
||||||
operand_type^ := ElnaTacOperand.pseudo;
|
operand_type^ := ElnaTacOperand.pseudo;
|
||||||
operand_value^ := "$unary";
|
operand_value^ := "$unary";
|
||||||
operand_length^ := 6
|
operand_length^ := 6;
|
||||||
end;
|
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user