https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66152
--- Comment #1 from SztfG at yandex dot ru --- If array of char is initialized using string, gcc can use larger mov instruction, like movabsq, movq, movl etc. but not movdqa, movaps or other xmm But if zero byte appears in string, compiler always create a separate array and copy it to stack, using various mov instruction, except xmm-based void bar(void) { char a[4] = "\x00\x02\x03\x04"; foo(a); } produces .LC0: .string "" .string "\002\003\004" bar: subq $24, %rsp movl .LC0(%rip), %eax movq %rsp, %rdi movl %eax, (%rsp) call foo addq $24, %rsp ret