sab123: (Default)
[personal profile] sab123
А вы знаете, что на AMD64 gcc использует другую конвенцию вызовов, чем написана в АМДшной книжке? Вот, знайте. Они решили, что можно больше параметров передавать в регистрах. И немножко в другом порядке.

Если кому интересно, то:

Целые - rdi, rsi, rdx, rcx, r8, r9
Плавающие - xmm0, ..., xmm5

Все, что больше 6 аргументов, передается на стеке. Для регистровых аргументов на стеке оставляется место. Нумерация целых и плавающих идет совместно, т.е. например func(int, double, int) будет использовать rdi, xmm1, rdx. Со структурами как-то не очень понятно, они раздергиваются на куски и каждый кусок помещается в регистр согласно своему типу.

Locations of visitors to this page

Date: 2008-12-22 10:35 pm (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
Ну десяток-другой байт в стеке не особенно жаль, но каков тайный смысл пропускать регистры (как пропущен rsi в данном примере)?

Date: 2008-12-23 02:31 am (UTC)
From: [identity profile] sab123.livejournal.com
Фиг знает. Может, повышает надежность при кривой сигнатуре вызова. Т.е. если кто-то вызовет функцию с одним из аргументов int вместо float, в этом аргументе будет мусор, но хотя бы остальные не съедут. Хотя это в-принципе можно бы проверять и адаптировать в линкере.

Date: 2008-12-23 02:42 am (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
> Т.е. если кто-то вызовет функцию с одним из аргументов int вместо float,
> в этом аргументе будет мусор, но хотя бы остальные не съедут.

Странный довод, согласись. Примерно как в анекдоте про машинистку: "А я могу печатать тысячу знаков в минуту! Правда такая х-ня получается..." И тут тоже самое. Несколько понизить вероятность падения программы по segfault, несколько увеличив вероятность "насчитать х-ню". Второе, пожалуй, даже хуже.

P.S. А если я передам в качестве аргумента union { int i; double d; } его как раскидает?

Date: 2008-12-23 03:04 pm (UTC)
From: [identity profile] sab123.livejournal.com
В-общем, вот тут бумага:
http://mirror-fpt-telecom.fpt.net/gcc/summit/2003/Porting%20gcc%20to%20the%20amd64.pdf
Я ее не дочитал.

А как оно юнион раскидает - интересный вопрос. Попробуй :-)

Date: 2008-12-23 03:07 pm (UTC)
From: [identity profile] sab123.livejournal.com
А, второй момент: родная АМДшная конвенция имеет такой же подход к регистрам. Только там набор поменьше:

rcx, rdx, r8, r9
xmm0, ..., xmm3

January 2026

S M T W T F S
     12 3
45 6 7 8 9 10
11 12 13 14 151617
1819202122 23 24
25 26 2728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 09:03 pm
Powered by Dreamwidth Studios