Added support for invoke(_int128) in syscall. OWORD will span registers and REAL16 (and floats) will use xmm.

__int128 typedef oword

__float128 typedef real16

Three 128-bit register arguments may be used:

p1 proc syscall a1:__int128, a2:__int128, a3:__int128

mov rax,a1 ; RDI: high64 in RSI

mov rax,a2 ; RDX: high64 in RCX

mov rax,a3 ; R8: high64 in R9

ret

p1 endp

In addition to six 128-bit xmm arguments:

p2 proc syscall a1:__int128, a2:__int128, a3:__int128, a4:__float128, a5:__float128, a6:__float128

p1(a1, a2, a3) ; no params set

movaps xmm0,a4 ; xmm0

movaps xmm0,a5 ; xmm1

movaps xmm0,a6 ; xmm2

ret

p2 endp

Spanning of args, const and memory. Negative values extends to HIGH64 if sign are used and value not zero:

.data

x __int128 0

...

p1( 0, 1, 2 )

* mov r8d, 2

* xor r9d, r9d

* mov edx, 1

* xor ecx, ecx

* xor edi, edi

* xor esi, esi

p1( 0x0000000000000000FFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF0000000000000000,

0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF )

* mov r8, low64 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

* mov r9, high64 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

* xor edx, edx

* mov rcx, high64 0xFFFFFFFFFFFFFFFF0000000000000000

* mov rdi, low64 0x0000000000000000FFFFFFFFFFFFFFFF

* xor esi, esi

p1( -0, -1, x )

* mov r8, qword ptr x

* mov r9, qword ptr x[8]

* mov rdx, low64 -1

* mov rcx, -1

* xor edi, edi

* xor esi, esi