( TCH | 2023. 05. 25., cs – 13:20 )

int main(int argc, char *argv[])
{
    return 0x12345678;
}

C x86-64:

main:                                   # @main
        mov     eax, 305419896
        ret

C ARMv8:

main:                                   // @main
        mov     w0, #22136
        movk    w0, #4660, lsl #16
        ret

C++ x86-64:

main:                                   # @main
        mov     eax, 305419896
        ret

C++ ARMv8:

main:                                   // @main
        mov     w0, #22136
        movk    w0, #4660, lsl #16
        ret
const int x = 0x12345678;

int main(int argc, char *argv[])
{
    return x;
}

C x86-64:

main:                                   # @main
        mov     eax, 305419896
        ret
x:
        .long   305419896                       # 0x12345678

C ARMv8:

main:                                   // @main
        mov     w0, #22136
        movk    w0, #4660, lsl #16
        ret
x:
        .word   305419896                       // 0x12345678

C++ x86-64:

main:                                   # @main
        mov     eax, 305419896
        ret

C++ ARMv8:

main:                                   // @main
        mov     w0, #22136
        movk    w0, #4660, lsl #16
        ret

C esetén - ha deklarálva volt - kirakta egy táblába a konstansot, de nem használta, ugyanúgy immediate értékként töltötte be; értelme mi...? A kód az összes esetben identikus volt, persze CPU-nként.
x86-64-en:

        mov     eax, 305419896

ARMv8-on:

        mov     w0, #22136
        movk    w0, #4660, lsl #16

A fordító minden esetben CLang 16 volt.

Mindenki megnyugodott? Elengedhetjük végre ezt a viccet?