Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 377 → Rev 378

/kernel/trunk/core/fpu.inc
36,41 → 36,95
fnsave [fpu_data]
ret
 
; param
; eax= 512 bytes memory area
 
align 4
proc fpu_save
fpu_save:
push ecx
push esi
push edi
 
pushfd
cli
 
clts
mov ebx, [fpu_owner]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
mov edi, eax
 
mov ecx, [fpu_owner]
mov eax, [CURRENT_TASK]
cmp ecx, eax
jne .save
.copy:
shl eax, 8
mov esi, [eax+PROC_BASE+APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
fninit
 
popfd
pop edi
pop esi
pop ecx
ret
.save:
mov [fpu_owner], eax
 
shl ecx, 8
mov ecx, [ecx+PROC_BASE+APPDATA.fpu_state]
 
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
 
fxsave [eax]
fninit ;re-init fpu
ret
fxsave [ecx]
jmp .copy
.no_SSE:
fnsave [eax]
ret
endp
fnsave [ecx]
jmp .copy
 
align 4
proc fpu_restore
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
fpu_restore:
push ecx
push esi
 
mov esi, eax
 
pushfd
cli
 
mov ecx, [fpu_owner]
mov eax, [CURRENT_TASK]
cmp ecx, eax
jne .copy
 
clts
 
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
 
fxrstor [eax]
fxrstor [esi]
popfd
pop esi
pop ecx
ret
.no_SSE:
fnclex ;fix possible problems
frstor [eax]
frstor [esi]
popfd
pop esi
pop ecx
ret
endp
.copy:
shl eax, 8
mov edi, [eax+PROC_BASE+APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
popfd
pop esi
pop ecx
ret
 
align 4
e7: ;#NM exception handler