· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Brain vs C compiler

. 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . >>

Посл.отвђт Сообщен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 :))))

. 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097