017-int-roundtrip.scm (1372B)
1 ;; tests/cc-cg/17-int-roundtrip.scm — width-correct 32-bit load/store 2 ;; on adjacent unsigned-int lvals. 3 ;; 4 ;; Models: 5 ;; unsigned int a = 0xAABBCCDD, b = 0x11223344; 6 ;; return a == 0xAABBCCDD; 7 ;; 8 ;; Two 4-byte slots are allocated back-to-back at offsets 8 and 12. 9 ;; The buggy 8-byte path would store 8 bytes from sp+8 and 8 bytes 10 ;; from sp+12, contaminating each slot. Width-aware emission (4-byte 11 ;; decomposition: byte-gather load, %shri-cascade store) round-trips 12 ;; cleanly → comparison true → exit 1. 13 14 (let ((cg (cg-init))) 15 (cg-fn-begin cg "main" '() %t-i32) 16 (let* ((off-a (cg-alloc-slot cg 4 4)) 17 (off-b (cg-alloc-slot cg 4 4)) 18 (sym-a (%sym "a" 'var 'auto %t-u32 off-a #t)) 19 (sym-b (%sym "b" 'var 'auto %t-u32 off-b #t))) 20 ;; a = 0xAABBCCDD 21 (cg-push-sym cg sym-a) 22 (cg-push-imm cg %t-u32 23 (cdr (%c-value-parse-decimal-bv "2864434397"))) 24 (cg-assign cg) (cg-pop cg) 25 ;; b = 0x11223344 26 (cg-push-sym cg sym-b) 27 (cg-push-imm cg %t-u32 28 (cdr (%c-value-parse-decimal-bv "287454020"))) 29 (cg-assign cg) (cg-pop cg) 30 ;; return a == 0xAABBCCDD 31 (cg-push-sym cg sym-a) 32 (cg-load cg) 33 (cg-push-imm cg %t-u32 34 (cdr (%c-value-parse-decimal-bv "2864434397"))) 35 (cg-binop cg 'eq) 36 (cg-return cg)) 37 (cg-fn-end cg) 38 (write-bv-fd 1 (cg-finish cg)))