A look under the hood with a practical example:
int 3
jinvoke SendMessage, rbx, WM_SETFONT, rv(GetStockObject, ANSI_FIXED_FONT), 0
nops 2
Assembled as 32-bit code:
0040114A |. CC int3
0040114B |. 6A 0B push 0B
0040114D |. FF15 E4444000 call near [4044E4] ; GetStockObject
00401153 |. 6A 00 push 0
00401155 |. 50 push eax
00401156 |. 6A 30 push 30
00401158 |. 53 push ebx
00401159 |. FF15 E0444000 call near [4044E0] ; SendMessage
0040115F |. 90 nop
00401160 |. 90 nop
Assembled as 64-bit code:
1400011FA | CC | int3 |
1400011FB | B9 0B000000 | mov ecx,B |
140001200 | FF15 AE330000 | call [<&GetStockObject>] |
140001206 | 45:33C9 | xor r9d,r9d |
140001209 | 4C:8BC0 | mov r8,rax |
14000120C | BA 30000000 | mov edx,30 |
140001211 | 48:8BCB | mov rcx,rbx |
140001214 | FF15 92330000 | call [<&SendMessageA>] |
14000121A | 90 | nop |
14000121B | 90 | nop |
As you can see, the passing of parameters is entirely different, so jinvoke is clearly a macro. Same for Hutch' Masm64 SDK invoke macro.
The usage of xax vs rax is a matter of taste. 32-bit Masm and clones don't know rax, so a simple rax equ eax does the job - you just use rax for both worlds, except if you know it's a DWORD, so you pass eax.
Note there should be no pushing in 64-bit code, so m2m edx, 30h becomes mov edx, 30h:
48:C7C2 30000000 | mov rdx,30
BA 30000000 | mov edx,30
6A 30 | push 30
5A | pop rdx
mov edx, 30h is two bytes longer than push 30h + pop rdx, but two bytes shorter than the equivalent mov rdx, 30h.