You can perform the following disassembly trick to find out how a particular code is compiled.
Vector<int, 16> a, b; Vector<int, 65536> c, d; asm("xxx");
Now compile
gcc -O3 1.cc -S -o 1.s
And look at the mess
xxx # 0 "" 2 #NO_APP movdqa 524248(%rsp), %xmm0 leaq 524248(%rsp), %rsi paddd 524184(%rsp), %xmm0 movdqa %xmm0, 524248(%rsp) movdqa 524264(%rsp), %xmm0 paddd 524200(%rsp), %xmm0 movdqa %xmm0, 524264(%rsp) movdqa 524280(%rsp), %xmm0 paddd 524216(%rsp), %xmm0 movdqa %xmm0, 524280(%rsp) movdqa 524296(%rsp), %xmm0 paddd 524232(%rsp), %xmm0 movdqa %xmm0, 524296(%rsp) #APP # 36 "1.cc" 1 yyy # 0 "" 2 #NO_APP leaq 262040(%rsp), %rdx leaq -104(%rsp), %rcx xorl %eax, %eax .p2align 4,,10 .p2align 3 .L2: movdqa (%rcx,%rax), %xmm0 paddd (%rdx,%rax), %xmm0 movdqa %xmm0, (%rdx,%rax) addq $16, %rax cmpq $262144, %rax jne .L2 #APP # 38 "1.cc" 1 zzz
As you can see, the first cycle was small enough to unfold. The second is a cycle.
source share