Assembly Itanium

No post anterior, mostrei os registradores da plataforma x64 e um exemplo de uma listagem em assembly. Como curiosidade, resolvi compilar um programa para a plataforma Itanium.

Rotina comando() :

 __int64 comando(__int64 a, __int64 b, __int64 c, 
        __int64 d, __int64 e)
{
return a+b+c+d+e;
}

Disassembly: A plataforma Itanium são processadores RISC de 64-bits e utilizam instruções Explicitly Parallel Instruction Computing (EPIC). Ao ler a listagem do código em assembly, verificamos que não há semelhanças com a plataforma x64. Apesar de serem processadores 64-bits, a plataforma Itanium e x64 são incompatíveis.

 alloc r38 = ar.pfs,8,0,2,0 
movl r27 = 0xCCCCCCCCCCCCCCCC 

adds sp = -0x30,sp 
adds r39 = 0,gp 
addl r28 = 4,zero ;; 

ld8.nta r2 = [sp] 
mov  r37 = b0 
adds r3 = 8,sp ;; 

adds r2 = 0,sp 
nop.m 0 
nop.b 0 ;; 

st8  [r2] = r27,0x10 
st8  [r3] = r27,0x10 
cmp.eq.unc p15,p14 = 1,r28 

adds r28 = -1,r28 
nop.m 0 
br.cond.dptk.many Console64!comando+0 

adds r31 = 0x10,sp 
adds r30 = 0x18,sp 
adds r29 = 0x20,sp 

adds r28 = 0x28,sp 
adds r27 = 0x30,sp 
nop.b 0 ;; 

st8  [r31] = r32 
st8  [r30] = r33 
nop.b 0 ;; 

st8  [r29] = r34 
st8  [r28] = r35 
nop.b 0 ;; 

st8  [r27] = r36 ;; 
adds r26 = 0x10,sp 
adds r22 = 0x18,sp 

adds r19 = 0x20,sp 
adds r16 = 0x28,sp 
adds r10 = 0x30,sp ;; 

ld8  r25 = [r26] 
ld8  r21 = [r22] 
adds gp = 0,r39 ;; 

ld8  r18 = [r19] 
ld8  r15 = [r16] 
add  r20 = r25,r21 ;; 

ld8  r9 = [r10] 
add  r17 = r20,r18 ;; 
add  r11 = r17,r15 ;; 

add  r36 = r11,r9 ;; 
adds v0 = 0,r36 
nop.i 0 ;; 

adds sp = 0x30,sp 
mov  b0 = r37,Console64!comando+0x100 
mov.i ar.pfs = r38 

nop.m 0 
nop.m 0 
br.ret.sptk.many b0 ;;