corda/src/x86.masm
Joel Dice 87b02eb949 update copyright years
Previously, I used a shell script to extract modification date ranges
from the Git history, but that was complicated and unreliable, so now
every file just gets the same year range in its copyright header.  If
someone needs to know when a specific file was modified and by whom,
they can look at the Git history themselves; no need to include it
redundantly in the header.
2013-07-02 20:52:38 -06:00

168 lines
2.7 KiB
Plaintext

comment #
Copyright (c) 2008-2013, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details.
ORIGIN: https://github.com/gkvas/avian/tree/wince
#
.586
.MODEL FLAT, C
VOID_TYPE equ 0
INT8_TYPE equ 1
INT16_TYPE equ 2
INT32_TYPE equ 3
INT64_TYPE equ 4
FLOAT_TYPE equ 5
DOUBLE_TYPE equ 6
POINTER_TYPE equ 7
CHECKPOINT_THREAD equ 4
CHECKPOINT_STACK equ 24
CHECKPOINT_BASE equ 28
_TEXT SEGMENT
public C detectFeature
detectFeature:
push ebp
mov ebp,esp
push edx
push ecx
push ebx
push esi
push edi
mov esi,ds:dword ptr[12+ebp]
mov edi,ds:dword ptr[8+ebp]
mov eax,1
cpuid
and edx,esi
and ecx,edi
or ecx,edx
test ecx,ecx
je LNOSSE
mov eax,1
jmp LSSEEND
LNOSSE:
mov eax,0
LSSEEND:
pop edi
pop esi
pop ebx
pop ecx
pop edx
mov esp,ebp
pop ebp
ret
public C vmNativeCall
vmNativeCall:
push ebp
mov ebp,esp
mov ecx,ds:dword ptr[16+ebp]
sub esp,ecx
mov ecx,0
jmp Ltest
Lloop:
mov eax,ecx
mov edx,ecx
add edx,esp
add eax,ds:dword ptr[12+ebp]
mov eax,ds:dword ptr[eax]
mov ds:dword ptr[edx],eax
add ecx,4
Ltest:
cmp ecx,ds:dword ptr[16+ebp]
jb Lloop
call dword ptr[8+ebp]
mov ecx,ds:dword ptr[20+ebp]
Lvoid:
cmp ecx,offset VOID_TYPE
jne Lint64
jmp Lexit
Lint64:
cmp ecx,offset INT64_TYPE
jne Lfloat
jmp Lexit
Lfloat:
cmp ecx,offset FLOAT_TYPE
jne Ldouble
fstp ds:dword ptr[8+ebp]
mov eax,ds:dword ptr[8+ebp]
jmp Lexit
Ldouble:
cmp ecx,offset DOUBLE_TYPE
jne Lexit
fstp ds:qword ptr[8+ebp]
mov eax,ds:dword ptr[8+ebp]
mov edx,ds:dword ptr[12+ebp]
Lexit:
mov esp,ebp
pop ebp
ret
public C vmJump
vmJump:
mov esi,ds:dword ptr[4+esp]
mov ebp,ds:dword ptr[8+esp]
mov ebx,ds:dword ptr[16+esp]
mov eax,ds:dword ptr[20+esp]
mov edx,ds:dword ptr[24+esp]
mov esp,ds:dword ptr[12+esp]
jmp esi
VMRUN_FRAME_SIZE equ 24
public C vmRun_
vmRun_:
; 8(%ebp): function
; 12(%ebp): arguments
; 16(%ebp): checkpoint
push ebp
mov ebp,esp
sub esp,offset VMRUN_FRAME_SIZE
mov ds:dword ptr[8+esp],ebx
mov ds:dword ptr[12+esp],esi
mov ds:dword ptr[16+esp],edi
mov eax,ds:dword ptr[12+ebp]
mov ds:dword ptr[4+esp],eax
mov ecx,ds:dword ptr[16+ebp]
mov eax,ds:dword ptr[CHECKPOINT_THREAD+ecx]
mov ds:dword ptr[0+esp],eax
mov ds:dword ptr[CHECKPOINT_STACK+ecx],esp
call dword ptr[8+ebp]
public C vmRun_returnAddress
vmRun_returnAddress:
mov ebx,ds:dword ptr[8+esp]
mov esi,ds:dword ptr[12+esp]
mov edi,ds:dword ptr[16+esp]
add esp,offset VMRUN_FRAME_SIZE
pop ebp
ret
_TEXT ENDS
END