📄 system_func.asm
字号:
// -------- CACHE 2 INVALIDATE ----------------------------------------------- //// CCAIR2 = 0x00000000;; J0 = 0;; //modified by Frank CCAIR2 = J0;; //modified by Frank CACMD2 = (CACMD_INV | CACMD_NOSTALL | (511 << CACMD_LEN_P));;.align_code 4;_check_invalidate_cache_2: XR0 = CASTAT2;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_invalidate_cache_2 (NP);; _check_invalidate_cache_2.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 4 INVALIDATE ----------------------------------------------- //// CCAIR4 = 0x00000000;; J0 = 0;; //modified by Frank CCAIR4 = J0;; //modified by Frank CACMD4 = (CACMD_INV | CACMD_NOSTALL | (511 << CACMD_LEN_P));;.align_code 4;_check_invalidate_cache_4: XR0 = CASTAT4;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_invalidate_cache_4 (NP);; _check_invalidate_cache_4.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 6 INVALIDATE ----------------------------------------------- //// CCAIR6 = 0x00000000;; J0 = 0;; //modified by Frank CCAIR6 = J0;; //modified by Frank CACMD6 = (CACMD_INV | CACMD_NOSTALL | (511 << CACMD_LEN_P));;.align_code 4;_check_invalidate_cache_6: XR0 = CASTAT6;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_invalidate_cache_6 (NP);; _check_invalidate_cache_6.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 8 INVALIDATE ----------------------------------------------- //// CCAIR8 = 0x00000000;; J0 = 0;; //modified by Frank CCAIR8 = J0;; //modified by Frank CACMD8 = (CACMD_INV | CACMD_NOSTALL | (511 << CACMD_LEN_P));;.align_code 4;_check_invalidate_cache_8: XR0 = CASTAT8;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_invalidate_cache_8 (NP);; _check_invalidate_cache_8.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 10 INVALIDATE ---------------------------------------------- //// CCAIR10 = 0x00000000;; J0 = 0;; //modified by Frank CCAIR10 = J0;; //modified by Frank CACMD10 = (CACMD_INV | CACMD_NOSTALL | (511 << CACMD_LEN_P));;.align_code 4;_check_invalidate_cache_10: XR0 = CASTAT10;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_invalidate_cache_10 (NP);; _check_invalidate_cache_10.end: nop;; nop;; nop;; nop;; nop;; nop;;.align_code 4;_invalidate_cache.end:// ~~~// ~~~ SET REFRESH// ~~~.align_code 4;_set_refresh:// -------- CACHE 0 REFRESH -------------------------------------------------- // CACMD0 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_0: XR0 = CASTAT0;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_0 (NP);; _check_refresh_cache_0.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 2 REFRESH -------------------------------------------------- // CACMD2 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_2: XR0 = CASTAT2;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_2 (NP);; _check_refresh_cache_2.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 4 REFRESH -------------------------------------------------- // CACMD4 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_4: XR0 = CASTAT4;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_4 (NP);; _check_refresh_cache_4.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 6 REFRESH -------------------------------------------------- // CACMD6 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_6: XR0 = CASTAT6;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_6 (NP);; _check_refresh_cache_6.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 8 REFRESH -------------------------------------------------- // CACMD8 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_8: XR0 = CASTAT8;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_8 (NP);; _check_refresh_cache_8.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 10 REFRESH ------------------------------------------------- // CACMD10 = (CACMD_REFRESH | REFRESH_RATE);;.align_code 4;_check_refresh_cache_10: XR0 = CASTAT10;; XBITEST R0 BY CASTAT_COM_ACTIVE_P;; IF NXSEQ, JUMP _check_refresh_cache_10 (NP);; _check_refresh_cache_10.end: nop;; nop;; nop;; nop;; nop;; nop;;.align_code 4;_set_refresh.end:// ~~~// ~~~ RE-ENABLE CACHE// ~~~.align_code 4;_cache_reenable:// -------- CACHE 0 RE-ENABLE ------------------------------------------------ // CACMD0 = CACMD_EN;;.align_code 4;_check_reenable_cache_0: XR0 = CASTAT0;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_0 (NP);; _check_reenable_cache_0.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 2 RE-ENABLE ------------------------------------------------ // CACMD2 = CACMD_EN;;.align_code 4;_check_reenable_cache_2: XR0 = CASTAT2;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_2 (NP);; _check_reenable_cache_2.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 4 RE-ENABLE ------------------------------------------------ // CACMD4 = CACMD_EN;;.align_code 4;_check_reenable_cache_4: XR0 = CASTAT4;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_4 (NP);; _check_reenable_cache_4.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 6 RE-ENABLE ------------------------------------------------ // CACMD6 = CACMD_EN;;.align_code 4;_check_reenable_cache_6: XR0 = CASTAT6;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_6 (NP);; _check_reenable_cache_6.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 8 RE-ENABLE ------------------------------------------------ // CACMD8 = CACMD_EN;;.align_code 4;_check_reenable_cache_8: XR0 = CASTAT8;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_8 (NP);; _check_reenable_cache_8.end: nop;; nop;; nop;; nop;; nop;; nop;;// -------- CACHE 10 RE-ENABLE ----------------------------------------------- // CACMD10 = CACMD_EN;;.align_code 4;_check_reenable_cache_10: XR0 = CASTAT10;; XBITEST R0 BY CASTAT_ENBL_P;; IF XSEQ, JUMP _check_reenable_cache_10 (NP);; _check_reenable_cache_10.end: nop;; nop;; nop;; nop;; nop;; nop;;.align_code 4;_cache_reenable.end://// -------- BTB ENABLE ------------------------------------------------------- //.align_code 4;_check_btb_enable: XR0 = SQSTAT;; XR0 = SQSTAT;; XBITEST R0 BY SQSTAT_BTBEN_P;; IF NXSEQ, JUMP _check_btb_enable.end (NP);; nop;; nop;; nop;; nop;; nop;; nop;; BTBEN;;.align_code 4;_check_btb_enable.end: // ~~~// ~~~ EPILOGUE RESTORES CJMP, "PRESERVED" REGISTERS, AND FRAME AND STACK POINTER// ~~~ CJMP = [J26 + 64];; YR27:24 = q[K27 + 16]; XR27:24 = q[J27 + 24];; YR31:28 = q[K27 + 12]; XR31:28 = q[J27 + 20];; K19:16 = q[K27 + 8 ]; J19:16 = q[J27 + 16];; K23:20 = q[K27 + 4 ]; J23:20 = q[J27 + 12];; cjmp (ABS); J27:24=q[J26+68]; K27:24=q[K26+68]; nop;;.align_code 4;_system_func.end: // << END FUNCTION << //// << << //// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ///* fft32.asm July 2004 PM This is assembly routine for the Complex radix-2 C-callable FFT on TigerSHARC family of DSPs only. It elaborates on complex only inputs. The real case has been excluded I. Description of Calling. 1. Inputs: j4 -> input (ping-pong buffer 1) j5 -> ping-pong buffer 1 j6 -> ping-pong buffer 2 j7 -> output //j27+0x18 -> N = Number of points 2. C-Calling Example: fft32(&(input), &(ping_pong_buffer1), &(ping_pong_buffer2), &(output), N); 3. Limitations: a. All buffers must be aligned on memory boundary which is a multiple of 4. b. N must be between 32 and MAX_FFT_SIZE. c. If memory space savings are required and input does not have to be preserved, ping_pong_buffer1 can be the same buffer as input. d. If memory space savings are required, output can be the same buffer as ping_pong_buffer2 if the number of FFT stages is even (i.e. Log2(N) is even) or the same as ping_pong_buffer1 if the number of FFT stages is odd (i.e. Log2(N) is odd). 4. MAX_FFT_SIZE can be selected via #define. Larger values allow for more choices of N, but its twiddles will occupy more memory. 5. This C - callable function can process up to 64K blocks of data on TS201 (16K blocks on TS101) because C environment itself necessitates memory. Therefore, if more input points are necessary, assembly language development may become a must. On TS201, a block of memory is 128K words long, so maximum N is 64K complex points. TS101 contains only 2 blocks of data memory of 64K words and 4 buffers must be accommodated. Therefore, maximum N is 16K complex words. II. Description of the FFT algorithm. 1. The input data is treated as complex interleaved N-point. 2. Due to re-ordering, no stage can be done in-place. 3. The bit reversal and the first two stages are combined into a single loop. This loop takes data from input and stores it in the ping-pong buffer1. 4. Each subsequent stage ping-pongs the data between the two ping-pong buffers. The last stage uses FFT output buffer for its output. 5. Although the FFT is designed to be called with any point size N <= MAX_FFT_SIZE by subsampling the twiddle factors, for ADSP-TS20x processors, the best cycle optimization is achieved when MAX_FFT_SIZE=N. For ADSP-TS101 all choices of MAX_FFT_SIZE are equally optimal. III.For all additional details regarding this algorithm and code, see EE-218 application note, available from the ADI web site. *///************************************ Includes **********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -