Open
Description
The input code here is a slight tweak of #46, but the generated code is very different because it uses a lookup instead of bit-twiddling:
Rust:
#[inline(never)]
pub fn decode(n: u8) -> Option<()> {
match n {
0x0 => Some(()),
0x1 => Some(()),
0x2 => Some(()),
0x3 => Some(()),
0x4 => Some(()),
0xe => Some(()),
_ => None
}
}
LLVM IR:
.text
.file "external-05dffe7586b7d437.ll"
.globl _ZN8external6decode17h0bb113af5b7a3594E
.p2align 1
.type _ZN8external6decode17h0bb113af5b7a3594E,@function
_ZN8external6decode17h0bb113af5b7a3594E: ; @_ZN8external6decode17h0bb113af5b7a3594E
; BB#0: ; %start
cpi r24, 15
brlo .+2
rjmp LBB0_1
; BB#2: ; %switch.lookup
mov r26, r24
mov r27, r24
lsl r27
sbc r27, r27
subi r26, -lo8(switch.table)
sbci r27, -hi8(switch.table)
ld r24, X
ret
LBB0_1:
ldi r24, 0
ret
.Lfunc_end0:
.size _ZN8external6decode17h0bb113af5b7a3594E, .Lfunc_end0-_ZN8external6decode17h0bb113af5b7a3594E
.type switch.table,@object ; @switch.table
.section .rodata,"a",@progbits
switch.table:
.ascii "\001\001\001\001\001\000\000\000\000\000\000\000\000\000\001"
.size switch.table, 15
AVR assembly:
Contents of section .text:
0000 8f3008f0 00c0a82f b82fbb0f bb0ba050 .0....././.....P
0010 b0408c91 089580e0 0895 .@........
Contents of section .rodata:
0000 01010101 01000000 00000000 000001 ...............
Disassembly of section .text:
00000000 <_ZN8external6decode17h0bb113af5b7a3594E>:
0: 8f 30 cpi r24, 0x0F ; 15
2: 08 f0 brcs .+2 ; 0x6 <_ZN8external6decode17h0bb113af5b7a3594E+0x6>
4: 00 c0 rjmp .+0 ; 0x6 <_ZN8external6decode17h0bb113af5b7a3594E+0x6>
4: R_AVR_13_PCREL .text+0x16
6: a8 2f mov r26, r24
8: b8 2f mov r27, r24
a: bb 0f add r27, r27
c: bb 0b sbc r27, r27
e: a0 50 subi r26, 0x00 ; 0
e: R_AVR_LO8_LDI_NEG .rodata
10: b0 40 sbci r27, 0x00 ; 0
10: R_AVR_HI8_LDI_NEG .rodata
12: 8c 91 ld r24, X
14: 08 95 ret
00000016 <LBB0_1>:
16: 80 e0 ldi r24, 0x00 ; 0
18: 08 95 ret