Changeset 14939
- Timestamp:
- Aug 14, 2011, 12:24:19 AM (13 years ago)
- Location:
- trunk/source
- Files:
-
- 3 edited
-
compiler/ARM/arm-vinsns.lisp (modified) (7 diffs)
-
compiler/ARM/arm2.lisp (modified) (2 diffs)
-
lisp-kernel/arm-gc.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm-vinsns.lisp
r14909 r14939 144 144 145 145 146 (define-arm-vinsn (misc-ref-single-float :predicatable )146 (define-arm-vinsn (misc-ref-single-float :predicatable :sets-lr) 147 147 (((dest :single-float)) 148 148 ((v :lisp) 149 (scaled-idx :u32)) 150 ((temp :u32)))151 ( ldr temp (:@ v scaled-idx))152 ( fmsr dest temp))153 154 (define-arm-vinsn (misc-ref-c-single-float :predicatable )149 (scaled-idx :u32))) 150 (add lr v scaled-idx) 151 (flds dest (:@ lr (:$ 0))) 152 (mov lr (:$ 0))) 153 154 (define-arm-vinsn (misc-ref-c-single-float :predicatable :sets-lr) 155 155 (((dest :single-float)) 156 156 ((v :lisp) 157 157 (idx :u32const)) 158 ((temp :u32))) 159 (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))) 160 (fmsr dest temp)) 161 162 (define-arm-vinsn (misc-ref-double-float :predicatable) 158 ()) 159 (add lr v (:$ arm::misc-data-offset)) 160 (flds dest (:@ lr (:$ (:apply ash idx 2)))) 161 (mov lr (:$ 0))) 162 163 (define-arm-vinsn (misc-ref-double-float :predicatable :sets-lr) 163 164 (((dest :double-float)) 164 165 ((v :lisp) 165 ( scaled-idx :u32))166 ((low (:u32 #.arm::imm0))167 (high (:u32 #.arm::imm1))))168 ( ldrd low (:@ v scaled-idx))169 ( fmdrr dest low high))166 (unscaled-idx :imm))) 167 (add arm::lr v (:$ arm::misc-dfloat-offset)) 168 (add arm::lr arm::lr (:lsl unscaled-idx (:$ 1))) 169 (fldd dest (:@ arm::lr (:$ 0))) 170 (mov lr (:$ 0))) 170 171 171 172 … … 176 177 ((v :lisp) 177 178 (idx :u32const))) 178 (add lr v (:$ arm::double-float.pad)) 179 (fldd dest (:@ lr (:$ (:apply + (:apply ash idx 3) (- arm::double-float.value arm::double-float.pad)))))) 180 181 (define-arm-vinsn (misc-set-c-double-float :predicatable) 179 (add lr v (:$ arm::double-float.value)) 180 (fldd dest (:@ lr (:$ (:apply ash idx 3)))) 181 (mov lr (:$ 0))) 182 183 (define-arm-vinsn (misc-set-c-double-float :predicatable :sets-lr) 182 184 (((val :double-float)) 183 185 ((v :lisp) 184 186 (idx :u32const))) 185 (add lr v (:$ arm::double-float.pad)) 186 (fstd val (:@ lr (:$ (:apply + (:apply ash idx 3) (- arm::double-float.value arm::double-float.pad)))))) 187 188 (define-arm-vinsn (misc-set-double-float :predicatable) 187 (add lr v (:$ arm::double-float.value)) 188 (fstd val (:@ lr (:$ (:apply ash idx 3)))) 189 (mov lr (:$ 0))) 190 191 (define-arm-vinsn (misc-set-double-float :predicatable :sets-lr) 189 192 (() 190 193 ((val :double-float) 191 194 (v :lisp) 192 ( scaled-idx :u32))193 ((low (:u32 #.arm::imm0))194 (high (:u32 #.arm::imm1))))195 (f mrrd low high val)196 ( strd low (:@ v scaled-idx)))195 (unscaled-idx :imm))) ; a fixnum 196 (add lr v (:$ arm::misc-dfloat-offset)) 197 (add lr lr (:lsl unscaled-idx (:$ 1))) 198 (fstd val (:@ lr (:$ 0))) 199 (mov lr (:$ 0))) 197 200 198 201 (define-arm-vinsn (misc-set-c-single-float :predicatable) … … 200 203 ((val :single-float) 201 204 (v :lisp) 202 (idx :u32const)) 203 ((temp :u32))) 204 (fmrs temp val) 205 (str temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))) 205 (idx :u32const))) 206 (add lr v (:$ arm::misc-data-offset)) 207 (fsts val (:@ lr (:$ (:apply ash idx 2)))) 208 (mov lr (:$ 0))) 209 206 210 207 211 … … 2428 2432 ;;; Heap-cons a double-float to store contents of FPREG. Hope that we don't do 2429 2433 ;;; this blindly. 2430 (define-arm-vinsn double->heap(((result :lisp)) ; tagged as a double-float2434 (define-arm-vinsn (double->heap :sets-lr) (((result :lisp)) ; tagged as a double-float 2431 2435 ((fpreg :double-float)) 2432 2436 ((header-temp (:u32 #.arm::imm0)) … … 2442 2446 (mov result allocptr) 2443 2447 (bic allocptr allocptr (:$ arm::fulltagmask)) 2444 (add lr result (:$ arm::double-float.pad)) 2445 (fstd fpreg (:@ lr (:$ (- arm::double-float.value arm::double-float.pad))))) 2448 (add lr result (:$ arm::double-float.value)) 2449 (fstd fpreg (:@ lr (:$ 0))) 2450 (mov lr (:$ 0))) 2446 2451 2447 2452 … … 2463 2468 (mov result allocptr) 2464 2469 (bic allocptr allocptr (:$ arm::fulltagmask)) 2470 (add lr result (:$ arm::single-float.value)) 2465 2471 (fmrs header-temp fpreg) 2466 2472 (str header-temp (:@ result (:$ arm::single-float.value)))) … … 2469 2475 2470 2476 ;;; "dest" is preallocated, presumably on a stack somewhere. 2471 (define-arm-vinsn (store-double :predicatable )2477 (define-arm-vinsn (store-double :predicatable :sets-lr) 2472 2478 (() 2473 2479 ((dest :lisp) 2474 (source :double-float)) 2475 ((low (:u32 #.arm::imm0)) 2476 (high (:u32 #.arm::imm1)))) 2477 (fmrrd low high source) 2478 (strd low (:@ dest (:$ arm::double-float.value)))) 2480 (source :double-float))) 2481 (add lr dest (:$ arm::double-float.value)) 2482 (fstd source (:@ lr (:$ 0))) 2483 (mov lr (:$ 0))) 2479 2484 2480 2485 (define-arm-vinsn (get-double :predicatable :sets-lr) 2481 2486 (((target :double-float)) 2482 2487 ((source :lisp))) 2483 (add lr source (:$ arm::double-float.pad)) 2484 (fldd target (:@ lr (:$ (- arm::double-float.value arm::double-float.pad))))) 2488 (add lr source (:$ arm::double-float.value)) 2489 (fldd target (:@ lr (:$ 0))) 2490 (mov lr (:$ 0))) 2485 2491 2486 2492 ;;; Extract a double-float value, typechecking in the process. -
trunk/source/compiler/ARM/arm2.lisp
r14922 r14939 1582 1582 (with-imm-target () idx-reg 1583 1583 (if index-known-fixnum 1584 (arm2-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3))) 1585 (! scale-64bit-misc-index idx-reg unscaled-idx)) 1586 (! misc-ref-double-float fp-val src idx-reg))) 1584 (unless unscaled-idx 1585 (setq unscaled-idx idx-reg) 1586 (arm2-absolute-natural seg unscaled-idx nil (ash index-known-fixnum arm::fixnumshift)))) 1587 (! misc-ref-double-float fp-val src unscaled-idx))) 1587 1588 (if (eq vreg-class hard-reg-class-fpr) 1588 1589 (<- fp-val) … … 2154 2155 (progn 2155 2156 (if index-known-fixnum 2156 (arm2-absolute-natural seg scaled-idx nil (+ (arch::target-misc-dfloat-offset arch) (ash index-known-fixnum 3))) 2157 (! scale-64bit-misc-index scaled-idx unscaled-idx)) 2158 (! misc-set-double-float unboxed-val-reg src scaled-idx))))) 2157 (unless unscaled-idx 2158 (setq unscaled-idx scaled-idx) 2159 (arm2-absolute-natural seg unscaled-idx nil (ash index-known-fixnum arm::fixnumshift)))) 2160 (! misc-set-double-float unboxed-val-reg src unscaled-idx))))) 2159 2161 (t 2160 2162 (with-imm-target (unboxed-val-reg) scaled-idx -
trunk/source/lisp-kernel/arm-gc.c
r14770 r14939 1056 1056 { 1057 1057 natural *regs = (natural *) xpGPRvector(xp); 1058 LispObj lr_value;1059 1060 1058 int r; 1061 1059 /* registers between arg_z and Rfn should be tagged and marked as … … 1076 1074 1077 1075 mark_pc_root(ptr_to_lispobj(xpPC(xp))); 1078 lr_value = ptr_to_lispobj(xpLR(xp)); 1079 if (*((LispObj *)lr_value) == 0) { /* pointing into a double-float/double-float vector */ 1080 mark_root(untag(lr_value)+fulltag_misc); 1081 } else { 1082 mark_pc_root(lr_value); 1083 } 1076 mark_pc_root(ptr_to_lispobj(xpLR(xp))); 1084 1077 } 1085 1078
Note:
See TracChangeset
for help on using the changeset viewer.
