1 /****************************** asmpart.c **************************************
3 * is an assembly language file, but called .c to fake the preprocessor. *
4 * It contains the Java-C interface functions for Alpha processors. *
6 * Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst *
8 * See file COPYRIGHT for information on usage and disclaimer of warranties *
10 * Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at *
11 * Andreas Krall EMAIL: cacao@complang.tuwien.ac.at *
13 * Last Change: 1997/04/26 *
15 *******************************************************************************/
86 /********************* exported functions and variables ***********************/
88 .globl has_no_x_instr_set
89 .globl synchronize_caches
90 .globl asm_calljavamethod
91 .globl asm_call_jit_compiler
92 .globl asm_dumpregistersandcall
93 .globl asm_handle_exception
94 .globl asm_handle_nat_exception
95 .globl asm_signal_exception
96 .globl new_builtin_checkcast
97 .globl new_builtin_checkarraycast
98 .globl new_builtin_aastore
99 .globl new_builtin_monitorenter
100 .globl new_builtin_monitorexit
101 .globl new_builtin_idiv
102 .globl new_builtin_irem
103 .globl new_builtin_ldiv
104 .globl new_builtin_lrem
105 .globl perform_alpha_threadswitch
106 .globl initialize_thread_stack
107 .globl used_stack_top
110 /*************************** imported variables *******************************/
115 /*************************** imported functions *******************************/
117 .globl compiler_compile
118 .globl builtin_monitorexit
119 .globl builtin_throw_exception
120 .globl builtin_trace_exception
121 .globl class_java_lang_Object
123 /*********************** function has_no_x_instr_set ***************************
125 * determines if the byte support instruction set (21164a and higher) *
128 *******************************************************************************/
130 .ent has_no_x_instr_set
133 .long 0x47e03c20 # amask 1,$0
134 jmp zero,(ra) # return
136 .end has_no_x_instr_set
139 /********************* function synchronize_caches ****************************/
141 .ent synchronize_caches
144 call_pal PAL_imb # synchronise instruction cache
145 jmp zero,(ra) # return
147 .end synchronize_caches
150 /********************* function asm_calljavamethod *****************************
152 * This function calls a Java-method (which possibly needs compilation) *
153 * with up to 4 parameters. *
155 * This functions calls the JIT-compiler which eventually translates the *
156 * method into machine code. *
158 * An possibly throwed exception will be returned to the caller as function *
159 * return value, so the java method cannot return a fucntion value (this *
160 * function usually calls 'main' and '<clinit>' which do not return a *
164 * javaobject_header *asm_calljavamethod (methodinfo *m, *
165 * void *arg1, void *arg2, void *arg3, void *arg4); *
167 *******************************************************************************/
169 #define MethodPointer -8
170 #define FrameSize -12
175 #define ExTableSize -32
176 #define ExTableStart -32
178 #define ExEntrySize -32
181 #define ExHandlerPC -24
182 #define ExCatchType -32
184 .ent asm_calljavamethod
187 .ascii "calljavamethod\0\0"
190 .quad 0 # catch type all
191 .quad calljava_xhandler # end pc
192 .quad calljava_xhandler # end pc
193 .quad asm_calljavamethod # start pc
194 .long 1 # extable size
199 .long 32 # frame size
200 .quad 0 # method pointer (pointer to name) @@@@@
205 lda sp,-32(sp) # allocate stack space
206 stq gp,24(sp) # save global pointer
207 stq ra,0(sp) # save return address
209 stq $16,16(sp) # save method pointer for compiler
210 lda $0,16(sp) # pass pointer to method pointer via $0
212 bis $17,$17,$16 # pass the remaining parameters
217 lda $28,asm_call_jit_compiler # fake virtual function call
218 stq $28,8(sp) # store function address
219 bis sp,sp,$28 # set method pointer
221 ldq pv,8($28) # method call as in Java
222 jmp ra,(pv) # call JIT compiler
224 lda pv,-64(ra) # asm_calljavamethod-calljava_jit(ra) !!!!!!
228 ldq ra,0(sp) # restore return address
229 ldq gp,24(sp) # restore global pointer
230 lda sp,32(sp) # free stack space
231 ldl $0,newcompiler # load newcompiler flag
232 subq $0,1,$0 # negate for clearing $0
233 beq $0,calljava_ret # if newcompiler skip ex copying
234 bis $1,$1,$0 # pass exception to caller (C)
240 ldq gp,24(sp) # restore global pointer
242 jsr ra,builtin_throw_exception
243 ldq ra,0(sp) # restore return address
244 lda sp,32(sp) # free stack space
246 .end asm_calljavamethod
249 /****************** function asm_call_jit_compiler *****************************
251 * invokes the compiler for untranslated JavaVM methods. *
253 * Register R0 contains a pointer to the method info structure (prepared *
254 * by createcompilerstub). Using the return address in R26 and the *
255 * offset in the LDA instruction or using the value in methodptr R28 the *
256 * patching address for storing the method address can be computed: *
258 * method address was either loaded using *
259 * M_LDQ (REG_PV, REG_PV, a) # invokestatic/special ($27) *
260 * M_LDA (REG_PV, REG_RA, low) *
261 * M_LDAH(REG_PV, REG_RA, high) # optional *
263 * M_LDQ (REG_PV, REG_METHODPTR, m) # invokevirtual/interface ($28) *
264 * in the static case the method pointer can be computed using the *
265 * return address and the lda function following the jmp instruction *
267 *******************************************************************************/
270 .ent asm_call_jit_compiler
271 asm_call_jit_compiler:
274 ldl $22,-8(ra) # load instruction LDQ PV,xxx($yy)
275 srl $22,16,$22 # shift right register number $yy
276 and $22,31,$22 # isolate register number
277 subl $22,28,$22 # test for REG_METHODPTR
279 ldl $22,0(ra) # load instruction LDA PV,xxx(RA)
281 sra $22,48,$22 # isolate offset
282 addq $22,ra,$28 # compute update address
283 ldl $22,4(ra) # load instruction LDAH PV,xxx(PV)
284 srl $22,16,$22 # isolate instruction code
285 lda $22,-0x177b($22) # test for LDAH
287 ldl $22,0(ra) # load instruction LDA PV,xxx(RA)
288 sll $22,16,$22 # compute high offset
289 addl $22,0,$22 # sign extend high offset
290 addq $22,$28,$28 # compute update address
292 lda sp,-14*8(sp) # reserve stack space
293 stq $16,0*8(sp) # save all argument registers
294 stq $17,1*8(sp) # they could be used by method
305 stq $28,12*8(sp) # save method pointer
306 stq ra,13*8(sp) # save return address
308 ldq $16,0($0) # pass 'methodinfo' pointer to
309 jsr ra,compiler_compile # compiler
312 call_pal PAL_imb # synchronise instruction cache
314 ldq $16,0*8(sp) # load argument registers
326 ldq $28,12*8(sp) # load method pointer
327 ldq ra,13*8(sp) # load return address
328 lda sp,14*8(sp) # deallocate stack area
330 ldl $22,-8(ra) # load instruction LDQ PV,xxx($yy)
332 sra $22,48,$22 # isolate offset
334 addq $22,$28,$22 # compute update address via method pointer
335 stq $0,0($22) # save new method address there
337 bis $0,$0,pv # load method address into pv
339 jmp zero, (pv) # and call method. The method returns
340 # directly to the caller (ra).
342 .end asm_call_jit_compiler
345 /****************** function asm_dumpregistersandcall **************************
347 * This funtion saves all callee saved registers and calls the function *
348 * which is passed as parameter. *
350 * This function is needed by the garbage collector, which needs to access *
351 * all registers which are stored on the stack. Unused registers are *
352 * cleared to avoid interferances with the GC. *
354 * void asm_dumpregistersandcall (functionptr f); *
356 *******************************************************************************/
358 .ent asm_dumpregistersandcall
359 asm_dumpregistersandcall:
360 lda sp,-16*8(sp) # allocate stack
361 stq ra,0(sp) # save return address
363 stq $9,1*8(sp) # save all callee saved registers
364 stq $10,2*8(sp) # intialize the remaining registers
379 bis zero,zero,$0 # intialize the remaining registers
425 bis $16,$16,pv # load function pointer
426 jmp ra,(pv) # and call function
428 ldq ra,0(sp) # load return address
429 lda sp,16*8(sp) # deallocate stack
430 jmp zero,(ra) # return
432 .end asm_dumpregistersandcall
435 /********************* function asm_handle_exception ***************************
437 * This function handles an exception. It does not use the usual calling *
438 * conventions. The exception pointer is passed in REG_ITMP1 and the *
439 * pc from the exception raising position is passed in REG_ITMP2. It searches *
440 * the local exception table for a handler. If no one is found, it unwinds *
441 * stacks and continues searching the callers. *
443 * void asm_handle_exception (exceptionptr, exceptionpc); *
445 *******************************************************************************/
447 .ent asm_handle_nat_exception
448 asm_handle_nat_exception:
450 ldl t0,0(ra) # load instruction LDA PV,xxx(RA)
452 sra t0,48,t0 # isolate offset
453 addq t0,ra,pv # compute update address
454 ldl t0,4(ra) # load instruction LDAH PV,xxx(PV)
455 srl t0,16,t0 # isolate instruction code
456 lda t0,-0x177b(t0) # test for LDAH
457 bne t0,asm_handle_exception
458 ldl t0,0(ra) # load instruction LDA PV,xxx(RA)
459 sll t0,16,t0 # compute high offset
460 addl t0,0,t0 # sign extend high offset
461 addq t0,pv,pv # compute update address
463 .aent asm_handle_exception
464 asm_handle_exception:
466 lda sp,-18*8(sp) # allocate stack
467 stq t0,0*8(sp) # save possible used registers
468 stq t1,1*8(sp) # also registers used by builtin_checkcast
486 lda t3,1(zero) # set no unwind flag
488 lda sp,-5*8(sp) # allocate stack
489 stq xptr,0*8(sp) # save used register
496 ldq a1,MethodPointer(pv)
499 br ra,ex_trace # set ra for gp loading
501 ldgp gp,0(ra) # load gp
502 jsr ra,builtin_trace_exception # builtin_trace_exception(xptr,methodptr)
504 ldq xptr,0*8(sp) # restore used register
509 lda sp,5*8(sp) # deallocate stack
511 ldl t0,ExTableSize(pv) # t0 = exception table size
512 beq t0,empty_table # if empty table skip
513 lda t1,ExTableStart(pv) # t1 = start of exception table
516 ldq t2,ExStartPC(t1) # t2 = exception start pc
517 cmple t2,xpc,t2 # t2 = (startpc <= xpc)
518 beq t2,ex_table_cont # if (false) continue
519 ldq t2,ExEndPC(t1) # t2 = exception end pc
520 cmplt xpc,t2,t2 # t2 = (xpc < endpc)
521 beq t2,ex_table_cont # if (false) continue
522 ldq a1,ExCatchType(t1) # arg1 = exception catch type
523 beq a1,ex_handle_it # NULL catches everything
524 mov xptr,a0 # arg0 = exception pointer
526 lda sp,-7*8(sp) # allocate stack
527 stq t0,0*8(sp) # save used register
535 br ra,ex_gpload # set ra for gp loading
537 ldgp gp,0(ra) # load gp
538 jsr ra,builtin_checkcast # builtin_checkcast(xptr,catchtype)
540 ldq t0,0*8(sp) # restore used register
547 lda sp,7*8(sp) # deallocate stack
549 beq v0,ex_table_cont # if (false) continue
553 ldq xpc,ExHandlerPC(t1) # xpc = exception handler pc
555 beq t3,ex_jump # if (!(no stack unwinding) skip
557 ldq t0,0*8(sp) # restore possible used registers
558 ldq t1,1*8(sp) # also registers used by builtin_checkcast
575 lda sp,18*8(sp) # deallocate stack
578 jmp zero,(xpc) # jump to the handler
581 lda t1,ExEntrySize(t1) # next exception table entry
582 subl t0,1,t0 # decrement entry counter
583 bgt t0,ex_table_loop # if (t0 > 0) next entry
586 beq t3,ex_already_cleared # if here the first time, then
587 lda sp,18*8(sp) # deallocate stack and
588 clr t3 # clear the no unwind flag
590 ldl t0,IsSync(pv) # t0 = SyncOffset
591 beq t0,no_monitor_exit # if zero no monitorexit
592 addq sp,t0,t0 # add Offset to stackptr
593 ldq a0,-8(t0) # load monitorexit pointer
595 lda sp,-7*8(sp) # allocate stack
596 stq t0,0*8(sp) # save used register
604 br ra,ex_mon_load # set ra for gp loading
606 ldgp gp,0(ra) # load gp
607 jsr ra,builtin_monitorexit # builtin_monitorexit(objectptr)
609 ldq t0,0*8(sp) # restore used register
616 lda sp,7*8(sp) # deallocate stack
619 ldl t0,FrameSize(pv) # t0 = frame size
620 addq sp,t0,sp # unwind stack
621 mov sp,t0 # t0 = pointer to save area
622 ldl t1,IsLeaf(pv) # t1 = is leaf procedure
623 bne t1,ex_no_restore # if (leaf) skip
624 ldq ra,-8(t0) # restore ra
627 mov ra,xpc # the new xpc is ra
628 ldl t1,IntSave(pv) # t1 = saved int register count
629 br t2,ex_int1 # t2 = current pc
631 lda t2,44(t2) # lda t2,ex_int2-ex_int1(t2) !!!!!!!!!!!!!!!
632 negl t1,t1 # negate register count
633 s4addq t1,t2,t2 # t2 = ex_int_sav - 4 * register count
634 jmp zero,(t2) # jump to save position
643 s8addq t1,t0,t0 # t0 = t0 - 8 * register count
645 ldl t1,FltSave(pv) # t1 = saved flt register count
646 br t2,ex_flt1 # t2 = current pc
648 lda t2,48(t2) # lda t2,ex_flt2-ex_flt1(t2) !!!!!!!!!!!!!!!
649 negl t1,t1 # negate register count
650 s4addq t1,t2,t2 # t2 = ex_flt_sav - 4 * register count
651 jmp zero,(t2) # jump to save position
661 ldl t0,0(ra) # load instruction LDA PV,xxx(RA)
663 sra t0,48,t0 # isolate offset
664 addq t0,ra,pv # compute update address
665 ldl t0,4(ra) # load instruction LDAH PV,xxx(PV)
666 srl t0,16,t0 # isolate instruction code
667 lda t0,-0x177b(t0) # test for LDAH
669 ldl t0,0(ra) # load instruction LDA PV,xxx(RA)
670 sll t0,16,t0 # compute high offset
671 addl t0,0,t0 # sign extend high offset
672 addq t0,pv,pv # compute update address
675 .end asm_handle_exception
678 /********************* function asm_signal_exception ***************************
680 * This function handles an exception which was catched by a signal. *
682 * void asm_signal_exception (exceptionptr, signalcontext); *
684 *******************************************************************************/
686 #define sigctxstack 0*8 /* sigstack state to restore */
687 #define sigctxmask 1*8 /* signal mask to restore */
688 #define sigctxpc 2*8 /* pc at time of signal */
689 #define sigctxpsl 3*8 /* psl to retore */
690 #define sigctxr00 4*8 /* processor regs 0 to 31 */
691 #define sigctxr01 5*8
692 #define sigctxr02 6*8
693 #define sigctxr03 7*8
694 #define sigctxr04 8*8
695 #define sigctxr05 9*8
696 #define sigctxr06 10*8
697 #define sigctxr07 11*8
698 #define sigctxr08 12*8
699 #define sigctxr09 13*8
700 #define sigctxr10 14*8
701 #define sigctxr11 15*8
702 #define sigctxr12 16*8
703 #define sigctxr13 17*8
704 #define sigctxr14 18*8
705 #define sigctxr15 19*8
706 #define sigctxr16 20*8
707 #define sigctxr17 21*8
708 #define sigctxr18 22*8
709 #define sigctxr19 23*8
710 #define sigctxr20 24*8
711 #define sigctxr21 25*8
712 #define sigctxr22 26*8
713 #define sigctxr23 27*8
714 #define sigctxr24 28*8
715 #define sigctxr25 29*8
716 #define sigctxr26 30*8
717 #define sigctxr27 31*8
718 #define sigctxr28 32*8
719 #define sigctxr29 33*8
720 #define sigctxr30 34*8
721 #define sigctxr31 35*8
723 #define sigctxfpuse 36*8 /* fp has been used */
724 #define sigctxf00 37*8 /* fp regs 0 to 31 */
725 #define sigctxf01 38*8
726 #define sigctxf02 39*8
727 #define sigctxf03 40*8
728 #define sigctxf04 41*8
729 #define sigctxf05 42*8
730 #define sigctxf06 43*8
731 #define sigctxf07 44*8
732 #define sigctxf08 45*8
733 #define sigctxf09 46*8
734 #define sigctxf10 47*8
735 #define sigctxf11 48*8
736 #define sigctxf12 49*8
737 #define sigctxf13 50*8
738 #define sigctxf14 51*8
739 #define sigctxf15 52*8
740 #define sigctxf16 53*8
741 #define sigctxf17 54*8
742 #define sigctxf18 55*8
743 #define sigctxf19 56*8
744 #define sigctxf20 57*8
745 #define sigctxf21 58*8
746 #define sigctxf22 59*8
747 #define sigctxf23 60*8
748 #define sigctxf24 61*8
749 #define sigctxf25 62*8
750 #define sigctxf26 63*8
751 #define sigctxf27 64*8
752 #define sigctxf28 65*8
753 #define sigctxf29 66*8
754 #define sigctxf30 67*8
755 #define sigctxf31 68*8
757 #define sigctxhfpcr 69*8 /* floating point control register */
758 #define sigctxsfpcr 70*8 /* software fpcr */
760 .ent asm_signal_exception
761 asm_signal_exception:
766 ldq v0,sigctxr00(sp) # restore possible used registers
790 ldq t10,sigctxr24(sp)
794 br asm_handle_nat_exception
795 .end asm_signal_exception
798 /********************* function new_builtin_monitorenter ***********************
800 * Does null check and calls monitorenter or throws an exception *
802 *******************************************************************************/
804 .ent new_builtin_monitorenter
805 new_builtin_monitorenter:
808 lda pv,builtin_monitorenter
809 beq a0,nb_monitorenter # if (null) throw exception
810 jmp zero,(pv) # else call builtin_monitorenter
813 ldq xptr,proto_java_lang_NullPointerException
814 lda xpc,-4(ra) # faulting address is return adress - 4
815 br asm_handle_nat_exception
816 .end new_builtin_monitorenter
819 /********************* function new_builtin_monitorexit ************************
821 * Does null check and calls monitorexit or throws an exception *
823 *******************************************************************************/
825 .ent new_builtin_monitorexit
826 new_builtin_monitorexit:
829 lda pv,builtin_monitorexit
830 beq a0,nb_monitorexit # if (null) throw exception
831 jmp zero,(pv) # else call builtin_monitorexit
834 ldq xptr,proto_java_lang_NullPointerException
835 lda xpc,-4(ra) # faulting address is return adress - 4
836 br asm_handle_nat_exception
837 .end new_builtin_monitorenter
840 /************************ function new_builtin_idiv ****************************
842 * Does null check and calls idiv or throws an exception *
844 *******************************************************************************/
846 .ent new_builtin_idiv
851 beq a1,nb_idiv # if (null) throw exception
852 jmp zero,(pv) # else call builtin_idiv
855 ldq xptr,proto_java_lang_ArithmeticException
856 lda xpc,-4(ra) # faulting address is return adress - 4
857 br asm_handle_nat_exception
858 .end new_builtin_idiv
861 /************************ function new_builtin_ldiv ****************************
863 * Does null check and calls ldiv or throws an exception *
865 *******************************************************************************/
867 .ent new_builtin_ldiv
872 beq a1,nb_ldiv # if (null) throw exception
873 jmp zero,(pv) # else call builtin_ldiv
876 ldq xptr,proto_java_lang_ArithmeticException
877 lda xpc,-4(ra) # faulting address is return adress - 4
878 br asm_handle_nat_exception
879 .end new_builtin_ldiv
882 /************************ function new_builtin_irem ****************************
884 * Does null check and calls irem or throws an exception *
886 *******************************************************************************/
888 .ent new_builtin_irem
893 beq a1,nb_irem # if (null) throw exception
894 jmp zero,(pv) # else call builtin_irem
897 ldq xptr,proto_java_lang_ArithmeticException
898 lda xpc,-4(ra) # faulting address is return adress - 4
899 br asm_handle_nat_exception
900 .end new_builtin_irem
903 /************************ function new_builtin_lrem ****************************
905 * Does null check and calls lrem or throws an exception *
907 *******************************************************************************/
909 .ent new_builtin_lrem
914 beq a1,nb_lrem # if (null) throw exception
915 jmp zero,(pv) # else call builtin_lrem
918 ldq xptr,proto_java_lang_ArithmeticException
919 lda xpc,-4(ra) # faulting address is return adress - 4
920 br asm_handle_nat_exception
921 .end new_builtin_lrem
924 /*********************** function new_builtin_checkcast ************************
926 * Does the cast check and eventually throws an exception *
928 *******************************************************************************/
930 .ent new_builtin_checkcast
931 new_builtin_checkcast:
934 lda sp,-16(sp) # allocate stack space
935 stq ra,0(sp) # save return address
936 stq a0,8(sp) # save object pointer
937 jsr ra,builtin_checkcast # builtin_checkcast
939 beq v0,nb_ccast_throw # if (false) throw exception
940 ldq ra,0(sp) # restore return address
941 ldq v0,8(sp) # return object pointer
942 lda sp,16(sp) # free stack space
946 ldq xptr,proto_java_lang_ClassCastException
947 ldq ra,0(sp) # restore return address
948 lda sp,16(sp) # free stack space
949 lda xpc,-4(ra) # faulting address is return adress - 4
950 br asm_handle_nat_exception
951 .end new_builtin_checkcast
954 /******************* function new_builtin_checkarraycast ***********************
956 * Does the cast check and eventually throws an exception *
958 *******************************************************************************/
960 .ent new_builtin_checkarraycast
961 new_builtin_checkarraycast:
964 lda sp,-16(sp) # allocate stack space
965 stq ra,0(sp) # save return address
966 stq a0,8(sp) # save object pointer
967 jsr ra,builtin_checkarraycast # builtin_checkarraycast
969 beq v0,nb_carray_throw # if (false) throw exception
970 ldq ra,0(sp) # restore return address
971 ldq v0,8(sp) # return object pointer
972 lda sp,16(sp) # free stack space
976 ldq xptr,proto_java_lang_ClassCastException
977 ldq ra,0(sp) # restore return address
978 lda sp,16(sp) # free stack space
979 lda xpc,-4(ra) # faulting address is return adress - 4
980 br asm_handle_nat_exception
981 .end new_builtin_checkarraycast
984 /******************* function new_builtin_aastore ******************************
986 * Does the cast check and eventually throws an exception *
988 *******************************************************************************/
990 .ent new_builtin_aastore
994 beq a0,nb_aastore_null # if null pointer throw exception
995 ldl t0,offarrsize(a0) # load size
996 lda sp,-24(sp) # allocate stack space
997 stq ra,0(sp) # save return address
998 s8addq a1,a0,t1 # add index*8 to arrayref
999 cmpult a1,t0,t0 # do bound check
1000 beq t0,nb_aastore_bound # if out of bounds throw exception
1001 mov a2,a1 # object is second argument
1002 stq t1,8(sp) # save store position
1003 stq a1,16(sp) # save object
1004 jsr ra,builtin_canstore # builtin_canstore(arrayref,object)
1006 ldq ra,0(sp) # restore return address
1007 ldq a0,8(sp) # restore store position
1008 ldq a1,16(sp) # restore object
1009 lda sp,24(sp) # free stack space
1010 beq v0,nb_aastore_throw # if (false) throw exception
1011 stq a1,offobjarr(a0) # store objectptr in array
1015 ldq xptr,proto_java_lang_NullPointerException
1016 mov ra,xpc # faulting address is return adress
1017 br asm_handle_nat_exception
1020 ldq xptr,proto_java_lang_ArrayIndexOutOfBoundsException
1021 lda sp,24(sp) # free stack space
1022 mov ra,xpc # faulting address is return adress
1023 br asm_handle_nat_exception
1026 ldq xptr,proto_java_lang_ArrayStoreException
1027 mov ra,xpc # faulting address is return adress
1028 br asm_handle_nat_exception
1030 .end new_builtin_aastore
1033 /********************** function initialize_thread_stack ***********************
1035 * initialized a thread stack *
1037 *******************************************************************************/
1039 .ent initialize_thread_stack
1040 initialize_thread_stack:
1061 .end initialize_thread_stack
1064 /******************* function perform_alpha_threadswitch ***********************
1066 * performs a threadswitch *
1068 *******************************************************************************/
1070 .ent perform_alpha_threadswitch
1071 perform_alpha_threadswitch:
1111 .end perform_alpha_threadswitch
1114 /*********************** function used_stack_top *******************************
1118 *******************************************************************************/