идиомы для сборки x86 - PullRequest
       15

идиомы для сборки x86

15 голосов
/ 15 апреля 2010

Я пытался овладеть языком ассемблера x86, и мне было интересно, есть ли быстрый и короткий эквивалент movl $1, %eax. Именно тогда я подумал, что список идиом, часто используемых в языке, возможно, будет хорошей идеей.

Это может включать предпочтительное использование xorl %eax, %eax вместо movl $0, %eax или testl %eax, %eax против cmpl $0, %eax.

О, и, пожалуйста, опубликуйте один пример на пост!

Ответы [ 10 ]

11 голосов
/ 16 апреля 2010

Вот еще одна интересная "идиома". Надеюсь, все знают, что деление - это большой расход времени даже по сравнению с умножением. Используя небольшую математику, можно умножить на обратную константу вместо деления на нее. Это выходит за рамки хитростей. Например, разделить на 5:

mov eax, some_number
mov ebx, 3435973837    // 32-bit inverse of 5
mul ebx

Теперь eax был разделен на 5 без использования медленного кода операции div. Вот список полезных констант для беззастенчивого деления, украденного у http://blogs.msdn.com/devdev/archive/2005/12/12/502980.aspx

3   2863311531
5   3435973837
7   3067833783
9   954437177
11  3123612579
13  3303820997
15  4008636143
17  4042322161

Для чисел, которых нет в списке, вам может потребоваться сделать сдвиг заранее (разделить на 6, shr 1, а затем умножить на обратное значение 3).

7 голосов
/ 15 апреля 2010

Используя LEA, например, умножение, как:

lea eax, [ecx+ecx*4]   

для EAX = 5 * ECX

6 голосов
/ 15 апреля 2010

на x64:

xor eax, eax 

для

xor rax, rax

(первый также неявно очищает верхнюю половину rax, но имеет меньший код операции)

5 голосов
/ 15 апреля 2010

Вы могли бы также, как оптимизировать в сборке. Тогда вам нужно спросить, что вы оптимизируете: размер или скорость? Во всяком случае, вот моя "идиома", замена для xchg:

xor eax, ebx
xor ebx, eax
xor eax, ebx
4 голосов
/ 16 апреля 2010

В петлях ...

  dec     ecx 
  cmp     ecx, -1       
  jnz     Loop              

есть

  dec     ecx  
  jns     Loop 

Быстрее и короче.

4 голосов
/ 15 апреля 2010

Расширение моего комментария:

Для не различающего процессора, такого как Pentium Pro, xorl %eax, %eax, похоже, зависит от %eax и, следовательно, должен ждать, пока значение этого регистра станет доступным. Более поздние процессоры на самом деле имеют дополнительную логику для распознавания этой инструкции как не имеющей каких-либо зависимостей.

Инструкции incl и decl устанавливают некоторые флаги, но оставляют другие без изменений. Это наихудшая ситуация, если флаги моделируются как один регистр с целью переупорядочения инструкций: любая инструкция, которая читает флаг после incl или decl, должна рассматриваться как зависящая от incl или decl ( в случае, если он читает один из флагов, которые устанавливает эта инструкция), а также в предыдущей инструкции, которая устанавливает флаги (в случае, если он читает один из флагов, которые эта команда не устанавливает). Решением было бы разделить регистр флагов на две части и рассмотреть зависимости с этим более мелким зерном ... но у AMD была лучшая идея и полностью удалили эти инструкции из 64-битного расширения, которое они предложили несколько лет назад.

Что касается ссылок, я нашел это либо в руководствах Intel, ссылки на которые бесполезны, поскольку они находятся на корпоративном веб-сайте, который реорганизуется каждые шесть месяцев, либо на сайте Agner Fog: http://www.agner.org/optimize/#manuals

2 голосов
/ 15 апреля 2010

Не знаю, считается ли это идиомой, но на большинстве процессоров до i7

movq xmm0, [eax]
movhps xmm0, [eax+8]

или, если SSE3 доступен,

lddqu xmm0, [eax]

быстрее для чтения из невыровненной области памяти, чем

movdqu xmm0, [eax]
2 голосов
/ 15 апреля 2010

Еще один (кроме xor) для

mov eax, 0   ; B800000000h

это

sub eax, eax ; 29C0h

Обоснование: меньший код операции

2 голосов
/ 15 апреля 2010

Использование SHL и SHR для умножения / деления на степень 2

1 голос
/ 07 марта 2011

Самая ранняя ссылка на деление на инвариантные целые числа, которая больше, чем просто обратное умножение, находится здесь: Торбьерн Гранлунд из Королевского технологического института в Стокгольме . Проверьте его публикации

...