[an error occurred while processing this directive]
|
Взгляните на реализацию memcpy для 64 - прерывания не запрещаются, код к ним толерантный. Вообще-то 64 - серьезный продвиг по сравнению с 62 - казалось бы, изменения в архитектуре невелики, а работает здорово быстрее.
memcpy64.asm/ 1056409758 0 0 0 2988 `
;*****************************************************************************/
;* memcpy64 v4.36 - Memcpy for C6400 */
;* Copyright (c) 1993-2003 Texas Instruments Incorporated */
;*****************************************************************************/
;*
;* void *memcpy(void *restrict dst, const void *restrict src, unsigned int len)
;* {
;* char *restrict s_p = (char *)src;
;* char *restrict d_p = (char *)dst;
;* int loop = len >> 3;
;* int i;
;*
;* if (len & 1) *d_p++ = *s_p++;
;* if (len & 2) { *d_p++ = *s_p++; *d_p++ = *s_p++; }
;* if (len & 4) { _mem4(d_p) = _mem4(s_p); d_p += 4; s_p += 4; }
;* if (loop == 1) _memd8(d_p) = _memd8(s_p);
;*
;* if (loop >= 2)
;* for (i = 0; i < loop; i++, d_p += 8, s_p += 8)
;* _memd8(d_p) = _memd8(s_p);
;*
;* return dst;
;* }
;*
;*****************************************************************************
.if .TMS320C6400
.include "c60asm.i"
.global _memcpy
.text
_memcpy: .asmfunc
AND .D1 0x1,A6,A0
[ A0] LDB .D2T1 *B4++,A3
|| AND .S1 0x2,A6,A1
[ A1] LDB .D2T1 *B4++,A8
[ A1] LDB .D2T1 *B4++,A9
|| SHRU .S2X A6,0x3,B5
|| AND .S1 0x4,A6,A2
[ A2] LDNW .D2T1 *B4++(4),A16
|| SHRU .S2X A6,0x4,B2
|| CMPEQ .L2 0x1,B5,B1
[ B1] LDNDW .D2T1 *B4++(8),A7:A6
|| [!B2] RET .S2 B3
|| MV .D1 A4,A5
|| SUB .L2 B5,2,B0
[ A0] STB .D1T1 A3,*A5++
[ A1] STB .D1T1 A8,*A5++
[ A1] STB .D1T1 A9,*A5++
[ A2] STNW .D1T1 A16,*A5++(4)
[ B1] STNDW .D1T1 A7:A6,*A5++(8)
; RETURN OCCURS
;** -------PROLOG-------------------------------------------------------------*
[ B0] BDEC .S2 LOOP,B0
NOP 1
LDNDW .D2T1 *B4++(8),A7:A6
|| [ B0] BDEC .S2 LOOP,B0
MVK .D1 0x1,A0
;** -------KERNEL-------------------------------------------------------------*
LOOP:
[ B0] BDEC .S2 LOOP,B0
|| LDNDW .D2T1 *B4++(8),A7:A6
[ A0] SUB .S1 A0,1,A0
|| [!A0] STNDW .D1T1 A7:A6,*A5++(8)
;** -------EPILOG-------------------------------------------------------------*
RETNOP .S2 B3, 1
STNDW .D1T1 A7:A6,*A5++(8)
STNDW .D1T1 A7:A6,*A5++(8)
NOP 2
; RETURN OCCURS
.endasmfunc
.endif
E-mail: info@telesys.ru