https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54589
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> --- clang generates for x86_64: movzbl (%rsi), %eax shlq $4, %rax movl 16(%rdi,%rax), %eax movl %eax, (%rdx) retq and for i?86: movl 8(%esp), %edx movl 4(%esp), %ecx movl 12(%esp), %eax movzbl (%edx), %edx shll $4, %edx movl 16(%ecx,%edx), %ecx movl %ecx, (%eax) retl for the later case (-m32), gcc generates: movl 8(%esp), %eax movzbl (%eax), %eax addl $1, %eax sall $4, %eax addl 4(%esp), %eax movl (%eax), %edx movl 12(%esp), %eax movl %edx, (%eax) ret so, two extra additions.