Changeset 13858


Ignore:
Timestamp:
Jun 19, 2010, 4:31:19 AM (9 years ago)
Author:
gb
Message:

arm2.lisp: 32-bit case of ARM2-VREF1 wasn't parenthesized right, so we did both

the constant- and variable-index case.

arm-vinsns.lisp: lots of bugs in SAVE-LEXPR-ARGREGS
arm-pred.lisp: in EQUAL, compare to NIL, not 'NUL.
l1-clos-boot.lisp: more ARM conditionalization.
arm-spentry.s: use the right register in _SPbind.

Implement _SPnthrowvalues, fix in _SPnthrow1value.
Try to add uuo_debug_trap() to subprims that still aren't implemented.

Currently crashes in code called by ENSURE-METHOD, possibly on the first
DEFMETHOD.

Location:
branches/arm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/arm/compiler/ARM/arm-vinsns.lisp

    r13856 r13858  
    28362836      (other-temp :imm)))
    28372837  ((:pred >= min-fixed $numarmargregs)
    2838    (stm (:! vsp) (arg_z arg_y arg_x)))
     2838   (stmdb (:! vsp) (arg_z arg_y arg_x)))
    28392839  ((:pred = min-fixed 2)                ; at least 2 args
    28402840   (cmp nargs (:$ (ash 2 arm::word-shift)))
    28412841   (strne arg_x (:@! vsp (:$ -4)))
    2842    (stm (:! vsp) (arg_z arg_y)))
     2842   (stmdb (:! vsp) (arg_z arg_y)))
    28432843  ((:pred = min-fixed 1)                ; at least one arg
    28442844   (cmp nargs (:$ (ash 2 arm::word-shift)))
    28452845   (strlo arg_z (:@! vsp (:$ (- arm::node-size))))
    2846    (stmeq (:! vsp) (arg_z arg_y))
    2847    (stmhi (:! vsp) (arg_z arg_y arg_x)))
     2846   (stmdbeq (:! vsp) (arg_z arg_y))
     2847   (stmdbhi (:! vsp) (arg_z arg_y arg_x)))
    28482848  ((:pred = min-fixed 0)
    28492849   (cmp nargs (:$ 0))
     
    28512851   (cmp nargs (:$ (ash 2 arm::word-shift)))
    28522852   (strlo arg_z (:@! vsp (:$ (- arm::node-size))))
    2853    (stmeq (:! vsp) (arg_z arg_y))
    2854    (stmhi (:! vsp) (arg_z arg_y arg_x))
     2853   (stmdbeq (:! vsp) (arg_z arg_y))
     2854   (stmdbhi (:! vsp) (arg_z arg_y arg_x))
    28552855   :done
    28562856   )
     
    28662866  (cmp other-temp lr)
    28672867  (mov arg-temp (:$ arm::lisp-frame-marker))
    2868   (stmdb (:! vsp) (arg-temp entry-vsp fn lr))
     2868  (stmdb (:! sp) (arg-temp entry-vsp fn lr))
    28692869  (mov fn (:$ 0))
    28702870  (moveq lr (:$ (- arm::nil-value arm::fulltag-nil)))
    28712871  (ldreq lr (:@ lr (:$ (arm::%kernel-global 'arm::lexpr-return))))
    2872   (stmdbeq (:! vsp) (arg-temp entry-vsp fn lr))
     2872  (stmdbeq (:! sp) (arg-temp entry-vsp fn lr))
    28732873  (moveq lr other-temp)
    28742874  (movne lr (:$ (- arm::nil-value arm::fulltag-nil)))
  • branches/arm/compiler/ARM/arm2.lisp

    r13836 r13858  
    13431343                        (if is-signed
    13441344                          (! misc-ref-c-s32 temp src index-known-fixnum)
    1345                           (! misc-ref-c-u32 temp src index-known-fixnum)))))
    1346                (with-imm-target () idx-reg
    1347                  (if index-known-fixnum
    1348                    (arm2-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2)))
    1349                    (! scale-32bit-misc-index idx-reg unscaled-idx))
    1350                  (cond ((eq type-keyword :single-float-vector)
    1351                         (! misc-ref-single-float fp-val src idx-reg))
    1352                        (t
    1353                         (if is-signed
    1354                           (! misc-ref-s32 temp src idx-reg)
    1355                           (! misc-ref-u32 temp src idx-reg)))))
     1345                          (! misc-ref-c-u32 temp src index-known-fixnum))))
     1346                 (with-imm-target () idx-reg
     1347                   (if index-known-fixnum
     1348                     (arm2-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2)))
     1349                     (! scale-32bit-misc-index idx-reg unscaled-idx))
     1350                   (cond ((eq type-keyword :single-float-vector)
     1351                          (! misc-ref-single-float fp-val src idx-reg))
     1352                         (t
     1353                          (if is-signed
     1354                            (! misc-ref-s32 temp src idx-reg)
     1355                            (! misc-ref-u32 temp src idx-reg))))))
    13561356               (case type-keyword
    13571357                 (:single-float-vector
  • branches/arm/level-0/ARM/arm-pred.lisp

    r13852 r13858  
    154154  (mov y temp1)
    155155  (bl @top)
    156   (cmp arg_z 'nul) 
     156  (cmp arg_z 'nil) 
    157157  (mov nfn fn)
    158158  (restore-lisp-frame imm0)           ; gets old fn to fn 
  • branches/arm/level-1/l1-clos-boot.lisp

    r13779 r13858  
    21132113              (find-class 'double-float-vector))))
    21142114
     2115  #+arm-target
     2116  (defparameter *ivector-vector-classes*
     2117    (vector (find-class 'short-float-vector)
     2118            (find-class 'unsigned-long-vector)
     2119            (find-class 'long-vector)
     2120            (find-class 'fixnum-vector)
     2121            (find-class 'base-string)
     2122            (find-class 'unsigned-byte-vector)
     2123            (find-class 'byte-vector)
     2124            *t-class*                   ; old base-string
     2125            (find-class 'unsigned-word-vector)
     2126            (find-class 'word-vector)
     2127            (find-class 'double-float-vector)
     2128            (find-class 'bit-vector)))
     2129
     2130
    21152131
    21162132
     
    23252341                (%svref v (+ slice x8664::fulltag-tra-1)) *tagged-return-address-class*
    23262342                (%svref v (+ slice x8664::fulltag-nil)) *null-class*))
     2343        #+arm-target
     2344        (do* ((slice 0 (+ 8 slice)))
     2345             ((= slice 256))
     2346          (declare (type (unsigned-byte 8) slice))
     2347          (setf (%svref v (+ slice arm::fulltag-even-fixnum)) *fixnum-class*
     2348                (%svref v (+ slice arm::fulltag-odd-fixnum))  *fixnum-class*
     2349                (%svref v (+ slice arm::fulltag-cons)) *cons-class*
     2350                (%svref v (+ slice arm::fulltag-nil)) *null-class*
     2351                (%svref v (+ slice arm::fulltag-imm)) *immediate-class*))
     2352
    23272353        (macrolet ((map-subtag (subtag class-name)
    23282354                     `(setf (%svref v ,subtag) (find-class ',class-name))))
  • branches/arm/lisp-kernel/arm-spentry.s

    r13854 r13858  
    379379        __(ldr imm2,[rcontext,#tcr.tlb_pointer])
    380380        __(ldr imm0,[rcontext,#tcr.db_link])
    381         __(ldr temp1,[imm2,imm0])
     381        __(ldr temp1,[imm2,imm1])
    382382        __(beq 9f)
    383383        __(vpush1(temp1))
     
    597597/* This takes N multiple values atop the vstack.  */
    598598_spentry(nthrowvalues)
    599 dnl         __(mov imm1,#1)
    600 dnl  __(mov imm4,imm0)
    601 dnl         __(str(imm1,tcr.unwinding(rcontext)))
    602 dnl local_label(_nthrowv_nextframe):
    603 dnl  __(subi imm4,imm4,fixnum_one)
    604 dnl  __(cmpri(cr1,imm4,0))
    605 dnl  __(ldr temp0,[rcontext,#tcr.catch_top])
    606 dnl  __(ldr imm1,[rcontext,#tcr.db_link])
    607 dnl  __(blt cr1,local_label(_nthrowv_done))
    608 dnl  __(ldr imm0,[temp0,#catch_frame.db_link])
    609 dnl  __(ldr imm3,[temp0,#catch_frame.link])
    610 dnl  __(cmpr(imm0,imm1))
    611 dnl  __(str(imm3,tcr.catch_top(rcontext)))
    612 dnl  __(ldr temp1,[temp0,#catch_frame.catch_tag])
    613 dnl  __(cmpri(cr7,temp1,unbound_marker))  /* unwind-protect ?  */
    614 dnl  __(ldr first_nvr,[temp0,#catch_frame.xframe])
    615 dnl  __(str(first_nvr,tcr.xframe(rcontext)))
    616 dnl  __(ldr sp,[temp0,#catch_frame.csp])
    617 dnl  __(beq local_label(_nthrowv_dont_unbind))
    618 dnl  __(mflr loc_pc)
    619 dnl         __(bl _SPunbind_to)
    620 dnl  __(mtlr loc_pc)
    621 dnl local_label(_nthrowv_dont_unbind):
    622 dnl  __(beq cr7,local_label(_nthrowv_do_unwind))
    623 dnl /* A catch frame.  If the last one, restore context from there.  */
    624 dnl  __(bne cr1,local_label(_nthrowv_skip))
    625 dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
    626 dnl  __(str(rzero,lisp_frame.savevsp(sp))) /* marker for stack overflow code  */
    627 dnl  __(add imm1,vsp,nargs)
    628 dnl  __(mov imm2,nargs)
    629 dnl  __(b local_label(_nthrowv_push_test))
    630 dnl local_label(_nthrowv_push_loop):
    631 dnl  __(ldru(temp1,-node_size(imm1)))
    632 dnl  __(push(temp1,imm0))
    633 dnl local_label(_nthrowv_push_test):
    634 dnl  __(cmp imm2,#0))
    635 dnl  __(subi imm2,imm2,fixnum_one)
    636 dnl  __(bne local_label(_nthrowv_push_loop))
    637 dnl  __(mov vsp,imm0)
    638 dnl         __(restore_catch_nvrs(temp0))
    639 dnl
    640 dnl local_label(_nthrowv_skip):
    641 dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
    642 dnl  __(unlink(tsp))
    643 dnl  __(discard_lisp_frame())
    644 dnl  __(b local_label(_nthrowv_nextframe))
    645 dnl local_label(_nthrowv_do_unwind):
    646 dnl         /* This is harder.  Call the cleanup code with the multiple */
    647 dnl  /* values (and nargs, which is a fixnum.)  Remember the throw count  */
    648 dnl         /* (also a fixnum) as well.  */
    649 dnl         /* Save our caller's LR and FN in the csp frame created by the unwind-  */
    650 dnl         /* protect.  (Clever, eh ?)  */
    651 dnl  __(ldr first_nvr,[temp0,#catch_frame.xframe])
    652 dnl  __(str(first_nvr,tcr.xframe(rcontext)))
    653 dnl         __(restore_catch_nvrs(temp0))
    654 dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
    655 dnl  __(unlink(tsp))
    656 dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
    657 dnl  __(ldr nfn,[sp,#lisp_frame.savefn])
    658 dnl  __(mtctr loc_pc) /* cleanup code address.  */
    659 dnl  __(str(fn,lisp_frame.savefn(sp)))
    660 dnl  __(mflr loc_pc)
    661 dnl  __(mov fn,nfn)
    662 dnl  __(str(loc_pc,lisp_frame.savelr(sp)))
    663 dnl  __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count  */
    664 dnl  __(TSP_Alloc_Var_Boxed_nz(imm0,imm1))
    665 dnl  __(mov imm2,nargs)
    666 dnl  __(add imm1,nargs,vsp)
    667 dnl  __(la imm0,tsp_frame.data_offset(tsp))
    668 dnl  __(str(nargs,0(imm0)))
    669 dnl  __(b local_label(_nthrowv_tpushtest))
    670 dnl local_label(_nthrowv_tpushloop):
    671 dnl  __(ldru(temp0,-node_size(imm1)))
    672 dnl  __(stru(temp0,node_size(imm0)))
    673 dnl  __(subi imm2,imm2,fixnum_one)
    674 dnl local_label(_nthrowv_tpushtest):
    675 dnl  __(cmp imm2,#0)
    676 dnl  __(bne local_label(_nthrowv_tpushloop))
    677 dnl  __(stru(imm4,node_size(imm0)))
    678 dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
    679 dnl         /* Interrupts should be disabled here (we're calling and returning */
    680 dnl         /* from the cleanup form.  Clear the tcr.unwinding flag, so that */
    681 dnl         /* interrupts can be taken if they're enabled in the cleanup form.  */
    682 dnl         __(str(rzero,tcr.unwinding(rcontext)))       
    683 dnl  __(bctrl)
    684 dnl         __(mov imm1,#1)
    685 dnl  __(la imm0,tsp_frame.data_offset(tsp))
    686 dnl         __(str(imm1,tcr.unwinding(rcontext)))
    687 dnl  __(ldr fn,[sp,#lisp_frame.savefn])
    688 dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
    689 dnl  __(discard_lisp_frame())
    690 dnl  __(mtlr loc_pc)
    691 dnl  __(ldr nargs,[imm0,#0])
    692 dnl  __(mov imm2,nargs)
    693 dnl  __(b local_label(_nthrowv_tpoptest))
    694 dnl local_label(_nthrowv_tpoploop):
    695 dnl  __(ldru(temp0,node_size(imm0)))
    696 dnl  __(vpush1(temp0))
    697 dnl  __(subi imm2,imm2,fixnum_one)
    698 dnl local_label(_nthrowv_tpoptest):
    699 dnl  __(cmp imm2,#0)
    700 dnl  __(bne local_label(_nthrowv_tpoploop))
    701 dnl  __(ldr imm4,[imm0,#node_size])
    702 dnl  __(unlink(tsp))
    703 dnl  __(b local_label(_nthrowv_nextframe))
    704 dnl local_label(_nthrowv_done):
    705 dnl         __(str(rzero,tcr.unwinding(rcontext)))
    706 dnl         /* Poll for a deferred interrupt.  That clobbers nargs (which we've */
    707 dnl         /* just expended a lot of effort to preserve), so expend a little *
    708 dnl         /* more effort. */
    709 dnl         __(mov imm4,nargs)
    710 dnl         __(check_pending_interrupt())
    711 dnl         __(mov nargs,imm4)
    712 dnl         __(bx lr)
     599        __(mov imm1,#1)
     600        __(mov temp2,imm0)
     601        __(str imm1,[rcontext,#tcr.unwinding])
     602        __(b C(nthrownv))
    713603
    714604/* This is a (slight) optimization.  When running an unwind-protect, */
     
    1109999
    11101000_spentry(progvsave)
     1001        __(uuo_debug_trap(al))
    11111002dnl  /* Error if arg_z isn't a proper list.  That's unlikely, */
    11121003dnl  /* but it's better to check now than to crash later. */
     
    19431834dnl
    19441835_spentry(recover_values)
     1836        __(uuo_debug_trap(al))
    19451837dnl
    19461838dnl /* First, walk the segments reversing the pointer to previous segment pointers  */
     
    21262018dnl
    21272019_spentry(save_values)
     2020        __(uuo_debug_trap(al))
    21282021dnl  __(mov imm1,tsp)
    21292022dnl
     
    21612054dnl
    21622055_spentry(add_values)
     2056        __(uuo_debug_trap(al))
    21632057dnl  __(cmpri(nargs,0))
    21642058dnl  __(ldr imm1,[tsp,#0])
     
    28212715        __(mov temp1,imm1)      /* from comparison above */
    28222716local_label(current_key_allow_other_keys_handled):
    2823         __(getvheader(imm0,temp1))
     2717        __(getvheader(imm0,temp2))
    28242718        __(header_length(arg_x,imm0))
    28252719        __(add imm0,arg_x,#misc_data_offset)
     
    286427580:      __(tst keyword_flags,#keyword_flag_rest)
    28652759        __(beq local_label(discard_stack_vector))
    2866         __(mov nargs,#0)
     2760        __(mov imm0,#0)
    28672761        __(add temp2,sp,#node_size)
    28682762        __(b 2f)
    286927631:      __(ldr arg_x,[temp2],#node_size)
    28702764        __(vpush1(arg_x))
    2871         __(add nargs,nargs,#fixnumone)
    2872 2:      __(cmp nargs,key_value_count)
     2765        __(add imm0,imm0,#fixnumone)
     27662:      __(cmp imm0,key_value_count)
    28732767        __(bne 1b)
    28742768local_label(discard_stack_vector):     
     
    40503944popdef(`__')
    40513945
    4052 C(nthrow1v):   
     3946_exportfn(C(nthrow1v))
     3947        new_local_labels()
    40533948local_label(_nthrow1v_nextframe):
    40543949        __(subs temp2,temp2,#fixnum_one)
     
    40683963        __(ldr temp1,[temp0,#catch_frame.catch_tag])
    40693964        __(cmp temp1,#unbound_marker)  /* unwind-protect ?  */
     3965        __(sub sp,temp0,#fulltag_misc)
    40703966        __(beq local_label(_nthrow1v_do_unwind))
    40713967        /* A catch frame.  If the last one, restore context from there.  */
     
    41094005        __(check_pending_interrupt(nargs))
    41104006        __(bx lr)
    4111        
     4007_endfn       
     4008
     4009_exportfn(nthrownv)
     4010        new_local_labels()
     4011local_label(nthrownv_nextframe):
     4012        __(subs temp2,temp2,#fixnum_one)
     4013        __(ldr temp0,[rcontext,#tcr.catch_top])
     4014        __(ldr imm1,[rcontext,#tcr.db_link])
     4015        __(blt local_label(nthrownv_done))
     4016        __(ldr arg_y,[temp0,#catch_frame.link])
     4017        __(ldr imm0,[temp0,#catch_frame.db_link])
     4018        __(cmp imm0,imm1)
     4019        __(str arg_y,[rcontext,#tcr.catch_top])
     4020        __(ldr arg_y,[temp0,#catch_frame.xframe])
     4021        __(str arg_y,[rcontext,#tcr.xframe])
     4022        __(beq local_label(nthrownv_dont_unbind))
     4023        __(do_unbind_to(imm1,temp1,arg_x,arg_y))
     4024local_label(nthrownv_dont_unbind):
     4025        __(ldr temp1,[temp0,#catch_frame.catch_tag])
     4026        __(cmp temp1,#unbound_marker)  /* unwind-protect ?  */
     4027        __(sub sp,temp0,#fulltag_misc)
     4028        __(beq local_label(nthrownv_do_unwind))
     4029        __(cmp temp2,#0)
     4030/* A catch frame.  If the last one, restore context from there.  */
     4031        __(bne local_label(nthrownv_skip))
     4032        __(ldr imm0,[sp,#catch_frame.size+lisp_frame.savevsp])
     4033        __(add imm1,vsp,nargs)
     4034        __(movs arg_z,nargs)
     4035        __(b local_label(nthrownv_push_test))
     4036local_label(nthrownv_push_loop):       
     4037        __(subs arg_z,arg_z,#fixnumone)
     4038        __(ldr temp1,[imm1,#-node_size]!)
     4039        __(push1(temp1,imm0))
     4040local_label(nthrownv_push_test):       
     4041        __(bne local_label(nthrownv_push_loop))
     4042        __(mov vsp,imm0)
     4043local_label(nthrownv_skip):     
     4044        __(add sp,sp,#catch_frame.size+lisp_frame.size)
     4045        __(b local_label(nthrownv_nextframe))               
     4046local_label(nthrownv_do_unwind):
     4047        __(ldr arg_x,[temp0,#catch_frame.xframe])
     4048        __(ldr arg_z,[temp0,#catch_frame.last_lisp_frame])
     4049        __(sub sp,temp0,#fulltag_misc)
     4050        __(str arg_x,[rcontext,#tcr.xframe])
     4051        __(str arg_z,[rcontext,#tcr.last_lisp_frame])
     4052        __(add sp,sp,#catch_frame.size)
     4053        __(add imm1,nargs,#node_size)
     4054        __(mov arg_z,sp)
     4055        __(dnode_align(imm0,imm1,node_size))
     4056        __(mov imm1,imm1,lsl #num_subtag_bits-fixnumshift)
     4057        __(orr imm1,imm1,#subtag_u32_vector)
     4058        __(stack_allocate_zeroed_ivector(imm1,imm0))
     4059        __(mov imm0,#subtag_simple_vector)
     4060        __(strb imm0,[sp])
     4061        __(str temp2,[sp,#node_size])
     4062        __(add temp2,sp,#dnode_size)
     4063        __(add temp2,temp2,nargs)
     4064        __(add temp1,vsp,nargs)
     4065        __(b local_label(nthrownv_tpushtest))
     4066local_label(nthrownv_tpushloop):       
     4067        __(ldr temp0,[temp1,#-node_size]!)
     4068        __(push1(temp0,temp2))
     4069local_label(nthrownv_tpushtest):       
     4070        __(subs nargs,nargs,#fixnumone)
     4071        __(bge local_label(nthrownv_tpushloop))
     4072        __(mov imm1,#0)
     4073        __(add imm0,arg_z,#lisp_frame.savelr)
     4074        __(swp lr,lr,[imm0])
     4075        __(ldr nfn,[arg_z,#lisp_frame.savefn])
     4076        __(str fn,[arg_z,#lisp_frame.savefn])
     4077        __(ldr vsp,[arg_z,#lisp_frame.savevsp])
     4078        __(str imm1,[rcontext,#tcr.unwinding])
     4079        __(mov fn,nfn)
     4080        __(blx lr)
     4081        __(mov imm1,#1)
     4082        __(str imm1,[rcontext,#tcr.unwinding])
     4083        __(ldr imm0,[sp])
     4084        __(header_length(imm0,imm0))
     4085        __(subs nargs,imm0,#node_size)
     4086        __(add imm0,imm0,#node_size)
     4087        __(add temp0,sp,imm0)
     4088        __(mov imm0,nargs)
     4089        __(add arg_z,temp0,#node_size)
     4090        __(bic arg_z,arg_z,#fulltagmask)
     4091        __(b local_label(nthrownv_tpoptest))
     4092local_label(nthrownv_tpoploop): 
     4093        __(subs imm0,imm0,#node_size)       
     4094        __(vpush1(temp2))
     4095local_label(nthrownv_tpoptest): 
     4096        __(ldr temp2,[temp0,#-node_size]!)
     4097        __(bne local_label(nthrownv_tpoploop))
     4098        __(mov sp,arg_z)
     4099        __(ldr fn,[sp,#lisp_frame.savefn])
     4100        __(ldr lr,[sp,#lisp_frame.savelr])
     4101        __(discard_lisp_frame())
     4102        __(b local_label(nthrownv_nextframe))
     4103local_label(nthrownv_done):     
     4104        __(mov imm0,#0)
     4105        __(str imm0,[rcontext,#tcr.unwinding])
     4106        __(check_pending_interrupt(imm1))
     4107        __(bx lr)
     4108_endfn               
     4109                       
     4110               
    41124111/* Too large to safely fit on tstack.  Heap-cons the vector, but make  */
    41134112/* sure that there's an empty tsp frame to keep the compiler happy.  */
    4114 stack_misc_alloc_no_room:       
     4113_exportfn(stack_misc_alloc_no_room)
    41154114        __(mov imm0,#stack_alloc_marker)
    41164115        __(mov imm1,sp)
    41174116        __(stmdb sp!,{imm0,imm1})
    41184117        __(b _SPmisc_alloc)
    4119        
     4118_endfn       
    41204119        _endfile
Note: See TracChangeset for help on using the changeset viewer.