Вот, зашел на одноплатник с ARM64.
eddy-em.livejournal.com
github.com/eddyem
Код под x86_64:
.LFB39: .cfi_startproc cmpl $4, %edi ja .L2 movl %edi, %edi leaq .L4(%rip), %rdx movslq (%rdx,%rdi,4), %rax addq %rdx, %rax jmp *%rax .section .rodata .align 4 .align 4 .L4: .long .L9-.L4 .long .L7-.L4 .long .L6-.L4 .long .L5-.L4 .long .L3-.L4 .text .L2: movl $0, %eax ret .L7: ...
и армовский:
.LFB39: .cfi_startproc mov w1, w0 cmp w0, 2 beq .L4 bls .L8 mov w0, 4 cmp w1, 3 beq .L1 cmp w1, w0 mov w0, 5 csel w0, w0, wzr, eq b .L1 .L8: cmp w0, 0 cset w0, ne add w0, w0, 1 .L1: ret
Реально, фигня какая-то: gcc под армом на О1 ни хрена не пооптимизировал!
А на O0 вообще адскую портянку на арме нагенерил:
f1: .LFB6: .cfi_startproc sub sp, sp, #32 .cfi_def_cfa_offset 32 str w0, [sp, 12] str wzr, [sp, 28] ldr w0, [sp, 12] cmp w0, 4 beq .L2 ldr w0, [sp, 12] cmp w0, 4 bhi .L3 ldr w0, [sp, 12] cmp w0, 3 beq .L4 ldr w0, [sp, 12] cmp w0, 3 bhi .L3 ldr w0, [sp, 12] cmp w0, 2 beq .L5 ldr w0, [sp, 12] cmp w0, 2 bhi .L3 ldr w0, [sp, 12] cmp w0, 0 beq .L6 ldr w0, [sp, 12] cmp w0, 1 beq .L7 b .L3 .L6: mov w0, 1 str w0, [sp, 28] b .L3 .L7: mov w0, 2 str w0, [sp, 28] b .L3 .L5: mov w0, 3 str w0, [sp, 28] b .L3 .L4: mov w0, 4 str w0, [sp, 28] b .L3 .L2: mov w0, 5 str w0, [sp, 28] nop .L3: ldr w0, [sp, 28] add sp, sp, 32 .cfi_def_cfa_offset 0 ret .cfi_endproc