творческий подход
Dec. 22nd, 2008 01:28 pmА вы знаете, что на AMD64 gcc использует другую конвенцию вызовов, чем написана в АМДшной книжке? Вот, знайте. Они решили, что можно больше параметров передавать в регистрах. И немножко в другом порядке.
Если кому интересно, то:
Целые - rdi, rsi, rdx, rcx, r8, r9
Плавающие - xmm0, ..., xmm5
Все, что больше 6 аргументов, передается на стеке. Для регистровых аргументов на стеке оставляется место. Нумерация целых и плавающих идет совместно, т.е. например func(int, double, int) будет использовать rdi, xmm1, rdx. Со структурами как-то не очень понятно, они раздергиваются на куски и каждый кусок помещается в регистр согласно своему типу.

Если кому интересно, то:
Целые - rdi, rsi, rdx, rcx, r8, r9
Плавающие - xmm0, ..., xmm5
Все, что больше 6 аргументов, передается на стеке. Для регистровых аргументов на стеке оставляется место. Нумерация целых и плавающих идет совместно, т.е. например func(int, double, int) будет использовать rdi, xmm1, rdx. Со структурами как-то не очень понятно, они раздергиваются на куски и каждый кусок помещается в регистр согласно своему типу.
no subject
Date: 2008-12-22 10:35 pm (UTC)no subject
Date: 2008-12-23 02:31 am (UTC)no subject
Date: 2008-12-23 02:42 am (UTC)> в этом аргументе будет мусор, но хотя бы остальные не съедут.
Странный довод, согласись. Примерно как в анекдоте про машинистку: "А я могу печатать тысячу знаков в минуту! Правда такая х-ня получается..." И тут тоже самое. Несколько понизить вероятность падения программы по segfault, несколько увеличив вероятность "насчитать х-ню". Второе, пожалуй, даже хуже.
P.S. А если я передам в качестве аргумента union { int i; double d; } его как раскидает?
no subject
Date: 2008-12-23 03:04 pm (UTC)http://mirror-fpt-telecom.fpt.net/gcc/summit/2003/Porting%20gcc%20to%20the%20amd64.pdf
Я ее не дочитал.
А как оно юнион раскидает - интересный вопрос. Попробуй :-)
no subject
Date: 2008-12-23 03:07 pm (UTC)rcx, rdx, r8, r9
xmm0, ..., xmm3