The MASM Forum

64 bit assembler => UASM Assembler Development => Topic started by: TouEnMasm on November 25, 2020, 06:31:13 AM

Title: vectorcall
Post by: TouEnMasm on November 25, 2020, 06:31:13 AM
Hello,
I have a fonction who need the  __vectorcall.
UASM don't seem to support it.
Is there a way  to correct this ?

Title: Re: vectorcall
Post by: jj2007 on November 25, 2020, 08:27:51 AM
You have one function? Just load the registers manually, then use call thefunction
Title: Re: vectorcall
Post by: TouEnMasm on November 25, 2020, 06:58:26 PM

Good idea but ...
in c++
Quote
   the call look strange
   .data
   Eye    CXMVECTOR <0.0, 3.0, -6.0, 0.0> ; 4*REAL4
   At    CXMVECTOR < 0.0, 1.0, 0.0, 0.0 >
   Up    CXMVECTOR <0.0, 1.0, 0.0, 0.0>
   .code
   
   mov g_View,func(XMMatrixLookAtLH,addr Eye,addr At,addr Up)
;-------------------------------------------------------------------   
/quote]

in asm /FA

Quote
   FXMVECTOR  ptr XMVECTOR
;################################################################
XMMatrixLookAtLH PROC  EyePosition:FXMVECTOR ,FocusPosition:FXMVECTOR ,UpDirection:FXMVECTOR
         Local  retour:DWORD
         mov retour,1
   movaps   xmm2, XMMWORD PTR UpDirection
   movaps   xmm1, XMMWORD PTR FocusPosition
   movaps   xmm0, XMMWORD PTR EyePosition
   lea   eax, DWORD PTR $T4[ebp]               ;<<<<<<<<<<<<<<< created by c++ in stack ???????????????
   push   eax
   call   ?XMMatrixLookAtLH@@YA?AU_XMMATRIX@@T__m128@@00@Z ; XMMatrixLookAtLH

 FindeXMMatrixLookAtLH:
         mov eax,retour
         ret
XMMatrixLookAtLH endp
[



Title: Re: vectorcall
Post by: TouEnMasm on November 25, 2020, 07:29:40 PM
If i understand well,the space needed by XMMVECTOR (size=40h 64 ) is reserved on the stack as last argument

XMMATRIX    XM_CALLCONV     XMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection);


translate by C++ this give
Quote
extern "C" int _stdcall    AXMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection)
{
   XMMatrixLookAtLH(EyePosition,  FocusPosition, UpDirection);
   return 0;



Quote
;   COMDAT _AXMMatrixLookAtLH@48
_TEXT   SEGMENT
$T1 = -176                  ; size = 64
_UpDirection$ = -48               ; size = 16
_FocusPosition$ = -32               ; size = 16
_EyePosition$ = -16               ; size = 16
_AXMMatrixLookAtLH@48 PROC            ; COMDAT
; _EyePosition$ = xmm0
; _FocusPosition$ = xmm1
; _UpDirection$ = xmm2
; File H:\directx\Tutorial07\Tutorial07.cpp
; Line 31
   push   ebx
   mov   ebx, esp
   sub   esp, 8
   and   esp, -16            ; fffffff0H
   add   esp, 4
   push   ebp
   mov   ebp, DWORD PTR [ebx+4]
   mov   DWORD PTR [esp+4], ebp
   mov   ebp, esp
   sub   esp, 184            ; 000000b8H
   push   esi
   push   edi
   movaps   XMMWORD PTR _UpDirection$[ebp], xmm2
   movaps   XMMWORD PTR _FocusPosition$[ebp], xmm1
   movaps   XMMWORD PTR _EyePosition$[ebp], xmm0
; Line 32
   movaps   xmm2, XMMWORD PTR _UpDirection$[ebp]
   movaps   xmm1, XMMWORD PTR _FocusPosition$[ebp]
   movaps   xmm0, XMMWORD PTR _EyePosition$[ebp]
   lea   eax, DWORD PTR $T1[ebp]
   push   eax
   call   ?XMMatrixLookAtLH@@YA?AU_XMMATRIX@@T__m128@@00@Z ; XMMatrixLookAtLH
   add   esp, 4
; Line 33
   xor   eax, eax
; Line 34
   pop   edi
   pop   esi
   mov   esp, ebp
   pop   ebp
   mov   esp, ebx
   pop   ebx
   ret   0
_AXMMatrixLookAtLH@48 ENDP

Title: Re: vectorcall
Post by: LiaoMi on November 27, 2020, 04:26:02 AM
Hello,
I have a fonction who need the  __vectorcall.
UASM don't seem to support it.
Is there a way  to correct this ?

Hi TouEnMasm,

https://github.com/Terraspace/UASM/blob/master/regress/src/vcall/vectorcall.asm
Title: Re: vectorcall
Post by: TouEnMasm on November 27, 2020, 06:31:50 AM

Thanks , it's work only in 64 bits.
Title: Re: vectorcall
Post by: nidud on November 27, 2020, 09:54:00 AM
A vector resides in the CPU and not in memory so if vectorcall (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inc#L27) is used the arguments are passed in registers, else another calling convention is used and the function uses the stack.

XMMatrixLookAtLH (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inc#L943) proto XM_CALLCONV (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inc#L28) XMTHISPTR (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inc#L396), :FXMVECTOR (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inc#L292), :FXMVECTOR, :FXMVECTOR

If vectorcall is to be used (which it's made for) the proto type will be:

XMMatrixLookAtLH proto vectorcall :real16, :reral16, :real16

Note that real4 will work as well here given the arguments are SIMD registers. The returned value is 16 floats returned in xmm0..3. This is the main difference for this calling convention in 32-bit: it uses vector math insted of FPU.

The DirectXMath library resides in header files so it's inline function that is used rather than library functions. The function above is defined in DirectXMath.inl (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inl) as a macro using intrinsics (https://github.com/nidud/asmc/blob/master/include/intrin.inc).

Inline definition:

XMMatrixLookAtLH proto vectorcall :real16, :real16, :real16 {
    _mm_sub_ps(xmm1, xmm0)
    XMMatrixLookToLH (https://github.com/nidud/asmc/blob/master/include/DirectXMath.inl#L3024)(xmm0, xmm1, xmm2)
    }

Used in a Direct3D11 sample (https://github.com/nidud/asmc/blob/master/source/test/Direct3D11/Tutorial04.asm#L561):

    inl_XMMatrixLookAtLH( Eye, At, Up )
    inl_XMStoreMatrix( g_View )

Expanded as a 32-bit function call:

    .686
    .xmm
    .model flat, c
    .code

XMMatrixLookAtLH proc vectorcall EyePosition:real4, FocusPosition:real4, UpDirection:real4
    _mm_sub_ps(xmm2, xmm1)
    inl_XMMatrixLookToLH(xmm1, xmm2, xmm3)
    ret
XMMatrixLookAtLH endp

main proc
    XMMatrixLookAtLH(xmm0, xmm1, xmm2)
    ret
main endp

    end

Code produced:
Code: [Select]
.686
.xmm
.model flat

public XMMatrixLookAtLH@@12
public _main

extern _g_XMIdentityR3: xmmword
extern _g_XMMask3: xmmword
extern _g_XMInfinity: xmmword
extern _g_XMQNaN: xmmword
extern _g_XMSelect1110: xmmword


_text   SEGMENT PARA PUBLIC 'CODE'                      ; section number 1

XMMatrixLookAtLH@@12 PROC NEAR
        subps   xmm1, xmm0                              ; 0000 _ 0F 5C. C8
        movaps  xmm4, xmm2                              ; 0003 _ 0F 28. E2
        xorps   xmm6, xmm6                              ; 0006 _ 0F 57. F6
        subps   xmm6, xmm0                              ; 0009 _ 0F 5C. F0
        movaps  xmm0, xmm1                              ; 000C _ 0F 28. C1
        movaps  xmm1, xmm0                              ; 000F _ 0F 28. C8
        mulps   xmm1, xmm0                              ; 0012 _ 0F 59. C8
        movaps  xmm2, xmm1                              ; 0015 _ 0F 28. D1
        shufps  xmm2, xmm1, 153                         ; 0018 _ 0F C6. D1, 99
        addss   xmm1, xmm2                              ; 001C _ F3: 0F 58. CA
        shufps  xmm2, xmm2, 85                          ; 0020 _ 0F C6. D2, 55
        addss   xmm1, xmm2                              ; 0024 _ F3: 0F 58. CA
        xorps   xmm2, xmm2                              ; 0028 _ 0F 57. D2
        shufps  xmm1, xmm1, 0                           ; 002B _ 0F C6. C9, 00
        sqrtps  xmm3, xmm1                              ; 002F _ 0F 51. D9
        cmpneqps xmm1, xmmword ptr [_g_XMInfinity]      ; 0032 _ 0F C2. 0D, 00000000(d), 04
        divps   xmm0, xmm3                              ; 003A _ 0F 5E. C3
        cmpneqps xmm2, xmm3                             ; 003D _ 0F C2. D3, 04
        andps   xmm0, xmm2                              ; 0041 _ 0F 54. C2
        movaps  xmm2, xmm1                              ; 0044 _ 0F 28. D1
        andnps  xmm2, xmmword ptr [_g_XMQNaN]           ; 0047 _ 0F 55. 15, 00000000(d)
        andps   xmm1, xmm0                              ; 004E _ 0F 54. C8
        movaps  xmm0, xmm2                              ; 0051 _ 0F 28. C2
        orps    xmm0, xmm1                              ; 0054 _ 0F 56. C1
        movaps  xmm5, xmm0                              ; 0057 _ 0F 28. E8
        movaps  xmm0, xmm4                              ; 005A _ 0F 28. C4
        movaps  xmm1, xmm5                              ; 005D _ 0F 28. CD
        shufps  xmm0, xmm0, 201                         ; 0060 _ 0F C6. C0, C9
        movaps  xmm2, xmm0                              ; 0064 _ 0F 28. D0
        shufps  xmm1, xmm1, 210                         ; 0067 _ 0F C6. C9, D2
        movaps  xmm3, xmm1                              ; 006B _ 0F 28. D9
        mulps   xmm0, xmm1                              ; 006E _ 0F 59. C1
        shufps  xmm2, xmm2, 201                         ; 0071 _ 0F C6. D2, C9
        shufps  xmm3, xmm3, 210                         ; 0075 _ 0F C6. DB, D2
        mulps   xmm2, xmm3                              ; 0079 _ 0F 59. D3
        subps   xmm0, xmm2                              ; 007C _ 0F 5C. C2
        andps   xmm0, xmmword ptr [_g_XMMask3]          ; 007F _ 0F 54. 05, 00000000(d)
        movaps  xmm1, xmm0                              ; 0086 _ 0F 28. C8
        mulps   xmm1, xmm0                              ; 0089 _ 0F 59. C8
        movaps  xmm2, xmm1                              ; 008C _ 0F 28. D1
        shufps  xmm2, xmm1, 153                         ; 008F _ 0F C6. D1, 99
        addss   xmm1, xmm2                              ; 0093 _ F3: 0F 58. CA
        shufps  xmm2, xmm2, 85                          ; 0097 _ 0F C6. D2, 55
        addss   xmm1, xmm2                              ; 009B _ F3: 0F 58. CA
        xorps   xmm2, xmm2                              ; 009F _ 0F 57. D2
        shufps  xmm1, xmm1, 0                           ; 00A2 _ 0F C6. C9, 00
        sqrtps  xmm3, xmm1                              ; 00A6 _ 0F 51. D9
        cmpneqps xmm1, xmmword ptr [_g_XMInfinity]      ; 00A9 _ 0F C2. 0D, 00000000(d), 04
        divps   xmm0, xmm3                              ; 00B1 _ 0F 5E. C3
        cmpneqps xmm2, xmm3                             ; 00B4 _ 0F C2. D3, 04
        andps   xmm0, xmm2                              ; 00B8 _ 0F 54. C2
        movaps  xmm2, xmm1                              ; 00BB _ 0F 28. D1
        andnps  xmm2, xmmword ptr [_g_XMQNaN]           ; 00BE _ 0F 55. 15, 00000000(d)
        andps   xmm1, xmm0                              ; 00C5 _ 0F 54. C8
        movaps  xmm0, xmm2                              ; 00C8 _ 0F 28. C2
        orps    xmm0, xmm1                              ; 00CB _ 0F 56. C1
        movaps  xmm4, xmm0                              ; 00CE _ 0F 28. E0
        movaps  xmm0, xmm5                              ; 00D1 _ 0F 28. C5
        movaps  xmm1, xmm4                              ; 00D4 _ 0F 28. CC
        shufps  xmm0, xmm0, 201                         ; 00D7 _ 0F C6. C0, C9
        movaps  xmm2, xmm0                              ; 00DB _ 0F 28. D0
        shufps  xmm1, xmm1, 210                         ; 00DE _ 0F C6. C9, D2
        movaps  xmm3, xmm1                              ; 00E2 _ 0F 28. D9
        mulps   xmm0, xmm1                              ; 00E5 _ 0F 59. C1
        shufps  xmm2, xmm2, 201                         ; 00E8 _ 0F C6. D2, C9
        shufps  xmm3, xmm3, 210                         ; 00EC _ 0F C6. DB, D2
        mulps   xmm2, xmm3                              ; 00F0 _ 0F 59. D3
        subps   xmm0, xmm2                              ; 00F3 _ 0F 5C. C2
        andps   xmm0, xmmword ptr [_g_XMMask3]          ; 00F6 _ 0F 54. 05, 00000000(d)
        movaps  xmm3, xmm0                              ; 00FD _ 0F 28. D8
        movaps  xmm0, xmm4                              ; 0100 _ 0F 28. C4
        mulps   xmm0, xmm6                              ; 0103 _ 0F 59. C6
        movaps  xmm1, xmm0                              ; 0106 _ 0F 28. C8
        shufps  xmm1, xmm0, 153                         ; 0109 _ 0F C6. C8, 99
        addss   xmm0, xmm1                              ; 010D _ F3: 0F 58. C1
        shufps  xmm1, xmm1, 85                          ; 0111 _ 0F C6. C9, 55
        addss   xmm0, xmm1                              ; 0115 _ F3: 0F 58. C1
        shufps  xmm0, xmm0, 0                           ; 0119 _ 0F C6. C0, 00
        movaps  xmm7, xmm0                              ; 011D _ 0F 28. F8
        movaps  xmm0, xmm3                              ; 0120 _ 0F 28. C3
        mulps   xmm0, xmm6                              ; 0123 _ 0F 59. C6
        movaps  xmm1, xmm0                              ; 0126 _ 0F 28. C8
        shufps  xmm1, xmm0, 153                         ; 0129 _ 0F C6. C8, 99
        addss   xmm0, xmm1                              ; 012D _ F3: 0F 58. C1
        shufps  xmm1, xmm1, 85                          ; 0131 _ 0F C6. C9, 55
        addss   xmm0, xmm1                              ; 0135 _ F3: 0F 58. C1
        shufps  xmm0, xmm0, 0                           ; 0139 _ 0F C6. C0, 00
        movaps  xmm2, xmm0                              ; 013D _ 0F 28. D0
        movaps  xmm0, xmm5                              ; 0140 _ 0F 28. C5
        mulps   xmm0, xmm6                              ; 0143 _ 0F 59. C6
        movaps  xmm1, xmm0                              ; 0146 _ 0F 28. C8
        shufps  xmm1, xmm0, 153                         ; 0149 _ 0F C6. C8, 99
        addss   xmm0, xmm1                              ; 014D _ F3: 0F 58. C1
        shufps  xmm1, xmm1, 85                          ; 0151 _ 0F C6. C9, 55
        addss   xmm0, xmm1                              ; 0155 _ F3: 0F 58. C1
        shufps  xmm0, xmm0, 0                           ; 0159 _ 0F C6. C0, 00
        movaps  xmm6, xmm0                              ; 015D _ 0F 28. F0
        movaps  xmm0, xmm2                              ; 0160 _ 0F 28. C2
        movaps  xmm1, xmm3                              ; 0163 _ 0F 28. CB
        movaps  xmm2, xmmword ptr [_g_XMSelect1110]     ; 0166 _ 0F 28. 15, 00000000(d)
        andps   xmm1, xmm2                              ; 016D _ 0F 54. CA
        andnps  xmm2, xmm0                              ; 0170 _ 0F 55. D0
        orps    xmm2, xmm1                              ; 0173 _ 0F 56. D1
        movaps  xmm0, xmm2                              ; 0176 _ 0F 28. C2
        movaps  xmm3, xmm0                              ; 0179 _ 0F 28. D8
        movaps  xmm0, xmm7                              ; 017C _ 0F 28. C7
        movaps  xmm1, xmm4                              ; 017F _ 0F 28. CC
        movaps  xmm2, xmmword ptr [_g_XMSelect1110]     ; 0182 _ 0F 28. 15, 00000000(d)
        andps   xmm1, xmm2                              ; 0189 _ 0F 54. CA
        andnps  xmm2, xmm0                              ; 018C _ 0F 55. D0
        orps    xmm2, xmm1                              ; 018F _ 0F 56. D1
        movaps  xmm0, xmm2                              ; 0192 _ 0F 28. C2
        movaps  xmm4, xmm0                              ; 0195 _ 0F 28. E0
        movaps  xmm0, xmm6                              ; 0198 _ 0F 28. C6
        movaps  xmm1, xmm5                              ; 019B _ 0F 28. CD
        movaps  xmm2, xmmword ptr [_g_XMSelect1110]     ; 019E _ 0F 28. 15, 00000000(d)
        andps   xmm1, xmm2                              ; 01A5 _ 0F 54. CA
        andnps  xmm2, xmm0                              ; 01A8 _ 0F 55. D0
        orps    xmm2, xmm1                              ; 01AB _ 0F 56. D1
        movaps  xmm0, xmm2                              ; 01AE _ 0F 28. C2
        movaps  xmm2, xmm0                              ; 01B1 _ 0F 28. D0
        movaps  xmm1, xmm3                              ; 01B4 _ 0F 28. CB
        movaps  xmm0, xmm4                              ; 01B7 _ 0F 28. C4
        movaps  xmm3, xmmword ptr [_g_XMIdentityR3]     ; 01BA _ 0F 28. 1D, 00000000(d)
        movaps  xmm4, xmm2                              ; 01C1 _ 0F 28. E2
        movaps  xmm5, xmm0                              ; 01C4 _ 0F 28. E8
        movlhps xmm0, xmm1                              ; 01C7 _ 0F 16. C1
        movlhps xmm2, xmm3                              ; 01CA _ 0F 16. D3
        shufps  xmm5, xmm1, 238                         ; 01CD _ 0F C6. E9, EE
        shufps  xmm4, xmm3, 238                         ; 01D1 _ 0F C6. E3, EE
        movaps  xmm1, xmm0                              ; 01D5 _ 0F 28. C8
        shufps  xmm1, xmm2, 221                         ; 01D8 _ 0F C6. CA, DD
        shufps  xmm0, xmm2, 136                         ; 01DC _ 0F C6. C2, 88
        movaps  xmm3, xmm5                              ; 01E0 _ 0F 28. DD
        shufps  xmm5, xmm4, 136                         ; 01E3 _ 0F C6. EC, 88
        shufps  xmm3, xmm4, 221                         ; 01E7 _ 0F C6. DC, DD
        movaps  xmm2, xmm5                              ; 01EB _ 0F 28. D5
        ret                                             ; 01EE _ C3
XMMatrixLookAtLH@@12 ENDP

_main   PROC NEAR
        call    XMMatrixLookAtLH@@12                    ; 01EF _ E8, FFFFFE0C
        ret                                             ; 01F4 _ C3
_main   ENDP

_text   ENDS

_data   SEGMENT PARA PUBLIC 'DATA'                      ; section number 2

_data   ENDS

END
Title: Re: vectorcall
Post by: TouEnMasm on November 27, 2020, 07:34:23 PM

Vectorcall is perfectly defined here https://docs.microsoft.com/en-us/cpp/cpp/vectorcall?view=msvc-160 (https://docs.microsoft.com/en-us/cpp/cpp/vectorcall?view=msvc-160)
Attached is the code sample with the annotated assembly listing.
Title: Re: vectorcall
Post by: johnsa on December 05, 2020, 05:15:04 AM
I implemented vectorcall for 64bit, but never for 32bit. If there is sufficient demand it would be relatively trivial to extend this as the convention is the same and the registers are the same.
I just didn't because A I'm lazy and B I never use 32bit code anymore, especially with vectorcall :)
Title: Re: vectorcall
Post by: TouEnMasm on December 05, 2020, 05:28:40 AM
Thanks for answer.
Don't obliged you to do it.
There is surely better things to do as made better the debugging in 64.