A vector resides in the CPU and not in memory so if
vectorcall is used the arguments are passed in registers, else another calling convention is used and the function uses the stack.
XMMatrixLookAtLH proto XM_CALLCONV XMTHISPTR, :FXMVECTOR, :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 as a macro using
intrinsics.
Inline definition:
XMMatrixLookAtLH proto vectorcall :real16, :real16, :real16 {
_mm_sub_ps(xmm1, xmm0)
XMMatrixLookToLH(xmm0, xmm1, xmm2)
}
Used in a
Direct3D11 sample:
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:
.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