112027Sjungma@eit.uni-kl.de/* 212027Sjungma@eit.uni-kl.de * QuickThreads -- Threads-building toolkit. 312027Sjungma@eit.uni-kl.de * Copyright (c) 1993 by David Keppel 412027Sjungma@eit.uni-kl.de * 512027Sjungma@eit.uni-kl.de * Permission to use, copy, modify and distribute this software and 612027Sjungma@eit.uni-kl.de * its documentation for any purpose and without fee is hereby 712027Sjungma@eit.uni-kl.de * granted, provided that the above copyright notice and this notice 812027Sjungma@eit.uni-kl.de * appear in all copies. This software is provided as a 912027Sjungma@eit.uni-kl.de * proof-of-concept and for demonstration purposes; there is no 1012027Sjungma@eit.uni-kl.de * representation about the suitability of this software for any 1112027Sjungma@eit.uni-kl.de * purpose. 1212027Sjungma@eit.uni-kl.de */ 1312027Sjungma@eit.uni-kl.de 1412027Sjungma@eit.uni-kl.de/* axp.s -- assembly support. */ 1512027Sjungma@eit.uni-kl.de 1612027Sjungma@eit.uni-kl.de .text 1712027Sjungma@eit.uni-kl.de .align 4 1812027Sjungma@eit.uni-kl.de .file 2 "axp.s" 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de .globl qt_block 2112027Sjungma@eit.uni-kl.de .globl qt_blocki 2212027Sjungma@eit.uni-kl.de .globl qt_abort 2312027Sjungma@eit.uni-kl.de .globl qt_start 2412027Sjungma@eit.uni-kl.de .globl qt_vstart 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de /* 2712027Sjungma@eit.uni-kl.de ** $16: ptr to function to call once curr is suspended 2812027Sjungma@eit.uni-kl.de ** and control is on r19's stack. 2912027Sjungma@eit.uni-kl.de ** $17: 1'th arg to (*$16)(...). 3012027Sjungma@eit.uni-kl.de ** $18: 2'th arg to (*$16)(...). 3112027Sjungma@eit.uni-kl.de ** $19: sp of thread to resume. 3212027Sjungma@eit.uni-kl.de ** 3312027Sjungma@eit.uni-kl.de ** The helper routine returns a value that is passed on as the 3412027Sjungma@eit.uni-kl.de ** return value from the blocking routine. Since we don't 3512027Sjungma@eit.uni-kl.de ** touch r0 between the helper's return and the end of 3612027Sjungma@eit.uni-kl.de ** function, we get this behavior for free. 3712027Sjungma@eit.uni-kl.de */ 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de .ent qt_blocki 4012027Sjungma@eit.uni-kl.deqt_blocki: 4112027Sjungma@eit.uni-kl.de subq $30,80, $30 /* Allocate save area. */ 4212027Sjungma@eit.uni-kl.de stq $26, 0($30) /* Save registers. */ 4312027Sjungma@eit.uni-kl.de stq $9, 8($30) 4412027Sjungma@eit.uni-kl.de stq $10,16($30) 4512027Sjungma@eit.uni-kl.de stq $11,24($30) 4612027Sjungma@eit.uni-kl.de stq $12,32($30) 4712027Sjungma@eit.uni-kl.de stq $13,40($30) 4812027Sjungma@eit.uni-kl.de stq $14,48($30) 4912027Sjungma@eit.uni-kl.de stq $15,56($30) 5012027Sjungma@eit.uni-kl.de stq $29,64($30) 5112027Sjungma@eit.uni-kl.de .end qt_blocki 5212027Sjungma@eit.uni-kl.de .ent qt_abort 5312027Sjungma@eit.uni-kl.deqt_abort: 5412027Sjungma@eit.uni-kl.de addq $16,$31, $27 /* Put argument function in PV. */ 5512027Sjungma@eit.uni-kl.de addq $30,$31, $16 /* Save stack ptr in outgoing arg. */ 5612027Sjungma@eit.uni-kl.de addq $19,$31, $30 /* Set new stack pointer. */ 5712027Sjungma@eit.uni-kl.de jsr $26,($27),0 /* Call helper function. */ 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.de ldq $26, 0($30) /* Restore registers. */ 6012027Sjungma@eit.uni-kl.de ldq $9, 8($30) 6112027Sjungma@eit.uni-kl.de ldq $10,16($30) 6212027Sjungma@eit.uni-kl.de ldq $11,24($30) 6312027Sjungma@eit.uni-kl.de ldq $12,32($30) 6412027Sjungma@eit.uni-kl.de ldq $13,40($30) 6512027Sjungma@eit.uni-kl.de ldq $14,48($30) 6612027Sjungma@eit.uni-kl.de ldq $15,56($30) 6712027Sjungma@eit.uni-kl.de ldq $29,64($30) 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de addq $30,80, $30 /* Deallocate save area. */ 7012027Sjungma@eit.uni-kl.de ret $31,($26),1 /* Return, predict===RET. */ 7112027Sjungma@eit.uni-kl.de .end qt_abort 7212027Sjungma@eit.uni-kl.de 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.de /* 7512027Sjungma@eit.uni-kl.de ** Non-varargs thread startup. 7612027Sjungma@eit.uni-kl.de */ 7712027Sjungma@eit.uni-kl.de .ent qt_start 7812027Sjungma@eit.uni-kl.deqt_start: 7912027Sjungma@eit.uni-kl.de addq $9,$31, $16 /* Load up `qu'. */ 8012027Sjungma@eit.uni-kl.de addq $10,$31, $17 /* ... user function's `pt'. */ 8112027Sjungma@eit.uni-kl.de addq $11,$31, $18 /* ... user function's `userf'. */ 8212027Sjungma@eit.uni-kl.de addq $12,$31, $27 /* ... set procedure value to `only'. */ 8312027Sjungma@eit.uni-kl.de jsr $26,($27),0 /* Call `only'. */ 8412027Sjungma@eit.uni-kl.de 8512027Sjungma@eit.uni-kl.de jsr $26,qt_error /* `only' erroniously returned. */ 8612027Sjungma@eit.uni-kl.de .end qt_start 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.de 8912027Sjungma@eit.uni-kl.de .ent qt_vstart: 9012027Sjungma@eit.uni-kl.deqt_vstart: 9112027Sjungma@eit.uni-kl.de /* Call startup function. */ 9212027Sjungma@eit.uni-kl.de addq $9,$31, $16 /* Arg0 to `startup'. */ 9312027Sjungma@eit.uni-kl.de addq $12,$31, $27 /* Set procedure value. */ 9412027Sjungma@eit.uni-kl.de jsr $26,($27),0 /* Call `startup'. */ 9512027Sjungma@eit.uni-kl.de 9612027Sjungma@eit.uni-kl.de /* Call user function. */ 9712027Sjungma@eit.uni-kl.de ldt $f16, 0($30) /* Load fp arg regs. */ 9812027Sjungma@eit.uni-kl.de ldt $f17, 8($30) 9912027Sjungma@eit.uni-kl.de ldt $f18,16($30) 10012027Sjungma@eit.uni-kl.de ldt $f19,24($30) 10112027Sjungma@eit.uni-kl.de ldt $f20,32($30) 10212027Sjungma@eit.uni-kl.de ldt $f21,40($30) 10312027Sjungma@eit.uni-kl.de ldq $16,48($30) /* And integer arg regs. */ 10412027Sjungma@eit.uni-kl.de ldq $17,56($30) 10512027Sjungma@eit.uni-kl.de ldq $18,64($30) 10612027Sjungma@eit.uni-kl.de ldq $19,72($30) 10712027Sjungma@eit.uni-kl.de ldq $20,80($30) 10812027Sjungma@eit.uni-kl.de ldq $21,88($30) 10912027Sjungma@eit.uni-kl.de addq $30,96 $30 /* Pop 6*2*8 saved arg regs. */ 11012027Sjungma@eit.uni-kl.de addq $11,$31, $27 /* Set procedure value. */ 11112027Sjungma@eit.uni-kl.de jsr $26,($27),0 /* Call `vuserf'. */ 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de /* Call cleanup. */ 11412027Sjungma@eit.uni-kl.de addq $9,$31, $16 /* Arg0 to `cleanup'. */ 11512027Sjungma@eit.uni-kl.de addq $0,$31, $17 /* Users's return value is arg1. */ 11612027Sjungma@eit.uni-kl.de addq $10,$31, $27 /* Set procedure value. */ 11712027Sjungma@eit.uni-kl.de jsr $26,($27),0 /* Call `cleanup'. */ 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.de jsr $26,qt_error /* Cleanup erroniously returned. */ 12012027Sjungma@eit.uni-kl.de .end qt_start 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de /* 12412027Sjungma@eit.uni-kl.de ** Save calle-save floating-point regs $f2..$f9. 12512027Sjungma@eit.uni-kl.de ** Also save return pc from whomever called us. 12612027Sjungma@eit.uni-kl.de ** 12712027Sjungma@eit.uni-kl.de ** Return value from `qt_block' is the same as the return from 12812027Sjungma@eit.uni-kl.de ** `qt_blocki'. We get that for free since we don't touch $0 12912027Sjungma@eit.uni-kl.de ** between the return from `qt_blocki' and the return from 13012027Sjungma@eit.uni-kl.de ** `qt_block'. 13112027Sjungma@eit.uni-kl.de */ 13212027Sjungma@eit.uni-kl.de .ent qt_block 13312027Sjungma@eit.uni-kl.deqt_block: 13412027Sjungma@eit.uni-kl.de subq $30,80, $30 /* Allocate a save space. */ 13512027Sjungma@eit.uni-kl.de stq $26, 0($30) /* Save registers. */ 13612027Sjungma@eit.uni-kl.de stt $f2, 8($30) 13712027Sjungma@eit.uni-kl.de stt $f3,16($30) 13812027Sjungma@eit.uni-kl.de stt $f4,24($30) 13912027Sjungma@eit.uni-kl.de stt $f5,32($30) 14012027Sjungma@eit.uni-kl.de stt $f6,40($30) 14112027Sjungma@eit.uni-kl.de stt $f7,48($30) 14212027Sjungma@eit.uni-kl.de stt $f8,56($30) 14312027Sjungma@eit.uni-kl.de stt $f9,64($30) 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.de jsr $26,qt_blocki /* Call helper. */ 14612027Sjungma@eit.uni-kl.de /* .. who will also restore $gp. */ 14712027Sjungma@eit.uni-kl.de 14812027Sjungma@eit.uni-kl.de ldq $26, 0($30) /* restore registers. */ 14912027Sjungma@eit.uni-kl.de ldt $f2, 8($30) 15012027Sjungma@eit.uni-kl.de ldt $f3,16($30) 15112027Sjungma@eit.uni-kl.de ldt $f4,24($30) 15212027Sjungma@eit.uni-kl.de ldt $f5,32($30) 15312027Sjungma@eit.uni-kl.de ldt $f6,40($30) 15412027Sjungma@eit.uni-kl.de ldt $f7,48($30) 15512027Sjungma@eit.uni-kl.de ldt $f8,56($30) 15612027Sjungma@eit.uni-kl.de ldt $f9,64($30) 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.de addq $30,80, $30 /* Deallcate save space. */ 15912027Sjungma@eit.uni-kl.de ret $31,($26),1 /* Return, predict===RET. */ 16012027Sjungma@eit.uni-kl.de .end qt_block 161