/*
 * SPARC assembly matrix code.
 */

#ifndef _SPARC_MATRIX_H
#define _SPARC_MATRIX_H

#ifdef __arch64__
#define LDPTR		ldx
#define MAT_M		0x00
#define MAT_INV		0x08
#define V4F_DATA	0x00
#define V4F_START	0x08
#define V4F_COUNT	0x10
#define V4F_STRIDE	0x14
#define V4F_SIZE	0x18
#define V4F_FLAGS	0x1c
#else
#define LDPTR		ld
#define MAT_M		0x00
#define MAT_INV		0x04
#define V4F_DATA	0x00
#define V4F_START	0x04
#define V4F_COUNT	0x08
#define V4F_STRIDE	0x0c
#define V4F_SIZE	0x10
#define V4F_FLAGS	0x14
#endif

#define VEC_SIZE_1   	1
#define VEC_SIZE_2   	3
#define VEC_SIZE_3   	7
#define VEC_SIZE_4   	15

#define M0		%f16
#define M1		%f17
#define M2		%f18
#define M3		%f19
#define M4		%f20
#define M5		%f21
#define M6		%f22
#define M7		%f23
#define M8		%f24
#define M9		%f25
#define M10		%f26
#define M11		%f27
#define M12		%f28
#define M13		%f29
#define M14		%f30
#define M15		%f31

#define LDMATRIX_0_1_2_3_12_13_14_15(BASE)	\
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ldd	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_1_12_13(BASE)		\
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + (12 * 0x4)], M12

#define LDMATRIX_0_12_13(BASE)			\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + (12 * 0x4)], M12

#define LDMATRIX_0_1_2_12_13_14(BASE)		\
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_12_13_14(BASE)		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_14(BASE)			\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_1_2_3_4_5_6_7_12_13_14_15(BASE) \
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ldd	[BASE + ( 6 * 0x4)], M6;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ldd	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_5_12_13(BASE) 		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ldd	[BASE + (12 * 0x4)], M12

#define LDMATRIX_0_1_2_3_4_5_6_12_13_14(BASE)	\
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ld	[BASE + ( 6 * 0x4)], M6;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_5_12_13_14(BASE)		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_5_14(BASE)			\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15(BASE) \
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ldd	[BASE + ( 6 * 0x4)], M6;	\
	ldd	[BASE + ( 8 * 0x4)], M8;	\
	ldd	[BASE + (10 * 0x4)], M10;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ldd	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_1_4_5_12_13(BASE) 		\
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ldd	[BASE + (12 * 0x4)], M12

#define LDMATRIX_0_5_12_13(BASE) 		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ldd	[BASE + (12 * 0x4)], M12

#define LDMATRIX_0_1_2_4_5_6_8_9_10(BASE) \
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ld	[BASE + ( 6 * 0x4)], M6;	\
	ldd	[BASE + ( 8 * 0x4)], M8;	\
	ld	[BASE + (10 * 0x4)], M10

#define LDMATRIX_0_1_2_4_5_6_8_9_10_12_13_14(BASE) \
	ldd	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 2 * 0x4)], M2;	\
	ldd	[BASE + ( 4 * 0x4)], M4;	\
	ld	[BASE + ( 6 * 0x4)], M6;	\
	ldd	[BASE + ( 8 * 0x4)], M8;	\
	ld	[BASE + (10 * 0x4)], M10;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_5_10(BASE) 			\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ld	[BASE + (10 * 0x4)], M10;

#define LDMATRIX_0_5_10_12_13_14(BASE) 		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ld	[BASE + (10 * 0x4)], M10;	\
	ldd	[BASE + (12 * 0x4)], M12;	\
	ld	[BASE + (14 * 0x4)], M14

#define LDMATRIX_0_5_8_9_10_14(BASE) 		\
	ld	[BASE + ( 0 * 0x4)], M0;	\
	ld	[BASE + ( 5 * 0x4)], M5;	\
	ldd	[BASE + ( 8 * 0x4)], M8;	\
	ld	[BASE + (10 * 0x4)], M10;	\
	ld	[BASE + (14 * 0x4)], M14

#endif /* !(_SPARC_MATRIX_H) */