Сохраняется ли значение регистра xmm8 при вызовах? - PullRequest
0 голосов
/ 12 декабря 2018

Моя программа Windows, скомпилированная с использованием Visual Studio 2017, выполняет следующие действия:

  • вызывает подпрограмму с аргументом по умолчанию со значением 35.05.
  • инициализирует виртуальную машину Java через Cinterface
  • снова вызывает процедуру, которая имеет аргумент по умолчанию со значением 35.05.

При первом вызове аргумент по умолчанию получает правильное значение 35.05.Во втором вызове это значение является мусором.

Я посмотрел на сгенерированную сборку и во время первого вызова с аргументом по умолчанию 35.05 копируется в xmm8 из ячейки памяти и копируется в стек (это5-й параметр) и выполняется вызов:

0033d   48 8b 01     mov     rax, QWORD PTR [rcx]
00340   41 b8 14 00 00
00       mov     r8d, 20 // a default argument
00346   f3 44 0f 10 05
00 00 00 00  movss   xmm8, DWORD PTR __real@420c3333 // this is 35.05
0034f   f3 44 0f 11 44
24 28        movss   DWORD PTR [rsp+40], xmm8
00356   48 c7 44 24 20
1e 00 00 00  mov     QWORD PTR [rsp+32], 30 // a default argument
0035f   45 8d 48 05  lea     r9d, QWORD PTR [r8+5]
00363   b2 0f        mov     dl, 15 // a default argument
00365   ff 90 08 01 00
00       call    QWORD PTR [rax+264]

Затем выполняется вызов для инициализации JVM.

Затем для следующего вызова снова используется xmm8 для копирования значенияв стек:

00ce8   48 8b 01     mov     rax, QWORD PTR [rcx]
00ceb   41 b8 14 00 00
00       mov     r8d, 20
00cf1   f3 44 0f 11 44
24 28        movss   DWORD PTR [rsp+40], xmm8
00cf8   48 c7 44 24 20
1e 00 00 00  mov     QWORD PTR [rsp+32], 30
00d01   45 8d 48 05  lea     r9d, QWORD PTR [r8+5]
00d05   b2 0f        mov     dl, 15
00d07   ff 90 08 01 00
00       call    QWORD PTR [rax+264]

Но теперь xmm8 перезаписано.

Если я отключу вызов для инициализации JVM, то значение будет сохранено.

Вопрос в том, кто здесь не прав?JVM не сохраняет значение, или компилятор Microsoft ошибочно полагает, что значение xmm8 будет сохранено.

1 Ответ

0 голосов
/ 12 декабря 2018

Соглашение о вызовах Windows x64, обобщенное из Документы Microsoft .

RCX, RDX, R8 и R9, используются в качестве входных целочисленных параметров.XMM0L, XMM1L, XMM2L и XMM3L - входные параметры с плавающей точкой.RAX, R10, R11, XMM4 и XMM5 являются летучими.Все остальные, включая XMM8, являются энергонезависимыми.

Обратите внимание, что подстраница «Сохраненные регистры вызывающих / вызывающих абонентов» в настоящее время немного вводит в заблуждение, поскольку она не включает регистры SSE.

ОБНОВЛЕНИЕ: Любые дополнительные регистры для более новых наборов команд по умолчанию являются энергозависимыми.Это включает в себя верхние части YMM0-15 и ZMM0-15, а также ?MM16-31, если имеется.

...