 *
 * Mesa 3-D graphics library
 * Copyright (C) 1995  Brian Paul  (brianp@ssec.wisc.edu)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *

* Assembler implementations of functions in ADisp_HWRas.c (Sam Jordan)

		include exec/types.i

		XDEF    _asm_HW_SetupFlat
		XDEF    _asm_HW_SetupFlatZ
		XDEF    _asm_HW_SetupGouraud
		XDEF    _asm_HW_SetupGouraudZ
		XDEF    _asm_HW_SetupFlatFog
		XDEF    _asm_HW_SetupFlatFogZ
		XDEF    _asm_HW_SetupGouraudFog
		XDEF    _asm_HW_SetupGouraudFogZ
		XDEF    _asm_HW_SetupFlatTex
		XDEF    _asm_HW_SetupFlatTexZ
		XDEF    _asm_HW_SetupGouraudTex
		XDEF    _asm_HW_SetupGouraudTexZ

/* keep consistent to Warp3D.h */

		IFND    W3D_FLOAT
W3D_FLOAT       MACRO
		FLOAT           \1
		ENDM
		ENDC

		IFND    W3D_DOUBLE
W3D_DOUBLE      MACRO
		DOUBLE           \1
		ENDM
		ENDC

		IFND    W3D_Color
	STRUCTURE       W3D_Color,0
	W3D_FLOAT       w3dc_r
	W3D_FLOAT       w3dc_g
	W3D_FLOAT       w3dc_b
	W3D_FLOAT       w3dc_a
	LABEL           w3dc_Sizeof
		ENDC

		IFND    W3D_ColorRGB
	STRUCTURE       W3D_ColorRGB,0
	W3D_FLOAT       w3dcrgb_r
	W3D_FLOAT       w3dcrgb_g
	W3D_FLOAT       w3dcrgb_b
	LABEL           w3dcrgb_Sizeof
		ENDC

		IFND    W3D_Vertex
	STRUCTURE       W3D_Vertex,0
	W3D_FLOAT       w3dv_x
	W3D_FLOAT       w3dv_y
	W3D_DOUBLE      w3dv_z
	W3D_FLOAT       w3dv_w
	W3D_FLOAT       w3dv_u
	W3D_FLOAT       w3dv_v
	W3D_FLOAT       w3dv_tex3d
	STRUCT          w3dv_color,w3dc_Sizeof
	STRUCT          w3dv_colorrgb,w3dcrgb_Sizeof
	W3D_FLOAT       w3dv_l
	LABEL           w3dv_Sizeof
		ENDC



_asm_HW_SetupFlat
		subf    r0,r3,r4
		mtctr   r0
.loop
		lfs     f0,0(r6)
		stfs    f0,w3dv_x(r5)
		lfs     f2,4(r6)
		fsubs   f3,f1,f2
		addi    r6,r6,12
		stfs    f3,w3dv_y(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr

_asm_HW_SetupFlatZ
		subf    r0,r3,r4
		mtctr   r0
.loop
		lfs     f0,0(r6)
		lfs     f5,4(r6)
		stfs    f0,w3dv_x(r5)
		fsubs   f3,f1,f5
		lfs     f4,8(r6)
		addi    r6,r6,12
		stfs    f3,w3dv_y(r5)
		fmuls   f6,f4,f2
		stfd    f6,w3dv_z(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr


_asm_HW_SetupGouraud
		subf    r0,r3,r4
		lwz     r9,0(r8)
		mtctr   r0
		addi    r9,r9,1
		subi    r8,r8,4
.loop
		lfs     f0,0(r6)
		lwzu    r10,4(r8)
		stfs    f0,w3dv_x(r5)
		rlwinm  r11,r10,10,22,29
		cmplw   r10,r9
		lfs     f2,4(r6)
		fsubs   f3,f1,f2
		addi    r6,r6,12
		stfs    f3,w3dv_y(r5)
		beq     .equal
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r9,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr


_asm_HW_SetupGouraudZ
		subf    r0,r3,r4
		lwz     r9,0(r8)
		mtctr   r0
		addi    r9,r9,1
		subi    r8,r8,4
.loop
		lfs     f0,0(r6)
		lwzu    r10,4(r8)
		stfs    f0,w3dv_x(r5)
		lfs     f4,8(r6)
		cmplw   r10,r9
		fmuls   f6,f4,f2
		lfs     f5,4(r6)
		fsubs   f3,f1,f5
		stfd    f6,w3dv_z(r5)
		addi    r6,r6,12
		stfs    f3,w3dv_y(r5)
		beq     .equal
		rlwinm  r11,r10,10,22,29
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r9,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr


_asm_HW_SetupFlatFog
		subf    r0,r3,r4
		ls      f8,fp_2
		mtctr   r0
.loop
		lfs     f13,12(r7)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		fsubs   f3,f1,f5
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f3,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		addi    r7,r7,16
		fmuls   f6,f6,f2
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr


_asm_HW_SetupFlatFogZ
		subf    r0,r3,r4
		ls      f8,fp_2
		mtctr   r0
.loop
		lfs     f13,12(r7)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		lfs     f4,8(r6)
		fsubs   f0,f1,f5
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f0,f4,f2
		fmuls   f6,f6,f7
		addi    r7,r7,16
		fmuls   f6,f6,f3
		stfd    f0,w3dv_z(r5)
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		blr


_asm_HW_SetupGouraudFog
		stw     r31,-32(r1)
		subf    r0,r3,r4
		lwz     r31,0(r8)
		ls      f8,fp_2
		addi    r31,r31,1
		mtctr   r0
		subi    r8,r8,4
.loop
		lfs     f13,12(r9)
		lwzu    r10,4(r8)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		cmplw   r10,r31
		fsubs   f3,f1,f5
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f3,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		addi    r9,r9,16
		fmuls   f6,f6,f2
		beq     .equal
		rlwinm  r11,r10,10,22,29
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r31,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lwz     r31,-32(r1)
		blr


_asm_HW_SetupGouraudFogZ
		stw     r31,-32(r1)
		subf    r0,r3,r4
		lwz     r31,0(r8)
		ls      f8,fp_2
		addi    r31,r31,1
		mtctr   r0
		subi    r8,r8,4
.loop
		lfs     f13,12(r9)
		lwzu    r10,4(r8)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		cmplw   r10,r31
		fsubs   f0,f1,f5
		lfs     f4,8(r6)
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f0,f4,f2
		fmuls   f6,f6,f7
		addi    r9,r9,16
		stfd    f0,w3dv_z(r5)
		fmuls   f6,f6,f3
		beq     .equal
		rlwinm  r11,r10,10,22,29
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r31,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lwz     r31,-32(r1)
		blr


_asm_HW_SetupFlatTex
		subf    r0,r3,r4
		ls      f8,fp_2
		stfd    f31,-8(r1)
		mtctr   r0
		ls      f31,fp_1
.loop
		lfs     f13,12(r7)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		fsubs   f0,f1,f5
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		lfs     f13,0(r8)
		addi    r7,r7,16
		lfs     f0,4(r8)
		fmuls   f6,f6,f2
		lfs     f7,12(r8)
		fmuls   f13,f13,f3
		fcmpu   f7,f31
		addi    r8,r8,16
		fmuls   f0,f0,f4
		beq     .equal
		fmuls   f6,f6,f7
		fres    f7,f7
		fmuls   f13,f13,f7
		fmuls   f0,f0,f7
.equal
		stfs    f13,w3dv_u(r5)
		stfs    f0,w3dv_v(r5)
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lfd     f31,-8(r1)
		blr


_asm_HW_SetupFlatTexZ
		subf    r0,r3,r4
		ls      f8,fp_2
		stfd    f31,-8(r1)
		stfd    f30,-16(r1)
		mtctr   r0
		ls      f31,fp_1
.loop
		lfs     f13,12(r7)
		fmuls   f6,f13,f13
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f30,4(r6)
		fmuls   f6,f6,f7
		fsubs   f0,f1,f30
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f0,8(r6)
		fmuls   f6,f6,f7
		addi    r6,r6,12
		fmuls   f0,f0,f2
		lfs     f13,0(r8)
		stfd    f0,w3dv_z(r5)
		addi    r7,r7,16
		lfs     f0,4(r8)
		fmuls   f6,f6,f3
		lfs     f7,12(r8)
		fmuls   f13,f13,f4
		fcmpu   f7,f31
		addi    r8,r8,16
		fmuls   f0,f0,f5
		beq     .equal
		fmuls   f6,f6,f7
		fres    f7,f7
		fmuls   f13,f13,f7
		fmuls   f0,f0,f7
.equal
		stfs    f13,w3dv_u(r5)
		stfs    f0,w3dv_v(r5)
		stfs    f6,w3dv_w(r5)
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lfd     f30,-16(r1)
		lfd     f31,-8(r1)
		blr


_asm_HW_SetupGouraudTex
		subf    r0,r3,r4
		ls      f8,fp_2
		stfd    f31,-8(r1)
		stw     r31,-32(r1)
		mr      r31,r10
		mtctr   r0
		stw     r30,-36(r1)
		lwz     r30,0(r8)
		ls      f31,fp_1
		addi    r30,r30,1
		subi    r8,r8,4
.loop
		lfs     f13,12(r9)
		fmuls   f6,f13,f13
		lwzu    r10,4(r8)
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f5,4(r6)
		fmuls   f6,f6,f7
		cmplw   cr1,r10,r30
		fsubs   f0,f1,f5
		fnmsubs f7,f6,f13,f8
		addi    r6,r6,12
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		lfs     f13,0(r31)
		addi    r9,r9,16
		lfs     f0,4(r31)
		fmuls   f6,f6,f2
		lfs     f7,12(r31)
		fmuls   f13,f13,f3
		fcmpu   f7,f31
		addi    r31,r31,16
		fmuls   f0,f0,f4
		beq     .equal
		fmuls   f6,f6,f7
		fres    f7,f7
		fmuls   f13,f13,f7
		fmuls   f0,f0,f7
.equal
		stfs    f13,w3dv_u(r5)
		stfs    f0,w3dv_v(r5)
		stfs    f6,w3dv_w(r5)
		beq     cr1,.equal2
		rlwinm  r11,r10,10,22,29
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r30,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal2
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lwz     r30,-36(r1)
		lwz     r31,-32(r1)
		lfd     f31,-8(r1)
		blr


_asm_HW_SetupGouraudTexZ
		subf    r0,r3,r4
		ls      f8,fp_2
		stfd    f31,-8(r1)
		stfd    f30,-16(r1)
		stw     r31,-32(r1)
		mr      r31,r10
		mtctr   r0
		stw     r30,-36(r1)
		lwz     r30,0(r8)
		ls      f31,fp_1
		addi    r30,r30,1
		subi    r8,r8,4
.loop
		lfs     f13,12(r9)
		fmuls   f6,f13,f13
		lwzu    r10,4(r8)
		lfs     f0,0(r6)
		frsqrte f6,f6
		stfs    f0,w3dv_x(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f30,4(r6)
		fmuls   f6,f6,f7
		cmplw   cr1,r10,r30
		fsubs   f0,f1,f30
		fnmsubs f7,f6,f13,f8
		fmuls   f6,f6,f7
		stfs    f0,w3dv_y(r5)
		fnmsubs f7,f6,f13,f8
		lfs     f0,8(r6)
		fmuls   f6,f6,f7
		fmuls   f0,f0,f2
		addi    r6,r6,12
		lfs     f13,0(r31)
		stfd    f0,w3dv_z(r5)
		addi    r9,r9,16
		lfs     f0,4(r31)
		fmuls   f6,f6,f3
		lfs     f7,12(r31)
		fmuls   f13,f13,f4
		fcmpu   f7,f31
		addi    r31,r31,16
		fmuls   f0,f0,f5
		beq     .equal
		fmuls   f6,f6,f7
		fres    f7,f7
		fmuls   f13,f13,f7
		fmuls   f0,f0,f7
.equal
		stfs    f13,w3dv_u(r5)
		stfs    f0,w3dv_v(r5)
		stfs    f6,w3dv_w(r5)
		beq     cr1,.equal2
		rlwinm  r11,r10,10,22,29
		lfsx    f9,r7,r11
		rlwinm  r12,r10,18,22,29
		stfs    f9,w3dv_color+w3dc_r(r5)
		lfsx    f10,r7,r12
		rlwinm  r11,r10,26,22,29
		stfs    f10,w3dv_color+w3dc_g(r5)
		lfsx    f11,r7,r11
		rlwinm  r12,r10,2,22,29
		stfs    f11,w3dv_color+w3dc_b(r5)
		lfsx    f12,r7,r12
		mr      r30,r10
		stfs    f12,w3dv_color+w3dc_a(r5)
		b       .next
.equal2
		stfs    f9,w3dv_color+w3dc_r(r5)
		stfs    f10,w3dv_color+w3dc_g(r5)
		stfs    f11,w3dv_color+w3dc_b(r5)
		stfs    f12,w3dv_color+w3dc_a(r5)
.next
		addi    r5,r5,w3dv_Sizeof
		bdnz    .loop
		lwz     r30,-36(r1)
		lwz     r31,-32(r1)
		lfd     f30,-16(r1)
		lfd     f31,-8(r1)
		blr

		section data
fp_1            dc.s    1
fp_2            dc.s    2
