|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 28, 2003 13:23:50 Я привык к тому что сишный компилятор очень даже грамотно оптимизирует код, поэтому удивился, что такую конструкцию: int a = ...; if(a == -1) a = b; if(a == -1) a = 0; ... он просто перевел в такой straightforward вид mov eax, a cmp eax, 0FFFFFFFFh jnz @F mov eax, b cmp eax, 0FFFFFFFFh jnz @F xor eax, eax @@: Я уверен :) на ассемблере это можно оптимальнее по скорости сделать. У меня получилось. Может, у кого будет свой метод? Значение а в начале является результатом функции. |
|
|
Дата: Авг 28, 2003 14:00:35 · Поправил: Edmond masquer Ой, а что там вообще получать :))) if(a == -1) a = b; if(a == -1) a = 0; Короче: вот:
;; eax = a
inc eax
mov ebx,b
jnz short @1
inc ebx
jnz short @2
@1: mov eax,ebx
jmp short @3
@2:
dec eax
@3:
Код:
Время = 2 минуты %) (на написание)
|
|
|
Дата: Авг 28, 2003 15:02:51 Ха, если бы все было так просто - этой бы темы не было. :) Эдмонд, не обижайся, но у тебя код еще хуже чем сишный компилятор выдал - 3 прыжка!!! :)))) Думаем дальше :) |
|
|
Дата: Авг 28, 2003 15:18:59 masquer А насколько хуже? Во первых ппыжка 2 и один безусловный |
|
|
Дата: Авг 28, 2003 15:24:38 · Поправил: Edmond Грубо!!! mov eax, a ;; 1-2 такта cmp eax, 0FFFFFFFFh ;; 3 такт jnz @F ;; 4 mov eax, b ;; 5-6 cmp eax, 0FFFFFFFFh ;; 7 jnz @F ;; 8 xor eax, eax ;; 9 @@:
;; eax = a
inc eax ;; 1
mov ebx,b ;; 1-2
jnz short @1 ;; 3
inc ebx ;; 3-4??
jnz short @2 ;; 5
@1: mov eax,ebx ;; 6
jmp short @3 ;; 7
@2:
dec eax ;; 8
@3:
У меня хуже? + При спаривании мой может дать в худшем случае 5-6 тактов. Единственно что я метки не выравнивал!!! |
|
|
Дата: Авг 28, 2003 15:27:29 masquer И потом, при a != 0ffffff мой код даёт только 4 такта Хотя конечно если ты проверил аппаратно, что мой хуже, то я молчу. |
|
|
Дата: Авг 28, 2003 17:33:28 Прыжки сами по себе зло. Можешь проверить по тактам (прям сейчас не могу) сколько твой код занимает и сколько сишный. Я к тому что нужно уменьшать количество прыжков до минимума, я до нуля уменьшил :) Просто хочу еще варианты прикинуть. |
|
|
Дата: Авг 28, 2003 17:49:37 Пришлось подумать подольше %))) if(a == -1) a = b; if(a == -1) a = 0; test eax,-1 jnz @exit sub eax,b jz @exit @exit: |
|
|
Дата: Авг 28, 2003 17:53:52 Прыжки сами по себе зло. Да, правда. Хотя их можно спаривать с предыдущими командами |
|
|
Дата: Авг 28, 2003 18:08:39 Спаривать? Лучше их вообще убирать - зачем они? :) У тебя ошибка в последнем примере - когда a=-1, а b<>-1 бедет неправильно себя вести. Пробуй вообще без прыжков. |
|
|
Дата: Авг 28, 2003 18:17:05 · Поправил: Edmond Немного подправлю... masquer последнем примере - когда a=-1, а b<>-1 Ой, забыл add eax,b :(( (В голове висело, а на бумаге не написал jz..) test eax,-1 jnz @exit sub eax,b jz @exit mov eax,b @exit: |
|
|
Дата: Авг 28, 2003 18:22:30 Спаривать? Лучше их вообще убирать - зачем они? :) Да, и ещё это не так!!! Кстати в P4 с Jmp куда лучше |
|
|
Дата: Авг 28, 2003 18:22:45 Все равно медленно из-за прыжков :) |
|
|
Дата: Авг 28, 2003 18:30:09 masquer Слушай, крутой ты СЭР, а может покажешь КЛАСС??? :))) А я пока подумаю как без ПРЫЖКОВ СДЕЛАТЬ %)) |
|
|
Дата: Авг 28, 2003 18:45:42 Хорошо, только как крутому СЭРу :)))) В eax a находится по условию. mov edx, b rcl eax, 1 sbb ebx, ebx rcr eax, 1 not ebx and eax, ebx or edx, ebx rcl edx, 1 sbb ebx, ebx rcr edx, 1 not ebx and edx, ebx sub eax, edx sbb ebx, ebx not ebx and eax, ebx add eax, edx Просто, как 2х2 :)))) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097 |