Здравствуйте, VjcheslavV, Вы писали:
VV>В разных книгах про промежуточный трёхадресный код читал VV>Не догоняю как на нём написать к примеру VV>
VV>a[i+1]=&a[i+2];
VV>
VV>Заранее спасибо...
Как-то так:
Операция Arg1 Arg2 Arg3
-------------------------------
сложение i 2 temp1 // вычисляем индекс массива в правой части
адрес-индекса a temp1 temp2 // берём адрес элемента массива в правой части
сложение i 1 temp3 // вычисляем индекс массива в левой части
адрес-индекса a temp3 temp4 // берём адрес элемента массива в левой части
переместить temp2 temp4 // присвоение.
Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.
Здравствуйте, 0x7be, Вы писали:
0>[/asm] 0>Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.
Как-то думал что трёхадресный код аппаратно независимый ...
А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент?
где-то слышал что есть аппаратно независимые оптимизации и представления внутри компиляторов ... дак это только абстрактносинтаксическое дерево только независимо?
Здравствуйте, VjcheslavV, Вы писали:
VV>Здравствуйте, 0x7be, Вы писали:
0>>[/asm] 0>>Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.
VV>Как-то думал что трёхадресный код аппаратно независимый ... VV>А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент? VV>где-то слышал что есть аппаратно независимые оптимизации и представления внутри компиляторов ... дак это только абстрактносинтаксическое дерево только независимо?
Конечно он аппаратно-независимый, но какая-то архитектура команд у конкретной реализации трёхадресного кода должна быть.
Здравствуйте, 0x7be, Вы писали:
VV>>А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент?
0>Конечно он аппаратно-независимый, но какая-то архитектура команд у конкретной реализации трёхадресного кода должна быть.
Всю жизнь сщитал что аппаратно-независимый — не связан с какой либо архитектурой ... В чём разница?
Здравствуйте, VjcheslavV, Вы писали:
VV>Всю жизнь сщитал что аппаратно-независимый — не связан с какой либо архитектурой ... В чём разница?
Аппаратно-независимый код не связан с архитектурой конкретного железа. Но у виртуальной машины тоже есть своя архитектура.
Вот, например: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html
Список инструкций виртуальной машины java. Он не привязан ни к какому железу, но он есть, и он является частью архитектуры JVM.
0>Операция Arg1 Arg2 Arg3
0>-------------------------------
0>сложение i 2 temp1 // вычисляем индекс массива в правой части
0>адрес-индекса a temp1 temp2 // берём адрес элемента массива в правой части
0>сложение i 1 temp3 // вычисляем индекс массива в левой части
0>адрес-индекса a temp3 temp4 // берём адрес элемента массива в левой части
0>переместить temp2 *temp4 // присвоение.
0>
Здравствуйте, VVVa, Вы писали:
VVV>Здравствуйте, 0x7be, Вы писали:
0>>Как-то так:
0>>
0>>Операция Arg1 Arg2 Arg3
0>>-------------------------------
0>>сложение i 2 temp1 // вычисляем индекс массива в правой части
0>>адрес-индекса a temp1 temp2 // берём адрес элемента массива в правой части
0>>сложение i 1 temp3 // вычисляем индекс массива в левой части
0>>адрес-индекса a temp3 temp4 // берём адрес элемента массива в левой части
0>>переместить temp2 *temp4 // присвоение.
0>>
VVV>вроде ошибка затесалась * не хватает
В смысле? Умножение на размер элемента массива у меня подразумевается в операции "адрес индекса". Она под капотом содержит вычисление смещения по индексу и размеру элемента и сложение с базовым адресом.
Но это, конечно, можно расписать более подробно.
Здравствуйте, 0x7be, Вы писали:
VVV>>вроде ошибка затесалась * не хватает 0>В смысле? Умножение на размер элемента массива у меня подразумевается в операции "адрес индекса". Она под капотом содержит вычисление смещения по индексу и размеру элемента и сложение с базовым адресом. 0>Но это, конечно, можно расписать более подробно.
Не понял Вроде в Arg3 переменные а в последнем случае нужно в адрес который в этой переменной ...
VVV>Не понял Вроде в Arg3 переменные а в последнем случае нужно в адрес который в этой переменной ...
Да, я там в плане разыменовывания указателей был неаккуратен.
Здравствуйте, 0x7be, Вы писали:
0>Да, я там в плане разыменовывания указателей был неаккуратен.
Блин !!! Совсем что-то не то получилось ...
Немного покурив бамбук вспомнил что переменные с которых берётся адрес или которые в регистре не помещаются вообще в 3 адресном коде не должны участвовать
тоесть там только 3 переменные должны быть
3 адресный код это только чтобы SAA представления сделать...
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, VjcheslavV, Вы писали:
VV>>
VV>>a[i+1]=&a[i+2];
VV>>
Pzz>Выглядит, как бред...
Кстати да — просто не помнил что с массивами нужно делать — их в отдельное представление вроде выносят (на сколько я подразумеваю)
Например вызов функции с параметрами вроде тоже не 3 адресное представление
Или я ошибаюсь?
VVV>Кстати да — просто не помнил что с массивами нужно делать — их в отдельное представление вроде выносят (на сколько я подразумеваю) VVV>Например вызов функции с параметрами вроде тоже не 3 адресное представление VVV>Или я ошибаюсь?
Ошибаешься.
Можно придумать любую архитектуру машины.
Например JVM — стековая.
Можно сделать двух- или одно-адресную.
Для массивов — это просто адрес первого элемента в памяти.
А потом просто увеличивай адрес для перехода к следующему элементу.
Интел — это смесь стековой и 1-, 2-, 3- и безадресной архитектуры, да еще с регистрами.
Трехадресная — для арифметики: 1-й операндб 2-операнд, результат.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали: LVV>Ошибаешься. LVV>Можно придумать любую архитектуру машины. LVV>Например JVM — стековая. LVV>Можно сделать двух- или одно-адресную. LVV>Для массивов — это просто адрес первого элемента в памяти. LVV>А потом просто увеличивай адрес для перехода к следующему элементу. LVV>Интел — это смесь стековой и 1-, 2-, 3- и безадресной архитектуры, да еще с регистрами. LVV>Трехадресная — для арифметики: 1-й операндб 2-операнд, результат.
Если всё так по разному в зависимости от архитектуры — то как потом в SSA переводят?
Слышал что массивы и те переменные у которых берётся адрес в SSA не переводят — это правда?
а что с ними делают?
VV>Если всё так по разному в зависимости от архитектуры — то как потом в SSA переводят? VV>Слышал что массивы и те переменные у которых берётся адрес в SSA не переводят — это правда? VV>а что с ними делают?
1. Что такой SAA ?
2. Трехадресный код — это уже прямо перед генерацией целевого кода.
Так что массивы могут быть размещены в памяти этой виртуальной трехадресной машины.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали: LVV>1. Что такой SAA ? LVV>2. Трехадресный код — это уже прямо перед генерацией целевого кода. LVV>Так что массивы могут быть размещены в памяти этой виртуальной трехадресной машины. Static single assignment formhttps://ru.wikipedia.org/wiki/SSA
блин SSA
дак как в SSA переводят что в трёхадресный код не влазит?
VV>дак как в SSA переводят что в трёхадресный код не влазит?
Почему не влазит?
Попробуй на интеле написать сумму массива на ассемблере.
Команды 0-1-2 адресные.
для массива просто указывается стартовый адрес в памяти, и потом он увеличивается.
А сумму можно накапливать в регистре сопроцессора (если числа дробные)...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
VV>>дак как в SSA переводят что в трёхадресный код не влазит? LVV>Почему не влазит? LVV>Попробуй на интеле написать сумму массива на ассемблере. LVV>Команды 0-1-2 адресные. LVV>для массива просто указывается стартовый адрес в памяти, и потом он увеличивается. LVV>А сумму можно накапливать в регистре сопроцессора (если числа дробные)...
Слышал что массивы не оптимизируют при помощи SSA. Это так? (просто там получается что трудно контролировать записи в ячейку массива как я полагаю)
Дак что их просто оставляют просто так... а как тогда если SSA перенесётся при оптимизации как-нибудь??? например перенесётся test eax,ebx и jnz m1 ?