Есть ли способ заставить MSVC передавать аргументы struct в регистрах на x64? - PullRequest
0 голосов
/ 25 марта 2010

Для функции с подписью:

struct Pair { void *v1, *v2 };
void f(Pair p);

скомпилированный на x64, я бы хотел, чтобы поля Pair передавались через регистр, как если бы функция была:

void f(void *v1, void *v2);

Компилируя тест с gcc 4.2.1 для x86_64 на OSX 10.6, я вижу, что именно это и происходит, изучая разборку. Однако при компиляции с MSVC 2008 для x64 в Windows разборка показывает, что Pair передается в стек. Я понимаю, что ABI платформы могут предотвратить эту оптимизацию; Кто-нибудь знает какие-либо аннотации MSVC, соглашения о вызовах, флаги или другие хаки, которые могут заставить это работать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Мой компилятор VS2008 x64 не делает то же самое, что ваш. Структура помещается в регистр XMM, она передает указатель на копию объекта пары в регистре:

    Pair p;
    f(p);
000000013F2B1189  movaps      xmm6,xmmword ptr [p] 
000000013F2B118E  lea         rcx,[p] 
000000013F2B1193  movdqa      xmmword ptr [p],xmm6 
000000013F2B1199  call        f (13F2B1000h) 

Здесь ничего не передается в стек.

0 голосов
/ 25 марта 2010

что если вы сделаете это?

   void f( void *ps ){
       struct Pair *p = (struct Pair *)ps;
   }

или

void f( unsigned long addr ){
    struct Pair *p = (struct Pair *)addr;
}

struct Pair pp;

f( reinterpret_cast<unsigned long>(&pp) );
...