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