История изменений
Исправление wandrien, (текущая версия) :
Кстати, про выбор порядка вычисления.
Вот так выглядит несложная логика выбора для оператора присваивания:
word Code_ASSIGN(word P)
word P1 = Node[P].pLeft;
if Node[P1].pRight < nNODE then
word RegRight = LookupRegForNode(Node[P1].pRight);
select
case RegRight != RegNone & CodeRequiresSingleRegister(Node[P1].pLeft):
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (1)");
Reg_ALT_TARGET = RegRight;
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
case !CodeRequiresSingleRegister(Node[P1].pLeft)
& CodeRequiresSingleRegister(Node[P1].pRight):
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Reg_ALT_TARGET = Ref.IX;
Reg_TARGET = ChooseEmptyReg2();
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
Reg_TARGET = RegNone;
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
default:
Reg_ALT_TARGET = PHO_LookupRegForNode(Node[P1].pRight);
if Reg_ALT_TARGET == RegNone then
Reg_TARGET = RegA;
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
else
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (2)");
end
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
end
else
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
Code(Node[P1].pLeft);
end
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegA;
return Node[P].pType;
end
А логику переупорядочивания вычисления для арифметических операций я показывать не буду, это страшно, очень страшно. Несколько экранных страниц.
Исправление wandrien, :
Кстати, про выбор порядка вычисления.
Вот так выглядит несложная логика выбора для оператора присваивания:
word Code_ASSIGN(word P)
word P1 = Node[P].pLeft;
if Node[P1].pRight < nNODE then
word RegRight = LookupRegForNode(Node[P1].pRight);
select
case RegRight != RegNone & CodeRequiresSingleRegister(Node[P1].pLeft):
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (1)");
Reg_ALT_TARGET = Reg_TARGET;
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
case !CodeRequiresSingleRegister(Node[P1].pLeft)
& CodeRequiresSingleRegister(Node[P1].pRight):
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Reg_ALT_TARGET = Ref.IX;
Reg_TARGET = ChooseEmptyReg2();
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
Reg_TARGET = RegNone;
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
default:
Reg_ALT_TARGET = PHO_LookupRegForNode(Node[P1].pRight);
if Reg_ALT_TARGET == RegNone then
Reg_TARGET = RegA;
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
else
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (2)");
end
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
end
else
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
Code(Node[P1].pLeft);
end
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegA;
return Node[P].pType;
end
А логику переупорядочивания вычисления для арифметических операций я показывать не буду, это страшно, очень страшно. Несколько экранных страниц.
Исходная версия wandrien, :
Кстати, про выбор порядка вычисления.
Вот так выглядит несложная логика выбора для оператора присваивания:
word Code_ASSIGN(word P)
word P1 = Node[P].pLeft;
if Node[P1].pRight < nNODE then
word RegRight = LookupRegForNode(Node[P1].pRight);
select
case RegRight != RegNone & CodeRequiresSingleRegister(Node[P1].pLeft):
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (1)");
Reg_ALT_TARGET = RegNone;
Reg_TARGET = RegRight;
Reg_ALT_TARGET = Reg_TARGET;
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
case !CodeRequiresSingleRegister(Node[P1].pLeft)
& CodeRequiresSingleRegister(Node[P1].pRight):
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Reg_ALT_TARGET = Ref.IX;
Reg_TARGET = ChooseEmptyReg2();
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
Reg_TARGET = RegNone;
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
default:
Reg_ALT_TARGET = PHO_LookupRegForNode(Node[P1].pRight);
if Reg_ALT_TARGET == RegNone then
Reg_TARGET = RegA;
Code(Node[P1].pRight);
Reg_ALT_TARGET = Reg_TARGET;
else
EmitWithExprComment("", "Node link reuse in Code_ASSIGN (2)");
end
Reg_TARGET = ChooseEmptyReg2();
ValueRef Ref;
CodePrimary(Node[P1].pLeft, @Ref);
Code_STORE(@Ref, Node[P1].pLeft, Node[P1].pRight);
end
else
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegNone;
Code(Node[P1].pLeft);
end
Reg_TARGET = RegA;
Reg_ALT_TARGET = RegA;
return Node[P].pType;
end
А логику переупорядочивания вычисления для арифметических операций я показывать не буду, это страшно, очень страшно. Несколько экранных страниц.