source: branches/working-0711/ccl/lisp-kernel/ppc-macros.s @ 9981

Last change on this file since 9981 was 9981, checked in by gb, 12 years ago

Mostly, use () in macroexpansions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.8 KB
Line 
1/*   Copyright (C) 1994-2001 Digitool, Inc */
2/*   This file is part of OpenMCL.  */
3
4/*   OpenMCL is licensed under the terms of the Lisp Lesser GNU Public */
5/*   License , known as the LLGPL and distributed with OpenMCL as the */
6/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL, */
7/*   which is distributed with OpenMCL as the file "LGPL".  Where these */
8/*   conflict, the preamble takes precedence.   */
9
10/*   OpenMCL is referenced in the preamble as the "LIBRARY." */
11
12/*   The LLGPL is also available online at */
13/*   http://opensource.franz.com/preamble.html */
14
15/* The assembler has to do the arithmetic here:  the expression */
16/*   may not be evaluable by m4. */
17define([lwi],[ifdef([DARWIN],[
18        .if ((($2) & 0xffff8000) == 0xffff8000)
19         li $1,($2)
20        .elseif ((($2) & 0xffff8000) == 0)
21         li $1,$2
22        .else
23         lis $1,(($2)>>16)
24         .if (($2) & 0xffff) <> 0
25          ori $1,$1,(($2) & 0xffff)
26         .endif
27        .endif],[
28        .ifeq (($2) & 0xffff8000)-0xffff8000
29         li $1,$2
30        .else
31         .ifeq (($2) & 0xffff8000)
32          li $1,$2
33         .else
34          lis $1,($2>>16)
35          .ifne ($2 & 0xffff)
36           ori $1,$1,$2 & 0xffff
37          .endif
38         .endif
39        .endif
40])])
41
42ifdef([PPC64],[
43        define([clrrri],[clrrdi $@])       
44        define([clrlri],[clrldi $@])
45        define([clrlri_],[clrldi. $@])
46        define([ldr],[ld $@])
47        define([ldrx],[ldx $@])
48        define([ldru],[ldu $@])
49        define([str],[std $@])
50        define([strx],[stdx $@])
51        define([stru],[stdu $@])
52        define([strux],[stdux $@])     
53        define([cmpr],[cmpd $@])
54        define([cmpri],[cmpdi $@])
55        define([cmplr],[cmpld $@])
56        define([cmplri],[cmpldi $@])
57        define([trlge],[tdlge $@])
58        define([trllt],[tdllt $@])
59        define([trlt],[tdlt $@])
60        define([trlle],[tdlle $@])
61        define([treqi],[tdeqi $@])
62        define([trnei],[tdnei $@])
63        define([trgti],[tdgti $@])
64        define([srari],[sradi $@])
65        define([srri],[srdi $@])
66        define([srr],[srd $@])
67        define([slri],[sldi $@])
68        define([lrarx],[ldarx $@])
69        define([strcx],[stdcx. $@])
70        define([load_highbit],[
71        __(lis $1,0x8000)
72        __(sldi $1,$1,32)
73        ])
74        define([extract_bit_shift_count],[
75        __(clrldi $1,$2,64-bitmap_shift)
76        ])
77        define([alloc_trap],[
78        __(tdlt allocptr,allocbase)
79        ])
80        define([mullr],[mulld $@])
81],[
82        define([clrrri],[clrrwi $@])
83        define([clrlri],[clrlwi $@])
84        define([clrlri_],[clrlwi. $@])
85        define([ldr],[lwz $@])
86        define([ldrx],[lwzx $@])
87        define([ldru],[lwzu $@])
88        define([str],[stw $@])
89        define([strx],[stwx $@])
90        define([stru],[stwu $@])
91        define([strux],[stwux $@])
92        define([cmpr],[cmpw $@])
93        define([cmpri],[cmpwi $@])
94        define([cmplr],[cmplw $@])
95        define([cmplri],[cmplwi $@])
96        define([trlge],[twlge $@])
97        define([trllt],[twllt $@])
98        define([trlt],[twlt $@])
99        define([trlle],[twlle $@])       
100        define([treqi],[tweqi $@])
101        define([trnei],[twnei $@])
102        define([trgti],[twgti $@])
103        define([srari],[srawi $@])
104        define([srri],[srwi $@])
105        define([srr],[srw $@])
106        define([slri],[slwi $@])
107        define([lrarx],[lwarx $@])
108        define([strcx],[stwcx. $@])
109        define([load_highbit],[
110        __(lis $1,0x8000)
111        ])
112        define([extract_bit_shift_count],[
113        __(clrlwi $1,$2,32-bitmap_shift)
114        ])
115        define([alloc_trap],[
116        __(twllt allocptr,allocbase)
117        ])
118        define([mullr],[mullw $@])
119])
120
121/* dnode_align(dest,src,delta) */
122        define([dnode_align],[
123        __(la $1,($3+(dnode_size-1))($2))
124        __(clrrri($1,$1,dnode_align_bits))
125])
126
127define([extract_fulltag],[
128        __(clrlri($1,$2,nbits_in_word-ntagbits))
129        ])
130
131define([extract_lisptag],[
132        __(clrlri($1,$2,nbits_in_word-nlisptagbits))
133        ])
134
135define([extract_lisptag_],[
136        __(clrlri_($1,$2,nbits_in_word-nlisptagbits))
137        ])
138
139define([extract_subtag],[
140        __(lbz $1,misc_subtag_offset($2))
141        ])
142
143ifdef([PPC64],[
144define([extract_lowtag],[
145        __(clrldi $1,$2,nbits_in_word-nlowtagbits)
146])
147define([trap_unless_lowtag_equal],[
148        __(clrldi $3,$1,nbits_in_word-nlowtagbits)
149        __(tdnei $3,$2)
150])               
151        ])
152                               
153define([extract_lowbyte],[
154        __(clrlri($1,$2,nbits_in_word-num_subtag_bits))
155        ])
156
157define([extract_header],[
158        __(ldr($1,misc_header_offset($2)))
159        ])
160
161
162ifdef([PPC64],[
163define([extract_typecode],[
164        new_macro_labels()
165        __(extract_fulltag($1,$2))
166        __(cmpdi cr0,$1,fulltag_misc)
167        __(extract_lisptag($1,$1))
168        __(bne cr0,macro_label(not_misc))
169        __(extract_subtag($1,$2))
170macro_label(not_misc):
171])],[   
172define([extract_typecode],[
173        new_macro_labels()
174        __(extract_lisptag($1,$2))
175        __(cmpwi cr0,$1,tag_misc)
176        __(bne cr0,macro_label(not_misc))
177        __(extract_subtag($1,$2))
178macro_label(not_misc):
179])])
180
181define([box_fixnum],[
182        __(slri($1,$2,fixnumshift))
183        ])
184
185define([unbox_fixnum],[ 
186        __(srari($1,$2,fixnumshift))
187        ])
188
189define([loaddf],[
190        __(lfd $1,dfloat.value($2))])
191       
192define([storedf],[
193        __(stfd $1,dfloat.value($2))
194        ])
195
196define([push],[
197        __(stru($1,-node_size($2)))
198        ])
199       
200        /* Generally not a great idea. */
201define([pop],[
202        __(ldr($1,0($2)))
203        __(la $2,node_size($2))
204        ])
205       
206define([vpush],[
207        __(push($1,vsp))
208        ])
209       
210define([vpop],[
211        __(pop($1,vsp))
212        ])
213       
214               
215define([unlink],[
216        __(ldr($1,0($1)))
217 ])
218
219       
220define([set_nargs],[
221        __(lwi(nargs,($1)<<fixnumshift))
222        ])
223       
224define([bitclr],[
225        __(rlwinm $1,$2,0,0x1f&((31-($3))+1),0x1f&((31-($3))-1))
226        ])
227       
228
229define([vref32],[
230        __(lwz $1,misc_data_offset+(($3)<<2)($2))
231        ])
232       
233define([vref16],[/* dest,src,n*/
234        __(lhz $1,misc_data_offset+(($3)<<1)($2))
235        ])
236       
237ifdef([PPC64],[
238        define([vref64],[
239        __(ld $1,misc_data_offset+(($3)<<3)($2))
240        ])
241
242        define([vrefr],[
243        __(vref64($1,$2,$3))
244        ])
245],[
246        define([vrefr],[
247        __(vref32($1,$2,$3))
248        ])
249])
250       
251                       
252define([getvheader],[
253        __(ldr($1,vector.header($2)))
254        ])
255       
256        /* Size is unboxed element count */
257define([header_size],[
258        __(srri($1,$2,num_subtag_bits))
259        ])
260       
261        /* "Length" is fixnum element count */
262define([header_length],[
263ifdef([PPC64],[
264        __(rldicr $1,$2,nbits_in_word-(num_subtag_bits-nfixnumtagbits),63-nfixnumtagbits)
265        __(clrldi $1,$1,(num_subtag_bits-nfixnumtagbits))
266        ],[               
267        __(rlwinm $1,$2,nbits_in_word-(num_subtag_bits-nfixnumtagbits),(num_subtag_bits-nfixnumtagbits),31-nfixnumtagbits)
268        ])
269])       
270
271
272define([vector_size],[
273        __(getvheader(ifelse($3.[],$1,$3),$2))
274        __(header_size($1,ifelse($3.[],$1,$3)))
275        ])
276       
277define([vector_length],[
278        __(getvheader($3,$2))
279        __(header_length($1,$3))
280        ])
281
282       
283define([ref_global],[
284        __(ldr($1,lisp_globals.$2(0)))
285])
286
287define([set_global],[
288        __(str($1,lisp_globals.$2(0)))
289])
290
291define([ref_nrs_value],[
292        __(ldr($1,((nrs.$2)+(symbol.vcell))(0)))
293])
294       
295define([set_nrs_value],[
296        __(str($1,((nrs.$2)+(symbol.vcell))(0)))
297])
298
299define([extract_unsigned_byte_bits],[
300ifdef([PPC64],[
301        __(rldicr $1,$2,64-fixnumshift,63-$3)
302],[               
303        __(rlwinm $1,$2,0,32-fixnumshift,31-($3+fixnumshift))
304])       
305])
306
307define([extract_unsigned_byte_bits_],[
308ifdef([PPC64],[
309        __(rldicr. $1,$2,64-fixnumshift,63-$3)
310],[               
311        __(rlwinm. $1,$2,0,32-fixnumshift,31-($3+fixnumshift))
312])       
313])
314
315        /* vpop argregs - nargs is known to be non-zero */
316define([vpop_argregs_nz],[
317        new_macro_labels()
318        __(cmplri(cr1,nargs,node_size*2))
319        __(vpop(arg_z))
320        __(blt cr1,macro_label(l0))
321        __(vpop(arg_y))
322        __(bne cr1,macro_label(l0))
323        __(vpop(arg_x))
324macro_label(l0):])
325
326               
327        /* vpush argregs */
328define([vpush_argregs],[
329        new_macro_labels()
330        __(cmplri(cr0,nargs,0))
331        __(cmplri(cr1,nargs,node_size*2))
332        __(beq cr0,macro_label(done))
333        __(blt cr1,macro_label(z))
334        __(beq cr1,macro_label(yz))
335        __(vpush(arg_x))
336macro_label(yz):
337        __(vpush(arg_y))
338macro_label(z):
339        __(vpush(arg_z))
340macro_label(done):
341])
342
343define([create_lisp_frame],[
344        __(stru(sp,-lisp_frame.size(sp)))
345])
346
347               
348define([build_lisp_frame],[
349        create_lisp_frame()
350        __(str(ifelse($1,[],fn,$1),lisp_frame.savefn(sp)))
351        __(str(ifelse($2,[],loc_pc,$2),lisp_frame.savelr(sp)))
352        __(str(ifelse($3,[],vsp,$3),lisp_frame.savevsp(sp)))
353])
354
355               
356define([discard_lisp_frame],[
357        __(la sp,lisp_frame.size(sp))
358        ])
359       
360       
361define([_car],[
362        __(ldr($1,cons.car($2)))
363])
364       
365define([_cdr],[
366        __(ldr($1,cons.cdr($2)))
367        ])
368       
369define([_rplaca],[
370        __(str($2,cons.car($1)))
371        ])
372       
373define([_rplacd],[
374        __(str($2,cons.cdr($1)))
375        ])
376
377define([vpush_saveregs],[
378        __(vpush(save7))
379        __(vpush(save6))
380        __(vpush(save5))
381        __(vpush(save4))
382        __(vpush(save3))
383        __(vpush(save2))
384        __(vpush(save1))
385        __(vpush(save0))
386        ])
387       
388define([restore_saveregs],[
389        __(ldr(save0,node_size*0($1)))
390        __(ldr(save1,node_size*1($1)))
391        __(ldr(save2,node_size*2($1)))
392        __(ldr(save3,node_size*3($1)))
393        __(ldr(save4,node_size*4($1)))
394        __(ldr(save5,node_size*5($1)))
395        __(ldr(save6,node_size*6($1)))
396        __(ldr(save7,node_size*7($1)))
397])
398
399define([vpop_saveregs],[
400        __(restore_saveregs(vsp))
401        __(la vsp,node_size*8(vsp))
402])
403
404define([trap_unless_lisptag_equal],[
405        __(extract_lisptag($3,$1))
406        __(trnei($3,$2))
407])
408
409ifdef([PPC64],[
410define([trap_unless_list],[
411        new_macro_labels()
412        __(cmpdi ifelse($3,$3,cr0),$1,nil_value)
413        __(extract_fulltag($2,$1))
414        __(beq ifelse($3,$3,cr0),macro_label(is_list))
415        __(tdnei $2,fulltag_cons)
416macro_label(is_list):   
417
418])],[   
419define([trap_unless_list],[
420        __(trap_unless_lisptag_equal($1,tag_list,$2))
421])
422])
423
424define([trap_unless_fulltag_equal],[
425        __(extract_fulltag($3,$1))
426        __(trnei($3,$2))
427])
428       
429define([trap_unless_typecode_equal],[
430        __(extract_typecode($3,$1))
431        __(trnei($3,$2))
432])
433       
434/* "jump" to the code-vector of the function in nfn. */
435define([jump_nfn],[
436        __(ldr(temp0,_function.codevector(nfn)))
437        __(mtctr temp0)
438        __(bctr)
439])
440
441/* "call the code-vector of the function in nfn. */
442define([call_nfn],[
443        __(ldr(temp0,_function.codevector(nfn)))
444        __(mtctr temp0)
445        __(bctrl)
446])
447       
448
449/* "jump" to the function in fnames function cell. */
450define([jump_fname],[
451        __(ldr(nfn,symbol.fcell(fname)))
452        __(jump_nfn())
453])
454
455/* call the function in fnames function cell. */
456define([call_fname],[
457        __(ldr(nfn,symbol.fcell(fname)))
458        __(call_nfn())
459])
460
461define([do_funcall],[
462        new_macro_labels()
463        __(extract_fulltag(imm0,temp0))
464        __(cmpri(imm0,fulltag_misc))
465        __(mr nfn,temp0)
466        __(bne- macro_label(bad))
467        __(extract_subtag(imm0,temp0))
468        __(cmpri(imm0,subtag_function))
469        __(cmpri(cr1,imm0,subtag_symbol))
470        __(bne cr0,macro_label(_sym))
471        __(jump_nfn())
472macro_label(_sym):             
473        __(mr fname,temp0)
474        __(bne cr1,macro_label(bad))
475        __(jump_fname())
476macro_label(bad):
477        __(uuo_interr(error_cant_call,temp0))
478])     
479
480define([mkcatch],[
481        __(mflr loc_pc)
482        __(ldr(imm0,tcr.catch_top(rcontext)))
483        __(lwz imm1,0(loc_pc)) /* a forward branch to the catch/unwind cleanup */
484        __(rlwinm imm1,imm1,0,6,29)     /* extract LI */
485        __(add loc_pc,loc_pc,imm1)
486        __(build_lisp_frame(fn,loc_pc,vsp))
487        __(sub loc_pc,loc_pc,imm1)
488        __(la loc_pc,4(loc_pc)) /* skip over the forward branch */
489        __(mtlr loc_pc)
490        __(lwi(imm4,(catch_frame.element_count<<num_subtag_bits)|subtag_catch_frame))
491        __(ldr(imm3,tcr.xframe(rcontext)))
492        __(ldr(imm1,tcr.db_link(rcontext)))
493        __(TSP_Alloc_Fixed_Unboxed(catch_frame.size))
494        __(la nargs,tsp_frame.data_offset+fulltag_misc(tsp))
495        __(str(imm4,catch_frame.header(nargs)))
496        __(str(arg_z,catch_frame.catch_tag(nargs)))
497        __(str(imm0,catch_frame.link(nargs)))
498        __(str(imm2,catch_frame.mvflag(nargs)))
499        __(str(sp,catch_frame.csp(nargs)))
500        __(str(imm1,catch_frame.db_link(nargs)))
501        __(str(first_nvr,catch_frame.regs+0*node_size(nargs)))
502        __(str(second_nvr,catch_frame.regs+1*node_size(nargs)))
503        __(str(third_nvr,catch_frame.regs+2*node_size(nargs)))
504        __(str(fourth_nvr,catch_frame.regs+3*node_size(nargs)))
505        __(str(fifth_nvr,catch_frame.regs+4*node_size(nargs)))
506        __(str(sixth_nvr,catch_frame.regs+5*node_size(nargs)))
507        __(str(seventh_nvr,catch_frame.regs+6*node_size(nargs)))
508        __(str(eighth_nvr,catch_frame.regs+7*node_size(nargs)))
509        __(str(imm3,catch_frame.xframe(nargs)))
510        __(str(rzero,catch_frame.tsp_segment(nargs)))
511        __(Set_TSP_Frame_Boxed())
512        __(str(nargs,tcr.catch_top(rcontext)))
513        __(li nargs,0)
514
515])     
516
517define([restore_catch_nvrs],[
518        __(ldr(first_nvr,catch_frame.regs+(node_size*0)($1)))
519        __(ldr(second_nvr,catch_frame.regs+(node_size*1)($1)))
520        __(ldr(third_nvr,catch_frame.regs+(node_size*2)($1)))
521        __(ldr(fourth_nvr,catch_frame.regs+(node_size*3)($1)))
522        __(ldr(fifth_nvr,catch_frame.regs+(node_size*4)($1)))
523        __(ldr(sixth_nvr,catch_frame.regs+(node_size*5)($1)))
524        __(ldr(seventh_nvr,catch_frame.regs+(node_size*6)($1)))
525        __(ldr(eighth_nvr,catch_frame.regs+(node_size*7)($1)))
526])               
527
528define([DCBZL],[
529        __(.long (31<<26)+(1<<21)+($1<<16)+($2<<11)+(1014<<1))
530])
531       
532define([check_stack_alignment],[
533        new_macro_labels()
534        __(andi. $1,sp,STACK_ALIGN_MASK)
535        __(beq+ macro_label(stack_ok))
536        __(.long 0)
537macro_label(stack_ok):
538])
539
540define([stack_align],[((($1)+STACK_ALIGN_MASK)&~STACK_ALIGN_MASK)])
541
542define([clear_alloc_tag],[
543        __(clrrri(allocptr,allocptr,ntagbits))
544])
545
546/* If the GC interrupts the current thread (after the trap), it needs */
547/*   to ensure that the cons cell that's been "reserved" stays reserved */
548/*   (e.g. the tagged allocptr has to be treated as a node.)  If that */
549/*   reserved cons cell gets tenured, the car and cdr are of a generation */
550/*   that's at least as old (so memoization isn't an issue.) */
551
552/*   More generally, if the GC interrupts a thread when allocptr is */
553/*   tagged as a cons: */
554
555/*    a) if the trap hasn't been taken (yet), the GC should force the */
556/*       thread to resume in such a way that the trap will be taken ; */
557/*       the segment allocator should worry about allocating the object. */
558
559/*    b) If the trap has been taken, allocptr is treated as a node as */
560/*       described above.  Allocbase is made to point to the base of the */
561/*       cons cell, so that the thread's next allocation attempt will */
562/*       invoke the segment allocator. */
563       
564define([Cons],[
565        __(la allocptr,(-cons.size+fulltag_cons)(allocptr))
566        __(alloc_trap())
567        __(str($3,cons.cdr(allocptr)))
568        __(str($2,cons.car(allocptr)))
569        __(mr $1,allocptr)
570        __(clear_alloc_tag())
571])
572
573
574/* This is probably only used once or twice in the entire kernel, but */
575/* I wanted a place to describe the constraints on the mechanism. */
576
577/* Those constaints are (not surprisingly) similar to those which apply */
578/* to cons cells, except for the fact that the header (and any length */
579/* field that might describe large arrays) has to have been stored in */
580/* the object if the trap has succeeded on entry to the GC.  It follows */
581/* that storing the register containing the header must immediately */
582/* follow the allocation trap (and an auxiliary length register must */
583/* be stored immediately after the header.)  Successfully falling */
584/* through the trap must emulate any header initialization: it would */
585/* be a bad idea to have allocptr pointing to a zero header ... */
586
587
588
589/* Parameters: */
590
591/* $1 = dest reg */
592/* $2 = header.  (For now, assume that this always encodes length ; */
593/* that may change with "large vector" support.) */
594/* $3 = register containing size in bytes.  (We're going to subtract */
595/* fulltag_misc from this; do it in the macro body, rather than force the
596/* (1 ?) caller to do it. */
597
598
599define([Misc_Alloc],[
600        __(la $3,-fulltag_misc($3))
601        __(sub allocptr,allocptr,$3)
602        __(alloc_trap())
603        __(str($2,misc_header_offset(allocptr)))
604        __(mr $1,allocptr)
605        __(clear_alloc_tag())
606])
607
608/*  Parameters $1, $2 as above; $3 = physical size constant. */
609define([Misc_Alloc_Fixed],[
610        __(la allocptr,(-$3)+fulltag_misc(allocptr))
611        __(alloc_trap())
612        __(str($2,misc_header_offset(allocptr)))
613        __(mr $1,allocptr)
614        __(clear_alloc_tag())
615])
616
617
618/*  Zero $3 bytes worth of doublewords, starting at offset $2 relative */
619/* to the base register $1. */
620
621
622ifdef([DARWIN],[
623        .macro zero_doublewords
624        .if $2
625        stfd fp_zero,$1($0)
626        zero_doublewords $0,$1+8,$2-8
627        .endif
628        .endmacro
629])
630
631ifdef([LINUX],[
632        .macro zero_doublewords base,disp,nbytes
633        .if \nbytes
634        stfd fp_zero,\disp(\base)
635        zero_doublewords \base,\disp+8,\nbytes-8
636        .endif
637        .endm
638])     
639
640define([Set_TSP_Frame_Unboxed],[
641        __(str(tsp,tsp_frame.type(tsp)))
642])
643
644define([Set_TSP_Frame_Boxed],[
645        __(str(rzero,tsp_frame.type(tsp)))
646])
647               
648/* A newly allocated TSP frame is always "raw" (has non-zero type, indicating */
649/* that it doesn't contain tagged data. */
650
651define([TSP_Alloc_Fixed_Unboxed],[
652        __(stru(tsp,-($1+tsp_frame.data_offset)(tsp)))
653        __(Set_TSP_Frame_Unboxed())
654])
655
656define([TSP_Alloc_Fixed_Unboxed_Zeroed],[
657        __(TSP_Alloc_Fixed_Unboxed($1))
658        __(zero_doublewords tsp,tsp_frame.fixed_overhead,$1)
659])
660
661define([TSP_Alloc_Fixed_Boxed],[
662        __(TSP_Alloc_Fixed_Unboxed_Zeroed($1))
663        __(Set_TSP_Frame_Boxed())
664])
665
666
667       
668       
669
670/* This assumes that the backpointer points  to the first byte beyond */
671/* each frame.  If we allow segmented tstacks, that constraint might */
672/* complicate  their implementation. */
673/* We don't need to know the size of the frame (positive or negative, */
674/* with or without header).  $1 and $2 are temp registers, $3 is an */
675/* optional CR field. */
676
677
678/* Handle the general case, where the frame might be empty */
679define([Zero_TSP_Frame],[
680        __(new_macro_labels())
681        __(la $1,tsp_frame.size-8(tsp))
682        __(ldr($2,tsp_frame.backlink(tsp)))
683        __(la $2,-8($2))
684        __(b macro_label(zero_tsp_test))
685macro_label(zero_tsp_loop):
686        __(stfdu fp_zero,8($1))
687macro_label(zero_tsp_test):     
688        __(cmpr(ifelse($3,[],[cr0],$3),$1,$2))
689        __(bne ifelse($3,[],[cr0],$3),macro_label(zero_tsp_loop))
690])
691
692/* Save some branching when we know that the frame can't be empty.*/
693define([Zero_TSP_Frame_nz],[
694        new_macro_labels()
695        __(la $1,tsp_frame.size-8(tsp))
696        __(ldr($2,tsp_frame.backlink(tsp)))
697        __(la $2,-8($2))
698macro_label(zero_tsp_loop):
699        __(stfdu fp_zero,8($1))
700        __(cmpr(ifelse($3,[],[cr0],$3),$1,$2))
701        __(bne ifelse($3,[],[cr0],$3),macro_label(zero_tsp_loop))
702])
703       
704/* $1 = 8-byte-aligned size, positive.  $2 (optiional) set */
705/* to negated size. */
706define([TSP_Alloc_Var_Unboxed],[
707        __(neg ifelse($2,[],$1,$2),$1)
708        __(strux(tsp,tsp,ifelse($2,[],$1,$2)))
709        __(Set_TSP_Frame_Unboxed())
710])
711
712define([TSP_Alloc_Var_Boxed],[
713        __(TSP_Alloc_Var_Unboxed($1))
714        __(Zero_TSP_Frame($1,$2))
715        __(Set_TSP_Frame_Boxed())
716])             
717
718
719define([TSP_Alloc_Var_Boxed_nz],[
720        __(TSP_Alloc_Var_Unboxed($1))
721        __(Zero_TSP_Frame_nz($1,$2))
722        __(Set_TSP_Frame_Boxed())
723])             
724
725define([check_pending_interrupt],[
726        new_macro_labels()
727        __(ldr(nargs,tcr.tlb_pointer(rcontext)))
728        __(ldr(nargs,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
729        __(cmpri(ifelse($1,[],[cr0],$1),nargs,0))
730        __(blt ifelse($1,[],[cr0],$1),macro_label(done))
731        __(bgt ifelse($1,[],[cr0],$1),macro_label(trap))
732        __(ldr(nargs,tcr.interrupt_pending(rcontext)))
733macro_label(trap):
734        __(trgti(nargs,0))
735macro_label(done):
736])
737
738/* $1 = ndigits.  Assumes 4-byte digits */       
739define([aligned_bignum_size],[((~(dnode_size-1)&(node_size+(dnode_size-1)+(4*$1))))])
740
741define([suspend_now],[
742        __(uuo_interr(error_propagate_suspend,rzero))
743])
Note: See TracBrowser for help on using the repository browser.