LINUX.ORG.RU

История изменений

Исправление 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

А логику переупорядочивания вычисления для арифметических операций я показывать не буду, это страшно, очень страшно. Несколько экранных страниц.