Changeset 15851 for release/1.9/source


Ignore:
Timestamp:
Jun 28, 2013, 7:14:32 AM (6 years ago)
Author:
gb
Message:

Reinstate old destructuring subprims, which were removed prematurely.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/1.9/source/lisp-kernel/ppc-spentry.s

    r15755 r15851  
    33643364/* Deprecated */       
    33653365_spentry(poweropen_ffcallX)
     3366        .long 0x7c800008        /* debug trap */
     3367
     3368
     3369/* Destructuring-bind, macro-bind.  */
     3370   
     3371/* OK to use arg_x, arg_y for whatever (tagged) purpose;  */
     3372/* likewise immX regs.  */
     3373/* arg_z preserved, nothing else in particular defined on exit.  */
     3374/* nargs contains req count (0-255) in PPC bits mask_req_start/mask_req_width,  */
     3375/* opt count (0-255) in PPC bits mask_opt_start/mask_opt_width,  */
     3376/* key count (0-255) in PPC bits mask_key_start/mask_key_width,  */
     3377/* opt-supplied-p flag in PPC bit mask_initopt,  */
     3378/* keyp flag in PPC bit mask_keyp,  */
     3379/* &allow-other-keys flag in PPC bit mask_aok,  */
     3380/* &rest flag in PPC bit mask_restp.  */
     3381/* When mask_keyp bit is set, keyvect contains vector of keyword symbols,  */
     3382/* length key count.  */
     3383
    33663384_spentry(macro_bind)
     3385        __ifdef(`PPC64')
     3386         __(mr whole_reg,arg_reg)
     3387         __(extract_fulltag(imm0,arg_reg))
     3388         __(cmpri(cr1,arg_reg,nil_value))
     3389         __(cmpri(cr0,imm0,fulltag_cons))
     3390         __(beq cr1,0f)
     3391         __(bne- cr0,1f)
     33920:             
     3393         __(_cdr(arg_reg,arg_reg))
     3394         __(b local_label(destbind1))
     3395        __else
     3396         __(mr whole_reg,arg_reg)
     3397         __(extract_lisptag(imm0,arg_reg))
     3398         __(cmpri(cr0,imm0,tag_list))
     3399         __(bne- cr0,1f)
     3400         __(_cdr(arg_reg,arg_reg))
     3401         __(b (local_label(destbind1)))
     3402        __endif
     34031:
     3404        __(li arg_y,XCALLNOMATCH)
     3405        __(mr arg_z,whole_reg)
     3406        __(set_nargs(2))
     3407        __(b _SPksignalerr)
     3408
     3409
    33673410_spentry(destructuring_bind)
     3411        __(mr whole_reg,arg_reg)
     3412        __(b local_label(destbind1))
     3413       
    33683414_spentry(destructuring_bind_inner)
    3369         .long 0x7c800008        /* debug trap */
     3415        __(mr whole_reg,arg_z)
     3416local_label(destbind1):
     3417        /* Extract required arg count.  */
     3418        /* A bug in gas: can't handle shift count of "32" (= 0  */
     3419        ifelse(eval(mask_req_width+mask_req_start),eval(32),`
     3420        __(clrlwi. imm0,nargs,mask_req_start)
     3421        ',`
     3422        __(extrwi. imm0,nargs,mask_req_width,mask_req_start)
     3423        ')
     3424        __(extrwi imm1,nargs,mask_opt_width,mask_opt_start)
     3425        __(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)
     3426        __(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)
     3427        __(cmpri(cr4,imm4,0))
     3428        __(rlwinm imm4,nargs,0,mask_restp,mask_restp)
     3429        __(cmpri(cr5,imm4,0))
     3430        __(cmpri(cr1,imm1,0))
     3431        __(cmpri(cr2,imm2,0))
     3432        /* Save entry vsp in case of error.  */
     3433        __(mr imm4,vsp)
     3434        __(beq cr0,2f)
     34351:
     3436        __(cmpri(cr7,arg_reg,nil_value))
     3437        __ifdef(`PPC64')
     3438         __(extract_fulltag(imm3,arg_reg))
     3439         __(cmpri(cr3,imm3,fulltag_cons))
     3440        __else       
     3441         __(extract_lisptag(imm3,arg_reg))
     3442         __(cmpri(cr3,imm3,tag_list))
     3443        __endif
     3444        __(subi imm0,imm0,1)
     3445        __(cmpri(cr0,imm0,0))
     3446        __(beq cr7,toofew)
     3447        __(bne cr3,badlist)
     3448        __(ldr(arg_x,cons.car(arg_reg)))
     3449        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3450        __(vpush(arg_x))
     3451        __(bne cr0,1b)
     34522:
     3453        __(beq cr1,rest_keys)
     3454        __(bne cr2,opt_supp)
     3455        /* 'simple' &optionals:  no supplied-p, default to nil.  */
     3456simple_opt_loop:
     3457        __(cmpri(cr0,arg_reg,nil_value))
     3458        __ifdef(`PPC64')
     3459         __(extract_fulltag(imm3,arg_reg))
     3460         __(cmpri(cr3,imm3,fulltag_cons))
     3461        __else
     3462         __(extract_lisptag(imm3,arg_reg))
     3463         __(cmpri(cr3,imm3,tag_list))
     3464        __endif
     3465        __(subi imm1,imm1,1)
     3466        __(cmpri(cr1,imm1,0))
     3467        __(li imm5,nil_value)
     3468        __(beq cr0,default_simple_opt)
     3469        __(bne cr3,badlist)
     3470        __(ldr(arg_x,cons.car(arg_reg)))
     3471        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3472        __(vpush(arg_x))
     3473        __(bne cr1,simple_opt_loop)
     3474        __(b rest_keys)
     3475default_simple_opt_loop:
     3476        __(subi imm1,imm1,1)
     3477        __(cmpri(cr1,imm1,0))
     3478default_simple_opt:
     3479        __(vpush(imm5))
     3480        __(bne cr1,default_simple_opt_loop)
     3481        __(b rest_keys)
     3482        /* Provide supplied-p vars for the &optionals.  */
     3483opt_supp:
     3484        __(li arg_y,t_value)
     3485opt_supp_loop:
     3486        __(cmpri(cr0,arg_reg,nil_value))
     3487        __ifdef(`PPC64')
     3488         __(extract_fulltag(imm3,arg_reg))
     3489         __(cmpri(cr3,imm3,fulltag_cons))
     3490        __else       
     3491         __(extract_lisptag(imm3,arg_reg))
     3492         __(cmpri(cr3,imm3,tag_list))
     3493        __endif
     3494        __(subi imm1,imm1,1)
     3495        __(cmpri(cr1,imm1,0))
     3496        __(beq cr0,default_hard_opt)
     3497        __(bne cr3,badlist)
     3498        __(ldr(arg_x,cons.car(arg_reg)))
     3499        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3500        __(vpush(arg_x))
     3501        __(vpush(arg_y))
     3502        __(bne cr1,opt_supp_loop)
     3503        __(b rest_keys)
     3504default_hard_opt_loop:
     3505        __(subi imm1,imm1,1)
     3506        __(cmpri(cr1,imm1,0))
     3507default_hard_opt:
     3508        __(vpush(imm5))
     3509        __(vpush(imm5))
     3510        __(bne cr1,default_hard_opt_loop)
     3511rest_keys:
     3512        __(cmpri(cr0,arg_reg,nil_value))
     3513        __(bne cr5,have_rest)
     3514        __(bne cr4,have_keys)
     3515        __(bne cr0,toomany)
     3516        __(blr)
     3517have_rest:
     3518        __(vpush(arg_reg))
     3519        __(beqlr cr4)
     3520have_keys:
     3521        /* Ensure that arg_reg contains a proper,even-length list.  */
     3522        /* Insist that its length is <= 512 (as a cheap circularity check.)  */
     3523        __(li imm0,256)
     3524        __(mr arg_x,arg_reg)
     3525count_keys_loop:
     3526        __ifdef(`PPC64')
     3527         __(extract_fulltag(imm3,arg_x))
     3528         __(cmpri(cr3,imm3,fulltag_cons))
     3529        __else
     3530         __(extract_lisptag(imm3,arg_x))
     3531         __(cmpri(cr3,imm3,tag_list))
     3532        __endif
     3533        __(cmpri(cr0,arg_x,nil_value))
     3534        __(subi imm0,imm0,1)
     3535        __(cmpri(cr4,imm0,0))
     3536        __(beq cr0,counted_keys)
     3537        __(bne cr3,badlist)
     3538        __(ldr(arg_x,cons.cdr(arg_x)))
     3539        __ifdef(`PPC64')
     3540         __(extract_fulltag(imm3,arg_x))
     3541         __(cmpri(cr3,imm3,fulltag_cons))
     3542        __else
     3543         __(extract_lisptag(imm3,arg_x))
     3544         __(cmpri(cr3,imm3,tag_list))
     3545        __endif
     3546        __(blt cr4,toomany)
     3547        __(cmpri(cr0,arg_x,nil_value))
     3548        __(beq cr0,db_badkeys)
     3549        __(bne cr3,badlist)
     3550        __(ldr(arg_x,cons.cdr(arg_x)))
     3551        __(b count_keys_loop)
     3552counted_keys:
     3553        /* We've got a proper, even-length list of key/value pairs in */
     3554        /* arg_reg. For each keyword var in the lambda-list, push a pair */
     3555        /* of NILs on the vstack.  */
     3556        __(extrwi. imm0,nargs,mask_key_width,mask_key_start )
     3557        __(mr imm2,imm0)        /* save number of keys  */
     3558        __(li imm5,nil_value)
     3559        __(b push_pair_test)
     3560push_pair_loop:
     3561        __(cmpri(cr0,imm0,1))
     3562        __(subi imm0,imm0,1)
     3563        __(vpush(imm5))
     3564        __(vpush(imm5))
     3565push_pair_test:
     3566        __(bne cr0,push_pair_loop)
     3567        __(slwi imm2,imm2,dnode_shift)  /* pairs -> bytes  */
     3568        __(add imm2,vsp,imm2)           /* imm2 points below pairs  */
     3569        __(li imm0,0)                   /* count unknown keywords so far  */
     3570        __(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed  */
     3571        __(extrwi nargs,nargs,mask_key_width,mask_key_start)
     3572        /* Now, for each keyword/value pair in the list  */
     3573        /*  a) if the keyword is found in the keyword vector, set the  */
     3574        /*     corresponding entry on the vstack to the value and the  */
     3575        /*     associated supplied-p var to T.  */
     3576        /*  b) Regardless of whether or not the keyword is found,  */
     3577        /*     if :ALLOW-OTHER-KEYS is provided with a non-nil value, */
     3578        /*     set the low bit of imm1 to indicate that unknown keywords  */
     3579        /*     are acceptable. (This bit is pre-set above to the value */
     3580        /*     the encoded value of &allow_other_keys.) */
     3581        /*  c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment  */
     3582        /*     the count of unknown keywords in the high bits of imm1*/
     3583        /* At the end of the list, signal an error if any unknown keywords were seen  */
     3584        /* but not allowed.  Otherwise, return.  */
     3585
     3586match_keys_loop:
     3587        __(cmpri(cr0,arg_reg,nil_value))
     3588        __(li imm0,0)
     3589        __(li imm3,misc_data_offset)
     3590        __(beq cr0,matched_keys)
     3591        __(ldr(arg_x,cons.car(arg_reg)))
     3592        __(li arg_y,nrs.kallowotherkeys)
     3593        __(cmpr(cr3,arg_x,arg_y))       /* :ALLOW-OTHER-KEYS ?  */
     3594        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3595        __(ldr(arg_y,cons.car(arg_reg)))
     3596        __(cmpr(cr4,imm0,nargs))
     3597        __(ldr(arg_reg,cons.cdr(arg_reg)))
     3598        __(b match_test)
     3599match_loop:
     3600        __(ldrx(temp0,keyvect_reg,imm3))
     3601        __(cmpr(cr0,arg_x,temp0))
     3602        __(addi imm0,imm0,1)
     3603        __(cmpr(cr4,imm0,nargs))
     3604        __(addi imm3,imm3,node_size)
     3605        __(bne cr0,match_test)
     3606        /* Got a hit.  Unless this keyword's been seen already, set it.  */
     3607        __(slwi imm0,imm0,dnode_shift)
     3608        __(subf imm0,imm0,imm2)
     3609        __(ldr(temp0,0(imm0)))
     3610        __(cmpri(cr0,temp0,nil_value))
     3611        __(li temp0,t_value)
     3612        __(bne cr0,match_keys_loop)     /* already saw this  */
     3613        __(str(arg_y,node_size*1(imm0)))
     3614        __(str(temp0,node_size*0(imm0)))
     3615        __(bne cr3,match_keys_loop)
     3616        __(b match_keys_check_aok)
     3617match_test:
     3618        __(bne cr4,match_loop)
     3619        __(beq cr3,match_keys_check_aok)
     3620        __(addi imm1,imm1,node_size)
     3621        __(b match_keys_loop)
     3622match_keys_check_aok:
     3623        __(andi. imm0,imm1,2)  /* check "seen-aok" bit in imm1 */
     3624        __(cmpri cr1,arg_y,nil_value) /* check value */
     3625        __(ori imm1,imm1,2)
     3626        __(bne cr0,match_keys_loop) /* duplicate aok */
     3627        __(beq cr1,match_keys_loop)
     3628        __(ori imm1,imm1,1)
     3629        __(b match_keys_loop)
     3630matched_keys:
     3631        __(clrrwi. imm0,imm1,2)
     3632        __(beqlr)
     3633        __(andi. imm1,imm1,1)
     3634        __(bnelr)
     3635        /* Some unrecognized keywords.  Complain generically about  */
     3636        /* invalid keywords.  */
     3637db_badkeys:
     3638        __(li arg_y,XBADKEYS)
     3639        __(b destructure_error)
     3640toomany:
     3641        __(li arg_y,XCALLTOOMANY)
     3642        __(b destructure_error)
     3643toofew:
     3644        __(li arg_y,XCALLTOOFEW)
     3645        __(b destructure_error)
     3646badlist:
     3647        __(li arg_y,XCALLNOMATCH)
     3648        /* b destructure_error  */
     3649destructure_error:
     3650        __(mr vsp,imm4)         /* undo everything done to the stack  */
     3651        __(mr arg_z,whole_reg)
     3652        __(set_nargs(2))
     3653        __(b _SPksignalerr)
    33703654       
    33713655/* vpush the values in the value set atop the vsp, incrementing nargs.  */
Note: See TracChangeset for help on using the changeset viewer.