.file "xsave_asm32.s"
#include <sys/asm_linkage.h>
#include "xsave_util.h"
#define GET_FPU_XMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
movdqu %xmm##i, (%eax)
#define GET_FPU_YMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
vmovdqu %ymm##i, (%eax)
#define GET_FPU_ZMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
vmovdqu64 %zmm##i, (%eax)
#define GET_MASK(src, i) \
leal (0x800 + i * 8)(src), %eax; \
kmovq %k##i, (%eax)
ENTRY(xsu_getfpu)
movl 8(%esp), %eax
movl 4(%esp), %edx
cmpl $XSU_XMM, %eax
je get_xmm
cmpl $XSU_YMM, %eax
je get_ymm
cmpl $XSU_ZMM, %eax
je get_zmm
call abort
get_xmm:
GET_FPU_XMM(%edx, 0)
GET_FPU_XMM(%edx, 1)
GET_FPU_XMM(%edx, 2)
GET_FPU_XMM(%edx, 3)
GET_FPU_XMM(%edx, 4)
GET_FPU_XMM(%edx, 5)
GET_FPU_XMM(%edx, 6)
GET_FPU_XMM(%edx, 7)
jmp get_done
get_ymm:
GET_FPU_YMM(%edx, 0)
GET_FPU_YMM(%edx, 1)
GET_FPU_YMM(%edx, 2)
GET_FPU_YMM(%edx, 3)
GET_FPU_YMM(%edx, 4)
GET_FPU_YMM(%edx, 5)
GET_FPU_YMM(%edx, 6)
GET_FPU_YMM(%edx, 7)
jmp get_done
get_zmm:
GET_FPU_ZMM(%edx, 0)
GET_FPU_ZMM(%edx, 1)
GET_FPU_ZMM(%edx, 2)
GET_FPU_ZMM(%edx, 3)
GET_FPU_ZMM(%edx, 4)
GET_FPU_ZMM(%edx, 5)
GET_FPU_ZMM(%edx, 6)
GET_FPU_ZMM(%edx, 7)
GET_MASK(%edx, 0)
GET_MASK(%edx, 1)
GET_MASK(%edx, 2)
GET_MASK(%edx, 3)
GET_MASK(%edx, 4)
GET_MASK(%edx, 5)
GET_MASK(%edx, 6)
GET_MASK(%edx, 7)
get_done:
ret
SET_SIZE(xsu_getfpu)
#define SET_FPU_XMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
movdqu (%eax), %xmm##i
#define SET_FPU_YMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
vmovdqu (%eax), %ymm##i
#define SET_FPU_ZMM(src, i) \
leal (i * XSU_ZMM_U32 * 4)(src), %eax; \
vmovdqu64 (%eax), %zmm##i
#define SET_MASK(src, i) \
leal (0x800 + i * 8)(src), %eax; \
kmovq (%eax), %k##i
ENTRY(xsu_setfpu)
movl 8(%esp), %eax
movl 4(%esp), %edx
cmpl $XSU_XMM, %eax
je set_xmm
cmpl $XSU_YMM, %eax
je set_ymm
cmpl $XSU_ZMM, %eax
je set_zmm
call abort
set_xmm:
SET_FPU_XMM(%edx, 0)
SET_FPU_XMM(%edx, 1)
SET_FPU_XMM(%edx, 2)
SET_FPU_XMM(%edx, 3)
SET_FPU_XMM(%edx, 4)
SET_FPU_XMM(%edx, 5)
SET_FPU_XMM(%edx, 6)
SET_FPU_XMM(%edx, 7)
jmp set_done
set_ymm:
SET_FPU_YMM(%edx, 0)
SET_FPU_YMM(%edx, 1)
SET_FPU_YMM(%edx, 2)
SET_FPU_YMM(%edx, 3)
SET_FPU_YMM(%edx, 4)
SET_FPU_YMM(%edx, 5)
SET_FPU_YMM(%edx, 6)
SET_FPU_YMM(%edx, 7)
jmp set_done
set_zmm:
SET_FPU_ZMM(%edx, 0)
SET_FPU_ZMM(%edx, 1)
SET_FPU_ZMM(%edx, 2)
SET_FPU_ZMM(%edx, 3)
SET_FPU_ZMM(%edx, 4)
SET_FPU_ZMM(%edx, 5)
SET_FPU_ZMM(%edx, 6)
SET_FPU_ZMM(%edx, 7)
SET_MASK(%edx, 0)
SET_MASK(%edx, 1)
SET_MASK(%edx, 2)
SET_MASK(%edx, 3)
SET_MASK(%edx, 4)
SET_MASK(%edx, 5)
SET_MASK(%edx, 6)
SET_MASK(%edx, 7)
set_done:
ret
SET_SIZE(xsu_setfpu)