Подскажите пожалуйста как можно оптимизировать такую конструкцию? тут может и быть или не быть: Code (Text): shl r2,1 и дальше: Code (Text): cmp r1,r2 j[cond] label add r1,r2 mov r0,r1 label: и еще сработает ли такое в FASMe: Code (Text): macro haha {irps inst, add sub mov shl shr ; и т.д. \{ irps cond, eq c z ae ge b nc ne le l be a o no s ns ; и т.д. \\{ ;inst\#cond fix inst cond , \\} \} } addeq fix add eq, addz fix add z, и т.д.
yaskhan Оптимизация по скорости или по величине кода? shl r1,1 можно заменить на 1) add r1,r1 2) imul r1,2 3) lea r1,[r1+r1] 4) lea r1,[r1*2]
--Оптимизация по скорости или по величине кода? по скорости мне надо избавится от прыжка короче хочу создать эквивалент АРМ типа addeq r0,r1,r2,shl,1 макрос уже создал, но думал что можно оптимизировать. Хочу создать АРМ\Интел\32\64 совместимый ассемлер на основе ФАСМ макросов
yaskhan по скорости нужно делать цикл в 1000000 и замерять количество тактов через RDTSC лучше перечитай цикл статей Агнера Фога на сайте, но лучше всего тебе сможет ответить leo r0, r1, r2 это обобщенное название регистров или это не Intel? cmp r1,r2/j[cond] label можно заменить на fcmov[cond], set[cond], cmov[cond] если [cond] подразумевает анализ CarryFlag, то можно использовать SBB r1,r1 ADC r1,0 и SALC
--r0, r1, r2 это обобщенное название регистров или это не Intel? обобщенное FASMPRE.exe говорит что можно, но есть ошибка: Code (Text): inst\\#cond fix inst cond ,
я оптимизировал так, не знаю быстрее или нет: Code (Text): ; cmp r1,r2 ; j[cond] label ; add r1,r2 ; mov r0,r1 ; label: push r3 xor r3,r3 shl r2, 1 ;# -- могут и не быть cmp r1, r2 cmov[] r3, r2 add r1, r3 mov r0, r1 ;# -- могут и не быть pop r3
ааа я же написал: Code (Text): cmp r1,r2 j[cond] label add r1,r2 label: mov r0,r1 тогда так чтоли? Code (Text): push r3 xor r3,r3 shl r2, 1 ;# -- могут и не быть cmp r1, r2 cmov[] r3, r2 add r1, r3 сmov[] r0, r1 ;# -- могут и не быть pop r3 если ты имел ввиду написать мою версию понятным языком, то вот: Code (Text): temp=0 if r1 > r2 temp=r2 r0=r1+temp else r1=r1+temp
yaskhan как вариант mov r0,r1 cmp r1,r2 sbb r3,r3; if Carry=1 r3=-1 else r3=0 and r3,r2; if Carry=1 r3=r2 else r3=0 add r0,r3
yaskhan Во-первых, если уж Вы используете fix, то эта директива должна быть строго вторым символом на строке. А у Вас четвёртым, а то и пятым (после inst\\, потом #, потом cond, а потом уже fix). Естесственно, fix в такой ситуации обрабатываться не будет. Во-вторых, даже если сделать таки fix вторым символом, он здесь вообще не поможет, т.к. он обрабатывается перед всеми раскрытиями макросов. В результате ни inst, ни cond подставлены не будут. По этой же причине имеет место "во-первых". В общем, переопределять здесь надо либо с помощью define/equ либо с помощью macro. Как-то так: Code (Text): macro haha { irps inst, add sub mov shl shr \{ irps cond, eq c z ae ge b nc ne le l be a o no s ns \\{ inst\\#cond equ inst cond , \\} \} } P.S. Используйте fix по-реже. Она необходима только в очень редких случаях. Например, когда надо переопределить директиву препроцессора.
l_inc Но в ФасмПре.ехе работает же Вчера ночью провел тест, и вот результаты. Но в оптимизированной версии не было команды пуш и поп потому что компилятор почему то выдавал ошибки стандартный вариант: 127 тактов опт. вариант: 53 тактов Так как это мое первое тестирование, я чета сомневаюсь что правильно все сделал. Прикрепил исходник теста если что не так, скажите пожалуйста. И потом, че за ошибка с пуш и поп?
yaskhan И что? Вам достаточно выхода после fasmpre.exe? Тогда в чём вопрос? Пользуйтесь fasmpre.exe. Кстати, советую проверить, соответствует ли выход fasmpre.exe Вашим ожиданиям.
Вот как быть в током случае? нужно чтобы при использовании регистра устанавливался флаг Code (Text): reguse equ 0 ... macro r3 { [ebp-4] reguse equ 1 } ... mov r0,r3 так не работает
yaskhan Инлайн-макросы в fasm не допускаются. Соответственно макрос (определённый через macro) раскрывается только тогда, когда обращение к нему является первым символом в строке (не считая метки, определённые через двоеточие). r3 в данном случае — четвёртый символ. Поэтому и не работает. Чтобы иметь возможность проверять использование регистра в инструкции, придётся переопределять макросами все возможные инструкции и проверять их аргументы. Кроме того, если этим ограничиться, то, например, констркуция times 3 mov r0, r3 отрабатывать ожидаемым образом не будет. Поэтому нужно также переопределить и директиву times, причём рекурсивно (т.к. несколько times можно вкладывать друг в друга).
yaskhan Ну я надеюсь, понятно, почему такая конструкция не будет использовать макрос mov: Code (Text): macro mov arg1*,arg2* { display 'mov',13,10 } times 3 mov ax,bx mov не является первым символом на строке, поэтому раскрыт не будет. Соответстенно код скомпилируется просто в три инструкции mov ax,bx. Соответственно следует переопределить директиву times примерно следующим образом (учитывая опциональную возможность применения двоеточия): Code (Text): macro times [args] { common match count remainder1, args \{ define matched - match : remainder2, remainder1 \\{ repeat count remainder2 end repeat restore matched define matched + \\} match -, matched \\{ repeat count remainder1 end repeat \\} restore matched \} } Тогда прекрасно раскроется times 3 mov ax,bx, но облом будет с вариантом times 3 times 1 mov ax,bx, т.к. при раскрытии внешнего times вложенный times согласно fasm'овым правилам использует определение не в данный момент раскрываемого макроса, а предыдущее определение (т.е. оригинальное значение times). Соответственно нужно определить times рекурсивно: Code (Text): macro define_times { macro times [args] \{ \common match count remainder1, args \\{ define matched - match : remainder2, remainder1 \\\{ define_times repeat count remainder2 end repeat purge times restore matched define matched + \\\} match -, matched \\\{ define_times repeat count remainder1 end repeat purge times \\\} restore matched \\} \} } define_times Вот теперь times переопределена верно. Даже times 3 times %:mov ax,bx раскроется правильно, т.к. знак процента используется директивой repeat так же, как и директивой times.
Если у кого есть идей или там хотите помочь на тему АРМ\Интел\32\64 совместимый ассемлер на основе ФАСМ макросов то пишите сюда: yaskhan<>jabber.ru
Бээлииин, почему я это раньше не нашел? http://sun.hasenbraten.de/vasm/ добавлено: упс, рано обрадовался :-(