Would any compiler actually use the case values in the jump address values?
Isn't that what the jump table is for - to map case values to jump addresses?
Code:
// Program 1:
#include <stdio.h>
int main() {
int n;
printf(">>> ");
scanf("%d", &n);
switch (n) {
case 0: puts("zero"); break;
case 1: puts("one"); break;
case 2: puts("two"); break;
case 3: puts("three"); break;
case 4: puts("four"); break;
case 5: puts("five"); break;
case 6: puts("six"); break;
case 7: puts("seven"); break;
case 8: puts("eight"); break;
case 9: puts("nine"); break;
}
return 0;
}
Parial assembly listing:
call __isoc99_scanf
movl -4(%rbp), %eax
cmpl $9, %eax
ja .L2
movl %eax, %eax
movq .L4(,%rax,8), %rax
jmp *%rax
.section .rodata
.align 8
.align 4
.L4:
.quad .L3
.quad .L5
.quad .L6
.quad .L7
.quad .L8
.quad .L9
.quad .L10
.quad .L11
.quad .L12
.quad .L13
.text
.L3:
movl $.LC2, %edi
call puts
jmp .L2
.L5:
movl $.LC3, %edi
call puts
jmp .L2
.L6:
movl $.LC4, %edi
call puts
jmp .L2
etc.
// Program 2
#include <stdio.h>
int main() {
int n;
printf(">>> ");
scanf("%d", &n);
switch (n) {
case 0: puts("zero"); break;
case 10: puts("one"); break;
case 200: puts("two"); break;
case 3000: puts("three"); break;
case 40000: puts("four"); break;
case 500000: puts("five"); break;
case 6000000: puts("six"); break;
case 70000000: puts("seven"); break;
case 800000000: puts("eight"); break;
case 900000000: puts("nine"); break;
}
return 0;
}
Partial assembly listing:
call __isoc99_scanf
movl 12(%rsp), %eax
cmpl $40000, %eax
je .L3
cmpl $40000, %eax
jg .L4
cmpl $10, %eax
je .L5
cmpl $10, %eax
jg .L6
testl %eax, %eax
.p2align 4,,3
je .L7
.p2align 4,,6
jmp .L2
.L6:
cmpl $200, %eax
.p2align 4,,4
je .L8
cmpl $3000, %eax
je .L9
jmp .L2
.L4:
cmpl $70000000, %eax
je .L10
cmpl $70000000, %eax
jg .L11
cmpl $500000, %eax
je .L12
cmpl $6000000, %eax
je .L13
jmp .L2
.L11:
cmpl $800000000, %eax
je .L14
cmpl $900000000, %eax
je .L15
jmp .L2
.L7:
movl $.LC2, %edi
call puts
.p2align 4,,3
jmp .L2
.L5:
movl $.LC3, %edi
call puts
.p2align 4,,3
jmp .L2
.L8:
movl $.LC4, %edi
call puts
.p2align 4,,3
jmp .L2
etc.