##
## ppc.library emulation
## (c)1998-99 Frank Wille <frank@phoenix.owl.de>
##
## Not implemented PowerUp kernel emulation functions
##
## V0.6a (14.04.1999) phx
##       PPCSignal() expects a PowerUp TaskObject-pointer and not a WarpOS
##       TaskPPC-pointer.
## V0.6  (11.04.1999) phx
##       KERNEL_DEBUG allows debugging of asmkernel-functions.
## V0.4b (05.01.1999) phx
##       Fixed Add64,Add64p,Sub64,Sub64p (they are still incorrect
##       in original ppc.libraray!)
##       Improved Cmp64,Cmp64p.
##       Function names use Amiga68k/WarpOS C notation (leading '_').
##       Signal support: PPCAllocSignal,PPCFreeSignal,PPCSetSignal,
##        PPCSignal,PPCWait (PPCSignal might not work, because of
##        different Task definitions).
##       Misc: PPCVersion,PPCRevision.
##       TagItem support: PPCFindTagItem,PPCGetTagData,
##        PPCNextTagItem(rewritten, calls WarpOS)
## V0.4a (19.12.1998) phx
##       Fixed PowerUp kernel functions:
##        PPCNeg64,Neg64p,Sub64,Sub64p,Mulu64,Mulu64p,Muls64,Muls64p.
## V0.4  (26.11.1998) phx
##       CALLWOS moved to warpos_lvo.i.
##       Included additional 64-bit and gcc-support functions of V46.19:
##        PPCAnd64,Asl64,Lsl64,Asr64,Lsr64,Or64,Xor64,DivRem64,
##        __adddi3,__anddi3,__ashldi3,__ashrdi3,__cmpdi2,__divdi3,__fixdfdi,
##        __fixsfdi,__fixunsdfdi,__fixunssfdi,__floatdidf,__floatdisf,
##        __floatunsdidf,__iordi3,__lmulq,__lshldi3,__lshrdi3,__moddi3,
##        __muldi3,__negdi2,__qdivrem,__subdi3,__ucmpdi2,__udivdi3,
##        __umoddi3,__xordi3,
##        memcpy,strcmp,strcpy
## V0.3  (20.11.1998) phx
##       List functions: PPCAddHead/Sync, AddTail/Sync, Enqueue/Sync,
##       Insert/Sync, NewList, RemHead/Sync, Remove/Sync, RemTail/Sync
##       and PPCNextTagItem.
## V0.2  (16.11.1998) phx
##       64-bit functions: PPCAdd64, Add64p, Cmp64, Cmp64p, Divs64, Divs64p,
##       Divu64, Divu64p, Mods64, Mods64p, Modu64, Modu64p, Muls64, Muls64p,
##       Mulu64, Mulu64p, Neg64, Neg64p, Sub64, Sub64p
## V0.1  (15.11.1998) phx
##       First partially working ppc.library emulation. Synchronous PPC
##       tasks, started by runelf, which only use the basic PowerUp kernel
##       functions for I/O, memory and context-switch seem to work fine.
## V0.0  (13.11.1998) phx
##       created
##
	.file   "asmkernel.s"
	.include "taskobject.i"
	.include "warpos_lvo.i"


.macro  LIBFUNC
	.globl  _kern\1
_kern\1:
.set	sfsize,0
.ifgt	$NARG-1
.ifne	\2
.set	sfsize,\2
.endif
.endif
.ifdef	KERNEL_DEBUG
.set	sfsize,sfsize+64
.endif

.ifne	sfsize
	mflr	r0
	stw	r0,8(r1)
	stwu	r1,-sfsize(r1)

.ifdef	KERNEL_DEBUG
	.data
\1fname:
	.string	"\1"
	.align	2

	.tocd
@_\1fname:
	.long	\1fname

	.text
	stw	r11,sfsize-40(r1)
	stw	r12,sfsize-36(r1)
	stw	r3,sfsize-32(r1)
	stw	r4,sfsize-28(r1)
	stw	r5,sfsize-24(r1)
	stw	r6,sfsize-20(r1)
	stw	r7,sfsize-16(r1)
	stw	r8,sfsize-12(r1)
	stw	r9,sfsize-8(r1)
	stw	r10,sfsize-4(r1)
	lwz	r4,@_ffmt(r2)
	la	r5,@_\1fname(r2)
	CALLWOS	SPrintF,r12
	lwz	r11,sfsize-40(r1)
	lwz	r12,sfsize-36(r1)
	lwz	r3,sfsize-32(r1)
	lwz	r4,sfsize-28(r1)
	lwz	r5,sfsize-24(r1)
	lwz	r6,sfsize-20(r1)
	lwz	r7,sfsize-16(r1)
	lwz	r8,sfsize-12(r1)
	lwz	r9,sfsize-8(r1)
	lwz	r10,sfsize-4(r1)
.ifeq	sfsize-64
	addi	r1,r1,sfsize
	lwz	r0,8(r1)
	mtlr	r0
.endif
.endif
.endif
.endm


.macro	EXIT
.ifne	sfsize
	addi	r1,r1,sfsize
	lwz	r0,8(r1)
	mtlr	r0
.endif
	blr
.endm


	.text


######## 64 bit arithmetics ########

	LIBFUNC	__adddi3
	LIBFUNC	PPCAdd64
	addc	r4,r4,r6
	adde	r3,r3,r5
	blr


	LIBFUNC	PPCAdd64p
	lwz	r6,4(r3)
	lwz	r8,4(r4)
	addc	r6,r6,r8
	lwz	r5,0(r3)
	lwz	r7,0(r4)
	stw	r6,4(r3)
	adde	r5,r5,r7
	stw	r5,0(r3)
	blr


	LIBFUNC	PPCCmp64p
	lwz	r5,0(r4)
	lwz	r6,4(r4)
	lwz	r4,4(r3)
	lwz	r3,0(r3)

	LIBFUNC	PPCCmp64
	cmpw	r3,r5
	bgt	.cmpgt
	blt	.cmplt
	cmplw	r4,r6
	ble	.cmpc
.cmpgt:	li	r3,1
	blr
.cmpc:	blt	.cmplt
	li	r3,0
	blr
.cmplt:	li	r3,-1
	blr


	LIBFUNC	__udivdi3
	LIBFUNC	PPCDivu64
	cmpwi	r3,0
	cntlzw	r0,r3
	cntlzw	r9,r4
	bne-	.divu1
	addi	r0,r9,32
.divu1:	cmpwi	r5,0
	cntlzw	r9,r5
	cntlzw	r10,r6
	bne-	.divu2
	addi	r9,r10,32
.divu2:	cmpw	r0,r9
	subfic	r10,r0,64
	bgt-	.divu9
	addi	r9,r9,1
	subfic	r9,r9,64
	add	r0,r0,r9
	sub	r9,r10,r9
	mtctr	r9
	cmpwi	r9,32
	subi	r7,r9,32
	blt-	.divu3
	srw	r8,r3,r7
	li	r7,0
	b	.divu4
.divu3:	srw	r8,r4,r9
	subfic	r7,r9,32
	slw	r7,r3,r7
	or	r8,r8,r7
	srw	r7,r3,r9
.divu4:	cmpwi	r0,32
	subic	r9,r0,32
	blt-	.divu5
	slw	r3,r4,r9
	li	r4,0
	b	.divu6
.divu5:	slw	r3,r3,r0
	subfic	r9,r0,32
	srw	r9,r4,r9
	or	r3,r3,r9
	slw	r4,r4,r0
.divu6:	li	r10,-1
	addic	r7,r7,0
.divu7:	adde	r4,r4,r4
	adde	r3,r3,r3
	adde	r8,r8,r8
	adde	r7,r7,r7
	subc	r0,r8,r6
	subfe.	r9,r5,r7
	blt-	.divu8
	mr	r8,r0
	mr	r7,r9
	addic	r0,r10,1
.divu8:	bdnz+	.divu7
	adde	r4,r4,r4
	adde	r3,r3,r3
	mr	r6,r8
	mr	r5,r7
	blr
.divu9:	mr	r6,r4
	mr	r5,r3
	li	r4,0
	li	r3,0
	blr


	LIBFUNC	PPCDivu64p,32
	stw	r31,24(r1)
	mr	r31,r3
	lwz	r5,0(r4)
	lwz	r6,4(r4)
	lwz	r4,4(r3)
	lwz	r3,0(r3)
	bl	_kernPPCDivu64
	stw	r3,0(r31)
	stw	r4,4(r31)
	lwz	r31,24(r1)
	EXIT


	LIBFUNC	__divdi3
	LIBFUNC	PPCDivs64,32
	stw	r31,24(r1)
	srawi.	r31,r5,31
	beq-	.divs1
	subfic	r6,r6,0
	subfze	r5,r5
.divs1:	srawi	r7,r3,31
	beq-	.divs2
	subfic	r4,r4,0
	subfze	r3,r3
	xor	r31,r31,r7
.divs2:	bl	_kernPPCDivu64
	cmpwi	r31,0
	beq-	.divs3
	subfic	r4,r4,0
	subfze	r3,r3
.divs3:	lwz	r31,24(r1)
	EXIT


	LIBFUNC	PPCDivs64p,32
	stw	r30,24(r1)
	stw	r31,28(r1)
	mr	r31,r3
	lwz	r5,0(r4)
	srawi.	r30,r5,31
	lwz	r6,4(r4)
	beq-	.divs4
	subfic	r6,r6,0
	subfze	r5,r5
.divs4:	lwz	r4,4(r3)
	lwz	r3,0(r3)
	srawi	r7,r3,31
	beq-	.divs5
	subfic	r4,r4,0
	subfze	r3,r3
	xor	r30,r30,r7
.divs5:	bl	_kernPPCDivu64
	cmpwi	r30,0
	beq-	.divs6
	subfic	r4,r4,0
	subfze	r3,r3
.divs6:	stw	r3,0(r31)
	stw	r4,4(r31)
	lwz	r30,24(r1)
	lwz	r31,28(r1)
	EXIT


	LIBFUNC	__umoddi3
	LIBFUNC	PPCModu64,32
	bl	_kernPPCDivu64
	mr      r3,r5
	mr      r4,r6
	EXIT


	LIBFUNC	PPCModu64p,32
	stw	r31,24(r1)
	mr	r31,r3
	lwz	r5,0(r4)
	lwz	r6,4(r4)
	lwz	r4,4(r3)
	lwz	r3,0(r3)
	bl	_kernPPCDivu64
	stw	r5,0(r31)
	stw	r6,4(r31)
	lwz	r31,24(r1)
	EXIT


	LIBFUNC	__moddi3
	LIBFUNC	PPCMods64,32
	stw	r31,24(r1)
	srawi.	r31,r5,31
	beq-	.mod1
	subfic	r6,r6,0
	subfze	r5,r5
.mod1:	srawi	r7,r3,31
	beq-	.mod2
	subfic	r4,r4,0
	subfze	r3,r3
	xor	r31,r31,r7
.mod2:	bl	_kernPPCDivu64
	cmpwi	r31,0
	beq-	.mod3
	subfic	r6,r6,0
	subfze	r5,r5
.mod3:	mr	r3,r5
	mr	r4,r6
	lwz	r31,24(r1)
	EXIT


	LIBFUNC	PPCMods64p,32
	stw	r30,24(r1)
	stw	r31,28(r1)
	mr	r31,r3
	lwz	r5,0(r4)
	srawi.	r30,r5,31
	lwz	r6,4(r4)
	beq-	.modp1
	subfic	r6,r6,0
	subfze	r5,r5
.modp1:	lwz	r4,4(r3)
	lwz	r3,0(r3)
	srawi	r7,r3,31
	beq-	.modp2
	subfic	r4,r4,0
	subfze	r3,r3
	xor	r30,r30,r7
.modp2:	bl	_kernPPCDivu64
	cmpwi	r30,0
	beq-	.modp3
	subfic	r6,r6,0
	subfze	r5,r5
.modp3:	stw	r5,0(r31)
	stw	r6,4(r31)
	lwz	r30,24(r1)
	lwz	r31,28(r1)
	EXIT


	LIBFUNC	__lmulq
	LIBFUNC	PPCMulu64
	mullw	r7,r3,r5
	mullw	r8,r4,r6
	mulhwu	r0,r4,r6
	add	r7,r7,r0
	mullw	r9,r4,r5
	add	r7,r7,r9
	mr	r4,r8
	mullw	r0,r3,r6
	add	r3,r7,r0
	blr


	LIBFUNC	PPCMulu64p
	lwz	r5,0(r3)
	lwz	r6,4(r3)
	lwz	r7,0(r4)
	lwz	r8,4(r4)
	mullw	r9,r5,r7
	mullw	r10,r6,r8
	mulhwu	r0,r6,r8
	add	r9,r9,r0
	mullw	r11,r6,r7
	add	r9,r9,r11
	stw	r10,4(r3)
	mullw	r0,r5,r8
	add	r11,r9,r0
	stw	r11,0(r3)
	blr


	LIBFUNC	__muldi3
	LIBFUNC	PPCMuls64
	mullw	r7,r3,r5
	mullw	r8,r4,r6
	mulhw	r0,r4,r6
	add	r7,r7,r0
	mullw	r9,r4,r5
	add	r7,r7,r9
	mr	r4,r8
	mullw	r0,r3,r6
	add	r3,r7,r0
	blr


	LIBFUNC	PPCMuls64p
	lwz	r5,0(r3)
	lwz	r6,4(r3)
	lwz	r7,0(r4)
	lwz	r8,4(r4)
	mullw	r9,r5,r7
	mullw	r10,r6,r8
	mulhw	r0,r6,r8
	add	r9,r9,r0
	mullw	r11,r6,r7
	add	r9,r9,r11
	stw	r10,4(r3)
	mullw	r0,r5,r8
	add	r11,r9,r0
	stw	r11,0(r3)
	blr


	LIBFUNC	__negdi2
	LIBFUNC	PPCNeg64
	subfic	r4,r4,0
	subfze	r3,r3
	blr


	LIBFUNC	PPCNeg64p
	lwz	r5,4(r3)
	lwz	r4,0(r3)
	subfic	r5,r5,0
	subfze	r4,r4
	stw	r5,0(r3)
	stw	r4,4(r3)
	blr


	LIBFUNC	__subdi3
	LIBFUNC	PPCSub64
	subfc	r4,r6,r4
	subfe	r3,r5,r3
	blr


	LIBFUNC	PPCSub64p
	lwz	r6,4(r3)
	lwz	r8,4(r4)
	subfc	r6,r8,r6
	lwz	r5,0(r3)
	lwz	r7,0(r4)
	stw	r6,4(r3)
	subfe	r5,r7,r5
	stw	r5,0(r3)
	blr


	LIBFUNC	__anddi3
	LIBFUNC	PPCAnd64
	and	r3,r3,r5
	and	r4,r4,r6
	blr


	LIBFUNC	PPCAnd64p
	lwz	r5,0(r3)
	lwz	r6,4(r3)
	lwz	r7,0(r4)
	lwz	r8,4(r4)
	and	r5,r5,r7
	and	r6,r6,r8
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__ashldi3
	LIBFUNC	__lshldi3
	LIBFUNC	PPCAsl64
	LIBFUNC	PPCLsl64
	subfic	r6,r5,32
	slw	r3,r3,r5
	srw	r0,r4,r6
	or	r3,r3,r0
	subi	r6,r5,32
	slw	r0,r4,r6
	or	r3,r3,r0
	slw	r4,r4,r5
	blr


	LIBFUNC	PPCAsl64p
	LIBFUNC	PPCLsl64p
	lwz	r5,0(r3)
	lwz	r6,0(r3)
	subfic	r7,r4,32
	slw	r5,r5,r4
	srw	r0,r6,r7
	or	r5,r5,r0
	subi	r7,r4,32
	slw	r0,r6,r7
	or	r5,r5,r0
	slw	r6,r6,r4
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__ashrdi3
	LIBFUNC	PPCAsr64
	subfic	r6,r5,32
	srw	r4,r4,r5
	slw	r0,r3,r6
	or	r4,r4,r0
	subic.	r6,r5,32
	sraw	r0,r3,r6
	blelr-
	ori	r4,r0,0
	sraw	r3,r3,r5
	blr


	LIBFUNC	PPCAsr64p
	lwz	r5,0(r3)
	lwz	r6,0(r3)
	subfic	r7,r4,32
	srw	r6,r6,r4
	slw	r0,r5,r7
	or	r6,r6,r0
	subic.	r7,r4,32
	sraw	r0,r5,r7
	blelr-
	ori	r6,r0,0
	sraw	r5,r5,r4
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__lshrdi3
	LIBFUNC	PPCLsr64
	subfic	r6,r5,32
	srw	r4,r4,r5
	slw	r0,r3,r6
	or	r4,r4,r0
	subi	r6,r5,32
	slw	r0,r3,r6
	or	r4,r4,r0
	srw	r3,r3,r5
	blr


	LIBFUNC	PPCLsr64p
	lwz	r5,0(r3)
	lwz	r6,0(r3)
	subfic	r7,r4,32
	srw	r6,r6,r4
	slw	r0,r5,r7
	or	r6,r6,r0
	subi	r7,r4,32
	slw	r0,r5,r7
	or	r6,r6,r0
	srw	r5,r5,r4
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__iordi3
	LIBFUNC	PPCOr64
	or	r3,r3,r5
	or	r4,r4,r6
	blr


	LIBFUNC	PPCOr64p
	lwz	r5,0(r3)
	lwz	r6,4(r3)
	lwz	r7,0(r4)
	lwz	r8,4(r4)
	or	r5,r5,r7
	or	r6,r6,r8
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__xordi3
	LIBFUNC	PPCXor64
	xor	r3,r3,r5
	xor	r4,r4,r6
	blr


	LIBFUNC	PPCXor64p
	lwz	r5,0(r3)
	lwz	r6,4(r3)
	lwz	r7,0(r4)
	lwz	r8,4(r4)
	xor	r5,r5,r7
	xor	r6,r6,r8
	stw	r5,0(r3)
	stw	r6,4(r3)
	blr


	LIBFUNC	__qdivrem
	LIBFUNC	PPCDivRem64,32
	stw	r7,24(r1)
	bl	_kernPPCDivu64
	lwz	r7,24(r1)
	cmpwi	r7,0
	beq-	.divrm
	stw	r5,0(r7)
	stw	r6,4(r7)
.divrm:	EXIT


	LIBFUNC	PPCDivRem64p,32
	stw	r3,24(r1)
	stw	r5,28(r1)
	lwz	r5,0(r4)
	lwz	r6,4(r4)
	lwz	r4,4(r3)
	lwz	r3,0(r3)
	bl	_kernPPCDivu64
	lwz	r4,24(r1)
	stw	r3,0(r4)
	stw	r4,4(r4)
	lwz	r5,28(r1)
	cmpwi	r5,0
	beq-	.dvrmx
	stw	r5,0(r5)
	stw	r6,4(r5)
.dvrmx:	EXIT



######## gcc math ########

	LIBFUNC	__cmpdi2
	LIBFUNC	__ucmpdi2
	cmplw	cr1,r3,r5
	blt-	cr1,.cmpd0
	bgt-	cr1,.cmpd2
	cmplw	cr1,r4,r6
	blt-	cr1,.cmpd0
	cror	7,6,4
	mfcr	r0
	rlwinm	r0,r0,8,31,31
	neg	r0,r0
	not	r9,r0
	rlwinm	r9,r9,0,30,30
	rlwinm	r0,r0,0,31,31
	or	r3,r0,r9
	blr
.cmpd2:	li      r3,2
	blr
.cmpd0:	li      r3,0
	blr


	LIBFUNC	__fixunsdfdi,64
	stfd    f31,56(r1)
	stw     r30,48(r1)
	stw     r31,52(r1)
	fmr     f31,f1
	lfd	f0,dconst0(r2)
	fcmpu   cr1,f31,f0
	blt-    cr1,.fxud1
	lfd     f0,dconst2e19(r2)
	fcmpu   cr1,f31,f0
	cror    7,6,5
	bns-    cr1,.fxud2
.fxud1:	li      r4,-1
	li      r3,-1
	b       .fxudy
.fxud2:	lfd     f0,dconst8(r2)
	fsub    f0,f31,f0
	lfd     f13,dconst16(r2)
	fdiv    f0,f0,f13
	lfd     f13,dconst2e09(r2)
	fcmpu   cr1,f0,f13
	cror    7,6,5
	bso-    cr1,.fxud3
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	b       .fxud4
.fxud3:	fsub    f0,f0,f13
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	xoris   r0,r0,32768
.fxud4:	mr      r30,r0
	li      r31,0
	mr      r3,r30
	mr      r4,r31
	li      r6,0
	li      r5,0
	crclr   6,6
	bl      _kern__ucmpdi2
	cmpwi   cr1,r3,1
	blt-    cr1,.fxud5
	mr      r3,r30
	mr      r4,r31
	crclr   6,6
	bl      _kern__floatdidf
	b       .fxud6
.fxud5:	li      r3,0
	li      r4,0
	rlwinm  r10,r30,31,0,0
	rlwinm  r9,r30,31,1,31
	or      r3,r3,r9
	or      r4,r4,r10
	crclr   6,6
	bl      _kern__floatdidf
	fadd    f1,f1,f1
.fxud6:	fsub    f31,f31,f1
	lfd     f0,dconst0(r2)
	fcmpu   cr1,f31,f0
	bge-    cr1,.fxud7
	lfd     f0,dconst4e09(r2)
	subi    r30,r30,1
	fadd    f31,f31,f0
.fxud7:	lfd     f0,dconst4e09(r2)
	fcmpu   cr1,f31,f0
	ble-    cr1,.fxud8
	addi    r30,r30,1
	fsub    f31,f31,f0
.fxud8:	lfd     f0,dconst2e09(r2)
	fcmpu   cr1,f31,f0
	cror    7,6,5
	bso-    cr1,.fxud9
	fctiwz  f0,f31
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	b       .fxudx
.fxud9:	fsub    f0,f31,f0
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	xoris   r0,r0,32768
.fxudx:	mr      r31,r0
	mr      r3,r30
	mr      r4,r31
.fxudy:	lwz     r30,48(r1)
	lwz     r31,52(r1)
	lfd     f31,56(r1)
	EXIT


	LIBFUNC	__fixunssfdi,64
	stfd    f31,56(r1)
	stw     r30,48(r1)
	stw     r31,52(r1)
	lfs	f0,dconst0(r2)
	fcmpu   cr1,f1,f0
	blt-    cr1,.fxus1
	lfd	f0,dconst2e19(r2)
	fcmpu   cr1,f1,f0
	cror    7,6,5
	bns-    cr1,.fxus2
.fxus1:	li      r4,-1
	li      r3,-1
	b       .fxusx
.fxus2:	fmr     f31,f1
	lfd	f0,dconst8(r2)
	fsub    f0,f31,f0
	lfd	f13,dconst16(r2)
	fdiv    f0,f0,f13
	lfd	f13,dconst2e09(r2)
	fcmpu   cr1,f0,f13
	cror    7,6,5
	bso-    cr1,.fxus3
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	b       .fxus0
.fxus3:	fsub    f0,f0,f13
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	xoris   r0,r0,32768
.fxus0:	mr      r30,r0
	li      r31,0
	mr      r3,r30
	mr      r4,r31
	li      r6,0
	li      r5,0
	crclr   6,6
	bl      _kern__ucmpdi2
	cmpwi   cr1,r3,1
	blt-    cr1,.fxus4
	mr      r3,r30
	mr      r4,r31
	crclr   6,6
	bl      _kern__floatdidf
	b       .fxus8
.fxus4:	li      r3,0
	li      r4,0
	rlwinm  r10,r30,31,0,0
	rlwinm  r9,r30,31,1,31
	or      r3,r3,r9
	or      r4,r4,r10
	crclr   6,6
	bl      _kern__floatdidf
	fadd    f1,f1,f1
.fxus8:	fsub    f31,f31,f1
	lfd	f0,dconst0(r2)
	fcmpu   cr1,f31,f0
	bge-    cr1,.fxus5
	lfd	f0,dconst4e09(r2)
	subi    r30,r30,1
	fadd    f31,f31,f0
.fxus5:	lfd	f0,dconst4e09(r2)
	fcmpu   cr1,f31,f0
	ble-    cr1,.fxus6
	addi    r30,r30,1
	fsub    f31,f31,f0
.fxus6:	lfd     f0,dconst2e09(r2)
	fcmpu   cr1,f31,f0
	cror    7,6,5
	bso-    cr1,.fxus7
	fctiwz  f0,f31
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	b       .fxus9
.fxus7:	fsub    f0,f31,f0
	fctiwz  f0,f0
	stfd    f0,24(r1)
	lwz     r0,28(r1)
	xoris   r0,r0,32768
.fxus9:	mr      r31,r0
	mr      r3,r30
	mr      r4,r31
.fxusx:	lwz     r30,48(r1)
	lwz     r31,52(r1)
	lfd     f31,56(r1)
	EXIT


	LIBFUNC	__fixdfdi,32
	lfd     f0,dconst0(r2)
	fcmpu   cr1,f1,f0
	bge-    cr1,.dfd1
	lfd     f0,dconstM9e18(r2)
	fcmpu   cr1,f1,f0
	cror    7,6,4
	bns-    cr1,.dfd2
	li      r4,0
	lis     r3,-32768
	b       .dfdx
.dfd2:	fneg    f1,f1
	crset   6,6
	bl      _kern__fixunsdfdi
	subfic  r4,r4,0
	subfze  r3,r3
	b       .dfdx
.dfd1:	lfd     f0,dconst2e19(r2)
	fcmpu   cr1,f1,f0
	cror    7,6,5
	bso-    cr1,.dfd3
	crset   6,6
	bl      _kern__fixunsdfdi
	b       .dfdx
.dfd3:	li      r4,-1
	lis     r0,32767
	ori     r3,r0,65535
.dfdx:	EXIT


	LIBFUNC	__fixsfdi,32
	lfs     f0,dconst0(r2)
	fcmpu   cr1,f1,f0
	bge-    cr1,.sfd1
	lfs     f0,fconstM9e18(r2)
	fcmpu   cr1,f1,f0
	cror    7,6,4
	bns-    cr1,.sfd2
	li      r4,0
	lis     r3,-32768
	b       .sfdx
.sfd2:	fneg    f1,f1
	crset   6,6
	bl      _kern__fixunssfdi
	subfic  r4,r4,0
	subfze  r3,r3
	b       .sfdx
.sfd1:	lfs     f0,fconst9e18(r2)
	fcmpu   cr1,f1,f0
	cror    7,6,5
	bso-    cr1,.sfd3
	crset   6,6
	bl      _kern__fixunssfdi
	b       .sfdx
.sfd3:	li      r4,-1
	lis     r0,32767
	ori     r3,r0,65535
.sfdx:	EXIT


	LIBFUNC	__floatdidf
	stwu    r1,-32(r1)
	cmpwi   cr1,r3,0
	bge-    cr1,.fldd1
	subfic  r4,r4,0
	subfze  r3,r3
	li      r9,1
	b       .fldd2
.fldd1:	li      r9,0
.fldd2:	lis     r0,17200
	stw     r3,12(r1)
	stw     r0,24(r1)
	lfd     f12,24(r1)
	stw     r4,28(r1)
	stw     r0,24(r1)
	lfd     f13,24(r1)
	lfd     f0,dconst4e15(r2)
	cmpwi   cr1,r9,0
	fsub    f12,f12,f0
	fsub    f13,f13,f0
	lfd     f0,dconst16(r2)
	fmadd   f1,f12,f13,f0
	addi	r1,r1,32
	beqlr-	cr1
	fneg    f1,f1
	blr


	LIBFUNC	__floatdisf
	stwu    r1,-32(r1)
	cmpwi   cr1,r3,0
	bge-    cr1,.flds1
	subfic  r4,r4,0
	subfze  r3,r3
	li      r9,1
	b       .flds2
.flds1:	li      r9,0
.flds2:	lis     r0,17200
	stw     r3,28(r1)
	stw     r0,24(r1)
	lfd     f0,24(r1)
	lfd     f12,dconst4e15(r2)
	fsub    f0,f0,f12
	lfd     f13,dconst16(r2)
	fmul    f0,f0,f13
	stw     r4,28(r1)
	stw     r0,24(r1)
	lfd     f13,24(r1)
	fsub    f13,f13,f12
	addi	r1,r1,32
	frsp    f13,f13
	frsp    f0,f0
	cmpwi   cr1,r9,0
	fadds   f1,f0,f13
	beqlr-	cr1
	fneg    f1,f1
	blr


	LIBFUNC	__floatunsdidf
	stwu    r1,-32(r1)
	lis     r0,17200
	stw     r3,12(r1)
	stw     r0,8(r1)
	lfd     f13,8(r1)
	stw     r4,12(r1)
	stw     r0,8(r1)
	lfd     f1,8(r1)
	lfd     f0,dconst4e15(r2)
	fsub    f13,f13,f0
	fsub    f1,f1,f0
	lfd     f0,dconst16(r2)
	fmadd   f1,f13,f1,f0
	addi    r1,r1,32
	blr



######## List support ########

	LIBFUNC	PPCAddHead
	lwz	r5,0(r3)
	stw	r5,0(r4)
	stw	r4,4(r5)
	stw	r3,4(r4)
	stw	r4,0(r3)
	blr


	LIBFUNC	PPCAddTail
	addi	r0,r3,4
	lwz	r5,8(r3)
	stw	r0,0(r4)
	stw	r5,4(r4)
	stw	r4,0(r5)
	stw	r4,8(r3)
	blr


	LIBFUNC	PPCEnqueue
	lwz	r3,0(r3)
	lwz	r0,0(r3)
	mr	r5,r4
	cmpwi	cr1,r0,0
	lbz	r0,9(r5)
	extsb	r4,r0
	beq-	cr1,.enq2
.enq1:	lbz	r0,9(r3)
	extsb	r0,r0
	cmpw	cr1,r0,r4
	blt-	cr1,.enq2
	lwz	r3,0(r3)
	lwz	r0,0(r3)
	cmpwi	cr1,r0,0
	bne+	cr1,.enq1
.enq2:	lwz	r4,4(r3)
	stw	r5,4(r3)
	stw	r3,0(r5)
	stw	r4,4(r5)
	stw	r5,0(r4)
	blr


	LIBFUNC	PPCInsert
	mr.	r5,r5
	mr	r6,r4
	beq-	.ins2
	lwz	r4,0(r5)
	cmpwi	cr1,r4,0
	beq-	cr1,.ins1
	stw	r4,0(r6)
	stw	r5,4(r6)
	stw	r6,4(r4)
	stw	r6,0(r5)
	blr
.ins1:	stw	r5,0(r6)
	lwz	r4,4(r5)
	stw	r4,4(r6)
	stw	r6,4(r5)
	stw	r6,0(r4)
	blr
.ins2:	lwz	r5,0(r3)
	stw	r5,0(r6)
	stw	r6,4(r5)
	stw	r3,4(r6)
	stw	r6,0(r3)
	blr


	LIBFUNC	PPCNewList
	stw	r3,8(r3)
	li	r0,0
	stwu	r0,4(r3)
	stw	r3,-4(r3)
	blr


	LIBFUNC	PPCRemHead
	lwz	r5,0(r3)
	lwz	r4,0(r5)
	cmpwi	r4,0
	bne-	.remhd
	li	r3,0
	blr
.remhd:	stw	r4,0(r3)
	stw	r3,4(r4)
	mr	r3,r5
	blr


	LIBFUNC	PPCRemove
	lwz	r5,4(r3)
	lwz	r4,0(r3)
	stw	r4,0(r5)
	stw	r5,4(r4)
	blr


	LIBFUNC	PPCRemTail
	lwz     r5,8(r3)
	lwz     r4,4(r5)
	cmpwi   cr1,r4,0
	bne-    cr1,.remtl
	li      r3,0
	blr
.remtl:	stw     r4,8(r3)
	addi    r0,r3,4
	stw     r0,0(r4)
	mr      r3,r5
	blr


	LIBFUNC	PPCAddHeadSync,48
	stw	r30,24(r1)
	stw	r31,28(r1)
	mr	r30,r3
	mr	r31,r4
	stw	r12,44(r1)
	CALLWOS	Super,r12
	lwz	r12,44(r1)
	lwz	r4,0(r30)
	stw	r4,0(r31)
	stw	r31,4(r4)
	stw	r30,4(r31)
	stw	r31,0(r30)
	mr	r4,r3
	CALLWOS	User,r12
	lwz	r30,24(r1)
	lwz	r31,28(r1)
	EXIT


	LIBFUNC	PPCAddTailSync,48
	stw	r30,24(r1)
	stw	r31,28(r1)
	mr	r30,r3
	mr	r31,r4
	stw	r12,44(r1)
	CALLWOS	Super,r12
	lwz	r12,44(r1)
	addi	r0,r30,4
	lwz	r4,8(r30)
	stw	r0,0(r31)
	stw	r4,4(r31)
	stw	r31,0(r4)
	stw	r31,8(r30)
	mr	r4,r3
	CALLWOS	User,r12
	lwz	r30,24(r1)
	lwz	r31,28(r1)
	EXIT


	LIBFUNC	PPCEnqueueSync,48
	stw	r30,24(r1)
	stw	r31,28(r1)
	mr	r30,r3
	mr	r31,r4
	stw	r12,44(r1)
	CALLWOS	Super,r12
	mr	r4,r31
	mr	r31,r3
	mr	r3,r30
	bl	_kernPPCEnqueue
	mr	r4,r31
	lwz	r3,44(r1)
	CALLWOS	User,r3
	lwz	r30,24(r1)
	lwz	r31,28(r1)
	EXIT


	LIBFUNC	PPCInsertSync,48
	stw	r29,24(r1)
	stw	r30,28(r1)
	stw	r31,32(r1)
	mr	r29,r3
	mr	r30,r4
	mr	r31,r5
	stw	r12,44(r1)
	CALLWOS	Super,r12
	mr	r5,r31
	mr	r31,r3
	mr	r3,r29
	mr	r4,r30
	bl	_kernPPCInsert
	mr	r4,r31
	lwz	r3,44(r1)
	CALLWOS	User,r3
	lwz	r29,24(r1)
	lwz	r30,28(r1)
	lwz	r31,32(r1)
	EXIT


	LIBFUNC	PPCRemHeadSync,32
	stw	r31,24(r1)
	mr	r31,r3
	stw	r12,28(r1)
	CALLWOS	Super,r12
	lwz	r5,0(r31)
	lwz	r4,0(r5)
	cmpwi	r4,0
	bne-	.rhs1
	li	r31,0
	b	.rhs2
.rhs1:	stw	r4,0(r31)
	stw	r31,4(r4)
	mr	r31,r5
.rhs2:	mr	r4,r3
	lwz	r3,28(r1)
	CALLWOS	User,r3
	mr	r3,r31
	lwz	r31,24(r1)
	EXIT


	LIBFUNC	PPCRemoveSync,32
	stw	r31,24(r1)
	mr	r31,r3
	stw	r12,28(r1)
	CALLWOS	Super,r12
	lwz	r5,4(r31)
	lwz	r4,0(r31)
	stw	r4,0(r5)
	stw	r5,4(r4)
	mr	r4,r3
	lwz	r3,28(r1)
	CALLWOS	User,r3
	lwz	r31,24(r1)
	EXIT


	LIBFUNC	PPCRemTailSync,32
	stw	r31,24(r1)
	mr	r31,r3
	stw	r12,28(r1)
	CALLWOS	Super,r12
	lwz     r5,8(r31)
	lwz     r4,4(r5)
	cmpwi   cr1,r4,0
	bne-    cr1,.rts1
	li      r31,0
	b	.rts2
.rts1:	stw     r4,8(r31)
	addi    r0,r31,4
	stw     r0,0(r4)
	mr      r31,r5
.rts2:	mr	r4,r3
	lwz	r3,28(r1)
	CALLWOS	User,r3
	mr	r3,r31
	lwz	r31,24(r1)
	EXIT


######## TagItem support ########

	LIBFUNC	PPCFindTagItem,32
	mr	r5,r4
	mr	r4,r3
	CALLWOS	FindTagItemPPC,r12
	EXIT


	LIBFUNC	PPCGetTagData,32
	mr	r6,r5
	mr	r5,r4
	mr	r4,r3
	CALLWOS	GetTagDataPPC,r12
	EXIT


	LIBFUNC	PPCNextTagItem,32
	mr	r4,r3
	CALLWOS	NextTagItemPPC,r12
	EXIT



######## std c lib ########

	LIBFUNC	memcpy
	mr	r7,r3
	srawi.	r6,r5,2
	mtctr	r6
	beq-	.mc1
.mc2:	lwz	r0,0(r4)
	addi	r4,r4,4
	stw	r0,0(r7)
	addi	r7,r7,4
	bdnz+	.mc2
.mc1:	andi.	r5,r5,3
	mtctr	r5
	beqlr-
.mc3:	lbz     r0,0(r4)
	addi	r4,r4,1
	stb	r0,0(r7)
	addi	r7,r7,1
	bdnz+	.mc3
	blr


	LIBFUNC	strcmp
.scmp1:	lbz	r5,0(r3)
	cmpwi	cr1,r5,0
	addi	r3,r3,1
	bne- 	cr1,.scmp2
	lbz	r0,0(r4)
	cmpwi	cr1,r0,0
	bne+	cr1,.scmp1
	li	r3,0
	blr
.scmp2:	lbz	r0,0(r4)
	cmpw	cr1,r5,r0
	addi	r4,r4,1
	beq+	cr1,.scmp1
	li	r3,-1
	blr


	LIBFUNC	strcpy
.scpy:	lbz	r5,0(r4)
	stb	r5,0(r3)
	addi	r4,r4,1
	cmpwi	r5,0
	addi	r3,r3,1
	bne+	.scpy
	blr


	LIBFUNC	strlen
	addi	r4,r3,1
.slen:	lbz	r5,0(r3)
	cmpwi	r5,0
	addi	r3,r3,1
	bne+	.slen
	sub	r3,r3,r4
	blr



######## Signals ########


	LIBFUNC	PPCAllocSignal,32
	extsb	r4,r3
	CALLWOS	AllocSignalPPC,r12
	EXIT


	LIBFUNC	PPCFreeSignal,32
	extsb	r4,r3
	CALLWOS	FreeSignalPPC,r12
	EXIT


	LIBFUNC	PPCSetSignal,32
	mr	r5,r4
	mr	r4,r3
	CALLWOS	SetSignalPPC,r12
	EXIT


	LIBFUNC	PPCSignal,32
	mr	r5,r4
	lwz	r4,to_this(r3)		# signal WarpOS task
	CALLWOS	SignalPPC,r12
	EXIT


	LIBFUNC	PPCWait,32
	mr	r4,r3
	CALLWOS	WaitPPC,r12
	EXIT



######## Misc ########

	LIBFUNC	PPCVersion
	lhz	r3,20(r12)
	blr


	LIBFUNC	PPCRevision
	lhz	r3,22(r12)
	blr



.ifdef	KERNEL_DEBUG
	.data
ffmt:
	.byte	"AsmKernel: %s()"
	.byte	10,0
	.align	2
.endif


	.tocd

dconst0:
	.long	0x00000000,0x00000000
dconst8:
	.long	0x40200000,0x00000000
dconst16:
	.long	0x40300000,0x00000000
dconst2e09:
	.long	0x41e00000,0x00000000
dconst4e09:
	.long	0x41efffff,0xffe00000
dconst4e15:
	.long	0x43300000,0x00000000
dconstM9e18:
	.long	0xc3e00000,0x00000000
dconst2e19:
	.long	0x43f00000,0x00000000
fconst9e18:
	.long	0x5f000000
fconstM9e18:
	.long	0xdf000000
.ifdef	KERNEL_DEBUG
@_ffmt:
	.long	ffmt
.endif
