Ignore:
Timestamp:
Feb 15, 2013, 7:24:29 AM (6 years ago)
Author:
gb
Message:

Propagate recent trunk changes.

Location:
release/1.9/source/lisp-kernel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • release/1.9/source/lisp-kernel

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

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