; File TI_compiler_test.sa

		.text
;		.clink

			.global $bss
			.global coeff
			.global data_samples
			.global filter_output

TI_compiler_test:	.proc Rtmp11:Rtmp10

		.no_mdep

		.option O

;		Registers for pointers, counters, and conditionals
		.reg	data_ptr
		.reg	coeff_ptr
		.reg	output_ptr
		.reg	cnt

;		Registers for SP input, outputs, and totals
		.reg	Rout1		; Clipped output signal from one filter

;		Registers for delayed samples of DP data
		.reg	wn01:wn00
		.reg	wn11:wn10
		.reg	wn21:wn20

;		Registers for DP float control parameters
		.reg	Rb11:Rb10		;
		.reg	Rb21:Rb20		;
		.reg	Ra01:Ra00		;

;		Registers for temporary double precision results
;		.reg	Rtmp11:Rtmp10
		.reg	Rtmp21:Rtmp20
		.reg	Rtmp31:Rtmp30

;			Initialize pointers and registers
			MVKL		coeff,			coeff_ptr
			MVKH		coeff,			coeff_ptr
			MVKL		data_samples,	data_ptr
			MVKH		data_samples,	data_ptr
			MVKL		filter_output,	output_ptr
			MVKH		filter_output,	output_ptr
			MVK			200,			cnt

Loop1:		.trip		10,	200

;			********************************
;			This loop implements one filter per cycle of the loop

			.mptr 	data_ptr, 			D,		16
			.mptr	coeff_ptr,			D,		24
			.mptr	output_ptr,			D,		4

;			Load the delayed double precision data
			LDDW		*data_ptr++,	wn21:wn20						; Delayed DP data
			LDDW		*data_ptr--,	wn11:wn10						; Delayed DP data

;			Load filter coefficients
			LDDW		*coeff_ptr++,	Rb21:Rb20						; Filter coefficients
			LDDW		*coeff_ptr++,	Rb11:Rb10						; Filter coefficients
			LDDW		*coeff_ptr++,	Ra01:Ra00						; Filter coefficients

;			Do the filter math
;			wn0 =		Ri + Rb1*wn1 + Rb2*wn2
;			Rout1 =		Ra0*(wn0-wn2)
			MPYDP		Rb21:Rb20,		wn21:wn20,		Rtmp31:Rtmp30
			MPYDP		Rb11:Rb10,		wn11:wn10,		Rtmp21:Rtmp20
			ADDDP		Rtmp21:Rtmp20,	Rtmp31:Rtmp30,	Rtmp31:Rtmp30
			SUBDP		Rtmp11:Rtmp10,	Rtmp31:Rtmp30,	wn01:wn00
			SUBDP		wn01:wn00,		wn21:wn20,		Rtmp31:Rtmp30
			MPYDP		Ra01:Ra00,		Rtmp31:Rtmp30,	Rtmp31:Rtmp30

;			Store the delayed double precision data
			STDW		wn11:wn10,		*data_ptr++
			STDW		wn01:wn00,		*data_ptr++

;			Convert output to single precision
			DPSP		Rtmp31:Rtmp30,	Rout1

			STW			Rout1,	*output_ptr++		; Output the result of this filter section

	[cnt]	SUB			cnt,	1,	  cnt			; Decrement loop counter
	[cnt]	B			Loop1						; Loop back

	.endproc
