064-switch.scm (2340B)
1 ;; tests/cc-cg/64-switch.scm — switch with case + default + fall-through (§F.3). 2 ;; Models: 3 ;; int main(void) { 4 ;; int x = 2; int s = 0; 5 ;; switch (x) { 6 ;; case 1: s = s + 1; /* fall through */ 7 ;; case 2: s = s + 10; /* fall through */ 8 ;; case 3: s = s + 100; /* fall through */ 9 ;; default: s = s + 1000; 10 ;; } 11 ;; return s; /* x=2 -> 10 + 100 + 1000 = 1110, but exit code low byte = 86 */ 12 ;; } 13 ;; To stay within exit-code range we rewrite to small contributions and 14 ;; pick x=2 hitting case 2 + 3 + default = 7. Final exit = 7. 15 ;; 16 ;; Body sketch (small ints only): 17 ;; x=2; s=0; 18 ;; case 1: s+=1 (skipped, x=2) 19 ;; case 2: s+=2 (taken) 20 ;; case 3: s+=3 (fall-through) 21 ;; default: s+=4 (fall-through) 22 ;; Result: 2 + 3 + 4 = 9 23 ;; Exit = 9. 24 25 (let* ((cg (cg-init)) 26 (params (cg-fn-begin cg "main" '() %t-i32)) 27 (x-sl (cg-alloc-slot cg 4 4)) 28 (s-sl (cg-alloc-slot cg 4 4)) 29 (x-sym (%sym "x" 'var 'auto %t-i32 x-sl)) 30 (s-sym (%sym "s" 'var 'auto %t-i32 s-sl))) 31 ;; x = 2; s = 0; 32 (cg-push-sym cg x-sym) (cg-push-imm cg %t-i32 2) 33 (cg-assign cg) (cg-pop cg) 34 (cg-push-sym cg s-sym) (cg-push-imm cg %t-i32 0) 35 (cg-assign cg) (cg-pop cg) 36 37 ;; switch (x) { ... } 38 (cg-push-sym cg x-sym) (cg-load cg) 39 (let ((sw (cg-switch-begin cg))) 40 ;; case 1: s = s + 1; 41 (cg-switch-case cg sw 1) 42 (cg-push-sym cg s-sym) 43 (cg-push-sym cg s-sym) (cg-load cg) 44 (cg-push-imm cg %t-i32 1) 45 (cg-binop cg 'add) 46 (cg-assign cg) (cg-pop cg) 47 ;; case 2: s = s + 2; 48 (cg-switch-case cg sw 2) 49 (cg-push-sym cg s-sym) 50 (cg-push-sym cg s-sym) (cg-load cg) 51 (cg-push-imm cg %t-i32 2) 52 (cg-binop cg 'add) 53 (cg-assign cg) (cg-pop cg) 54 ;; case 3: s = s + 3; 55 (cg-switch-case cg sw 3) 56 (cg-push-sym cg s-sym) 57 (cg-push-sym cg s-sym) (cg-load cg) 58 (cg-push-imm cg %t-i32 3) 59 (cg-binop cg 'add) 60 (cg-assign cg) (cg-pop cg) 61 ;; default: s = s + 4; 62 (cg-switch-default cg sw) 63 (cg-push-sym cg s-sym) 64 (cg-push-sym cg s-sym) (cg-load cg) 65 (cg-push-imm cg %t-i32 4) 66 (cg-binop cg 'add) 67 (cg-assign cg) (cg-pop cg) 68 (cg-switch-end cg sw)) 69 70 (cg-push-sym cg s-sym) (cg-load cg) 71 (cg-return cg) 72 (cg-fn-end cg) 73 (write-bv-fd 1 (cg-finish cg)))