Вот, зашел на одноплатник с 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