Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating some places to cover xmm16-xmm31 #84088

Merged
merged 2 commits into from
Mar 29, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
56 changes: 28 additions & 28 deletions docs/design/coreclr/botr/clr-abi.md
Original file line number Diff line number Diff line change
Expand Up @@ -711,34 +711,34 @@ The general rules outlined in the System V x86_64 ABI documentation are followed
6. The following table describes register usage according to the System V x86_64 ABI

```
| Register | Usage | Preserved across |
| | | function calls |
|--------------|-----------------------------------------|-------------------|
| %rax | temporary register; with variable argu- | No |
| | ments passes information about the | |
| | number of SSE registers used; | |
| | 1st return argument | |
| %rbx | callee-saved register; optionally used | Yes |
| | as base pointer | |
| %rcx | used to pass 4st integer argument to | No |
| | to functions | |
| %rdx | used to pass 3rd argument to functions | No |
| | 2nd return register | |
| %rsp | stack pointer | Yes |
| %rbp | callee-saved register; optionally used | Yes |
| | as frame pointer | |
| %rsi | used to pass 2nd argument to functions | No |
| %rdi | used to pass 1st argument to functions | No |
| %r8 | used to pass 5th argument to functions | No |
| %r9 | used to pass 6th argument to functions | No |
| %r10 | temporary register, used for passing a | No |
| | function's static chain pointer | |
| %r11 | temporary register | No |
| %r12-%r15 | callee-saved registers | Yes |
| %xmm0-%xmm1 | used to pass and return floating point | No |
| | arguments | |
| %xmm2-%xmm7 | used to pass floating point arguments | No |
| %xmm8-%xmm15 | temporary registers | No |
| Register | Usage | Preserved across |
| | | function calls |
|---------------|-----------------------------------------|-------------------|
| %rax | temporary register; with variable argu- | No |
| | ments passes information about the | |
| | number of SSE registers used; | |
| | 1st return argument | |
| %rbx | callee-saved register; optionally used | Yes |
| | as base pointer | |
| %rcx | used to pass 4st integer argument to | No |
| | to functions | |
| %rdx | used to pass 3rd argument to functions | No |
| | 2nd return register | |
| %rsp | stack pointer | Yes |
| %rbp | callee-saved register; optionally used | Yes |
| | as frame pointer | |
| %rsi | used to pass 2nd argument to functions | No |
| %rdi | used to pass 1st argument to functions | No |
| %r8 | used to pass 5th argument to functions | No |
| %r9 | used to pass 6th argument to functions | No |
| %r10 | temporary register, used for passing a | No |
| | function's static chain pointer | |
| %r11 | temporary register | No |
| %r12-%r15 | callee-saved registers | Yes |
| %xmm0-%xmm1 | used to pass and return floating point | No |
| | arguments | |
| %xmm2-%xmm7 | used to pass floating point arguments | No |
| %xmm8-%xmm31 | temporary registers | No |
```

# Calling convention specifics for x86
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/codegencommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5345,7 +5345,7 @@ void CodeGen::genFinalizeFrame()

#if defined(TARGET_XARCH)
// Compute the count of callee saved float regs saved on stack.
// On Amd64 we push only integer regs. Callee saved float (xmm6-xmm15)
// On Amd64 we push only integer regs. Callee saved float (xmm6-xmm31)
// regs are stack allocated and preserved in their stack locations.
compiler->compCalleeFPRegsSavedMask = maskCalleeRegsPushed & RBM_FLT_CALLEE_SAVED;
maskCalleeRegsPushed &= ~RBM_FLT_CALLEE_SAVED;
Expand Down
11 changes: 7 additions & 4 deletions src/coreclr/jit/emitxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9669,14 +9669,14 @@ const char* emitter::emitRegName(regNumber reg, emitAttr attr, bool varName)
return emitXMMregName(reg);

case EA_8BYTE:
if ((REG_XMM0 <= reg) && (reg <= REG_XMM15))
if (IsXMMReg(reg))
{
return emitXMMregName(reg);
}
break;

case EA_4BYTE:
if ((REG_XMM0 <= reg) && (reg <= REG_XMM15))
if (IsXMMReg(reg))
{
return emitXMMregName(reg);
}
Expand Down Expand Up @@ -9759,21 +9759,24 @@ const char* emitter::emitRegName(regNumber reg, emitAttr attr, bool varName)

switch (EA_SIZE(attr))
{
case EA_64BYTE:
return emitZMMregName(reg);

case EA_32BYTE:
return emitYMMregName(reg);

case EA_16BYTE:
return emitXMMregName(reg);

case EA_8BYTE:
if ((REG_XMM0 <= reg) && (reg <= REG_XMM7))
if (IsXMMReg(reg))
{
return emitXMMregName(reg);
}
break;

case EA_4BYTE:
if ((REG_XMM0 <= reg) && (reg <= REG_XMM7))
if (IsXMMReg(reg))
{
return emitXMMregName(reg);
}
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/lclvars.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6391,7 +6391,7 @@ void Compiler::lvaAssignVirtualFrameOffsetsToLocals()
lvaIncrementFrameSize(extraSlotSize);
}

// In case of Amd64 compCalleeRegsPushed does not include float regs (Xmm6-xmm15) that
// In case of Amd64 compCalleeRegsPushed does not include float regs (xmm6-xmm31) that
// need to be pushed. But Amd64 doesn't support push/pop of xmm registers.
// Instead we need to allocate space for them on the stack and save them in prolog.
// Therefore, we consider xmm registers being saved while computing stack offsets
Expand Down
72 changes: 72 additions & 0 deletions src/coreclr/jit/unwindamd64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,78 @@ short Compiler::mapRegNumToDwarfReg(regNumber reg)
case REG_XMM15:
dwarfReg = 32;
break;
case REG_XMM16:
tannergooding marked this conversation as resolved.
Show resolved Hide resolved
dwarfReg = 67;
break;
case REG_XMM17:
dwarfReg = 68;
break;
case REG_XMM18:
dwarfReg = 69;
break;
case REG_XMM19:
dwarfReg = 70;
break;
case REG_XMM20:
dwarfReg = 71;
break;
case REG_XMM21:
dwarfReg = 72;
break;
case REG_XMM22:
dwarfReg = 73;
break;
case REG_XMM23:
dwarfReg = 74;
break;
case REG_XMM24:
dwarfReg = 75;
break;
case REG_XMM25:
dwarfReg = 76;
break;
case REG_XMM26:
dwarfReg = 77;
break;
case REG_XMM27:
dwarfReg = 78;
break;
case REG_XMM28:
dwarfReg = 79;
break;
case REG_XMM29:
dwarfReg = 80;
break;
case REG_XMM30:
dwarfReg = 81;
break;
case REG_XMM31:
dwarfReg = 82;
break;
case REG_K0:
dwarfReg = 118;
break;
case REG_K1:
dwarfReg = 119;
break;
case REG_K2:
dwarfReg = 120;
break;
case REG_K3:
dwarfReg = 121;
break;
case REG_K4:
dwarfReg = 122;
break;
case REG_K5:
dwarfReg = 123;
break;
case REG_K6:
dwarfReg = 124;
break;
case REG_K7:
dwarfReg = 125;
break;
default:
noway_assert(!"unexpected REG_NUM");
}
Expand Down