boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)))