cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;; @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; xmmsaving - assembly helpers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Copyright (C) 2009-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; available from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; you can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; General Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; The contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; of the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; VirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; CDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; You may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; terms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "iprt/asmdefs.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%include "VBox/vmm/stam.mac"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINCODE
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; DECLASM(int) XmmSavingTestLoadSet(const MYXMMREGSET *pSet, const MYXMMREGSET *pPrevSet, PRTUINT128U pBadVal);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @returns 0 on success, 1-based register number on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param pSet The new set.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param pPrevSet The previous set. Can be NULL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync; @param pBadVal Where to store the actual register value on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncBEGINPROC XmmSavingTestLoadSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync push xBP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xBP, xSP
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sub xSP, 32 ; Space for storing an XMM register (in TEST_REG).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and xSP, ~31 ; Align it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Unify register/arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef ASM_CALL64_GCC
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov r8, rdx ; pBadVal
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, rdi ; pSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, rsi ; pPrevSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef RT_ARCH_X86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xCX, [ebp + 8] ; pSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xDX, [ebp + 12] ; pPrevSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync test xDX, xDX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jz near .just_load
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Check that the old set is still correct.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%macro TEST_REG 1,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqa [xSP], xmm %+ %1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xDX + %1 * 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [xSP], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne %%bad
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xDX + %1 * 8 + xCB]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [xSP + xCB], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef RT_ARCH_X86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne %%bad
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xDX + %1 * 8 + xCB*2]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [xSP + xCB*2], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jne %%bad
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov xAX, [xDX + %1 * 8 + xCB*3]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cmp [xSP + xCB*3], xAX
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync je %%next
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%%bad:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov eax, %1 + 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return_copy_badval
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%%next:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endmacro
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 2
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 3
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 4
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 5
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 6
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 7
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef RT_ARCH_AMD64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 9
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 10
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 11
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 12
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 13
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 14
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TEST_REG 15
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; Load the new state.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.just_load:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm0, [xCX + 0*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm1, [xCX + 1*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm2, [xCX + 2*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm3, [xCX + 3*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm4, [xCX + 4*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm5, [xCX + 5*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm6, [xCX + 6*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm7, [xCX + 7*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef RT_ARCH_AMD64
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm8, [xCX + 8*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm9, [xCX + 9*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm10, [xCX + 10*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm11, [xCX + 11*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm12, [xCX + 12*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm13, [xCX + 13*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm14, [xCX + 14*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync movdqu xmm15, [xCX + 15*8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xor eax, eax
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return_copy_badval:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ; don't touch eax here.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%ifdef RT_ARCH_X86
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov edx, [ebp + 16]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [esp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [edx ], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [esp + 4]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [edx + 4], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [esp + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [edx + 8], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov ecx, [esp + 12]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [edx + 12], ecx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rdx, [rsp]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov rcx, [rsp + 8]
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [r8], rdx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync mov [r8 + 8], rcx
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync%endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync jmp .return
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync.return:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync leave
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ret
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncENDPROC XmmSavingTestLoadSet
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync