[PATCH 5/8] ntdll: Add detection for PF_SSE_DAZ_MODE_AVAILABLE
James Eder
jimportal at gmail.com
Sun Oct 21 11:56:51 CDT 2012
Gah... hit the wrong reply button so here we go again for some.
On Sun, Oct 21, 2012 at 10:06 AM, Joris Huizer <joris_huizer at yahoo.com> wrote:
> On 10/21/2012 05:49 PM, James Eder wrote:
>>
>> On Sat, Oct 20, 2012 at 7:06 PM, Chris Robinson <chris.kcat at gmail.com>
>> wrote:
>>>
>>> On 10/20/2012 05:40 PM, James Eder wrote:
>>>>
>>>> + /* Intel says we need a zeroed 16-byte aligned buffer */
>>>> + char buffer[512 + 16];
>>>> + XMM_SAVE_AREA32 *state = (XMM_SAVE_AREA32 *)(((ULONG_PTR)buffer +
>>>> 15)
>>>> & ~15);
>>>> + memset(buffer, 0, sizeof(buffer));
>>>> +
>>>> + __asm__ __volatile__( "fxsave %0" : "=m" (*state) : "m" (*state) );
>>>
>>>
>>> Wouldn't this be simpler?
>>>
>>> DECLSPEC_ALIGN(16) XMM_SAVE_AREA32 state;
>>> memset(state, 0, sizeof(state));
>>> __asm__ __volatile__("fxsave %0" : "=m" (*&state) : "m" (*&state));
>>>
>>> May also want to make sure the two structs are packed.
>>>
>>>
>> I used that alignment method because I saw it done that way other
>> places in Wine. I figured there must have been a good reason for
>> doing it that way (issue with some build environments?) but perhaps
>> I'm being paranoid.
>>
>>
> I would think the construct is necessary when allocating memory (the
> allocation functions don't allow to require a certain alignment as far as I
> know)
> That might be where you saw this being done?
>
>
I was going off of save_fpux in dlls/ntdll/signal_i386.c:
static inline void save_fpux( CONTEXT *context )
{
#ifdef __GNUC__
/* we have to enforce alignment by hand */
char buffer[sizeof(XMM_SAVE_AREA32) + 16];
XMM_SAVE_AREA32 *state = (XMM_SAVE_AREA32 *)(((ULONG_PTR)buffer +
15) & ~15);
__asm__ __volatile__( "fxsave %0" : "=m" (*state) );
context->ContextFlags |= CONTEXT_EXTENDED_REGISTERS;
memcpy( context->ExtendedRegisters, state, sizeof(*state) );
#endif
}
--
Jim
More information about the wine-devel
mailing list