26 #ifndef IFXCPU_INTRINSICSDCC_H
27 #define IFXCPU_INTRINSICSDCC_H
64 #define __minX(X,Y) ( ((X) < (Y)) ? (X) : (Y) )
65 #define __maxX(X,Y) ( ((X) > (Y)) ? (X) : (Y) )
66 #define __saturateX(X,Min,Max) ( __minX(__maxX(X, Min), Max) )
67 #define __checkrangeX(X,Min,Max) (((X) >= (Min)) && ((X) <= (Max)))
83 extern sint32
__max( sint32, sint32) __attribute__((intrinsic_pseudo(3, "
max") ));
87 extern uint32
__maxs( uint32, uint32) __attribute__((intrinsic_function(0x10b, 0, "max.h") ));
91 extern uint32
__maxu( uint32, uint32) __attribute__((intrinsic_pseudo(3, "max.u") ));
99 #define __saturate(X,Min,Max) ( __minf(__maxf(X, Min), Max) )
101 #define __sqrf(X) ((X) * (X))
102 #define __sqrtf(X) sqrtf(X)
103 #define __checkrange(X,Min,Max) (((X) >= (Min)) && ((X) <= (Max)))
105 #define __roundf(X) ((((X) - (sint32)(X)) > 0.5) ? (1 + (sint32)(X)) : ((sint32)(X)))
106 #define __absf(X) ( ((X) < 0.0) ? -(X) : (X) )
107 #define __minf(X,Y) ( ((X) < (Y)) ? (X) : (Y) )
108 #define __maxf(X,Y) ( ((X) > (Y)) ? (X) : (Y) )
109 #define __saturatef(X,Min,Max) ( __minf(__maxf(X, Min), Max) )
110 #define __checkrangef(X,Min,Max) (((X) >= (Min)) && ((X) <= (Max)))
112 #define __abs_stdreal(X) ( ((X) > 0.0) ? (X) : -(X) )
113 #define __min_stdreal(X,Y) ( ((X) < (Y)) ? (X) : (Y) )
114 #define __max_stdreal(X,Y) ( ((X) > (Y)) ? (X) : (Y) )
115 #define __saturate_stdreal(X,Min,Max) ( __min_stdreal(__max_stdreal(X, Min), Max) )
117 #define __neqf(X,Y) ( ((X) > (Y)) || ((X) < (Y)) )
118 #define __leqf(X,Y) ( !((X) > (Y)) )
119 #define __geqf(X,Y) ( !((X) < (Y)) )
165 dextr %d2, a!H, a!L, 17
170 #ifdef INTRINSIC_WORKAROUND
177 maddrs.q %d2, a, bU, cU, 1
183 #ifdef INTRINSIC_WORKAROUND
190 madds.q %d2, a, bU, cU, 1
220 insert %d2, %d0, 0, 0, 0x10
253 % lab L0, L1; reg a, b
258 dextr %d2, a!H, a!L, b
261 dextr %d2, a!H, a!L, b
268 #ifdef INTRINSIC_WORKAROUND
281 #ifdef INTRINSIC_WORKAROUND
310 extern sint32
__extr( sint32, uint32,
const uint32) __attribute__((intrinsic_function(0x108, 0, "
extr") ));
314 extern uint32
__extru( uint32, uint32, const uint32) __attribute__((intrinsic_function(0x108, 0, "extr.u") ));
318 #define __getbit( address, bitoffset ) __extru( *(address), bitoffset, 1 )
322 extern uint32
__ins( uint32,
const uint32, uint32,
const uint32) __attribute__((intrinsic_function(0x121, 0, "ins.
t") ));
327 extern uint32
__insert( uint32, uint32, uint32, const uint32) __attribute__((intrinsic_function(0x109, 0, "
insert") ));
331 extern uint32
__insn( uint32, const uint32, uint32, const uint32) __attribute__((intrinsic_function(0x121, 0, "insn.t") ));
335 #ifdef INTRINSIC_WORKAROUND
336 extern void __imaskldmst(uint32* a, sint32 b, sint32 p,
const sint32 w);
338 asm volatile void __imaskldmst(uint32* a, sint32 b, sint32 p,
const sint32 w)
349 #define __putbit(value,address,bitoffset) __imaskldmst(address,value,bitoffset,1)
361 extern void __bisr(
const uint32) __attribute__((intrinsic_function(0x100, 0, "
bisr") ));
369 #if defined INTRINSIC_WORKAROUND
375 extern void __enable(
void) __attribute__((intrinsic_function(0x103, 0, "
enable") ));
383 extern
void __syscall( const uint32) __attribute__((intrinsic_function(0x100, 0, "
syscall") ));
394 extern
void __cacheawi(
void*) __attribute__((intrinsic_function(0x110, 0, "cachea.
wi") ));
420 % reg buf, bufsize, byteindex
423 extr.u bufsize, bufsize, 0, 16
424 insert bufsize, byteindex, bufsize, 16, 16
432 asm volatile sint32
__mulsc(sint32 a, sint32 b, sint32 offset)
437 dextr %d2, %d3, %d2, offset
442 asm volatile uint32
__rol(uint32 operand, uint32 count)
446 dextr %d2, operand, operand, count
451 asm volatile uint32
__ror(uint32 operand, uint32 count)
456 dextr %d2, operand, operand, count
659 extr %d2, %d2, 16, 16
719 extr %d2, %d2, 16, 16
730 insert %d2, d, c, 16, 16
748 insert %d2, a, b, 16, 16
768 insert %d2, a, c, 16, 16
777 insert %d2, a, b, 16, 16
786 insert %d2, a, b, 0, 8
795 insert %d2, a, b, 8, 8
804 insert %d2, a, b, 16, 8
813 insert %d2, a, b, 24, 8
822 insert %d2, a, b, 0, 16
831 insert %d2, a, b, 16, 16
840 insert %d2, a, b, 0, 8
849 insert %d2, a, b, 8, 8
858 insert %d2, a, b, 16, 8
867 insert %d2, a, b, 24, 8
876 insert %d2, a, b, 0, 16
885 insert %d2, a, b, 16, 16
890 #ifdef INTRINSIC_WORKAROUND
935 insert %d2, %d2, b, 0, 8
946 insert %d2, %d2, b, 8, 8
957 insert %d2, %d2, b, 16, 8
968 insert %d2, %d2, b, 24, 8
979 insert %d2, %d2, b, 0, 16
990 insert %d2, %d2, b, 16, 16
1001 insert %d2, %d2, b, 0, 8
1012 insert %d2, %d2, b, 8, 8
1023 insert %d2, %d2, b, 16, 8
1034 insert %d2, %d2, b, 24, 8
1045 insert %d2, %d2, b, 0, 16
1056 insert %d2, %d2, b, 16, 16
1070 extern sint32
__abs( sint32) __attribute__((intrinsic_pseudo(1, "
abs") ));
1074 extern sint32
__absdif( sint32, sint32) __attribute__((intrinsic_pseudo(1, "
absdif") ));
1078 extern sint32
__abss( sint32) __attribute__((intrinsic_pseudo(1, "
abss") ));
1082 extern sint32
__clo( sint32) __attribute__((intrinsic_pseudo(1, "
clo") ));
1086 extern sint32
__cls( sint32) __attribute__((intrinsic_pseudo(1, "
cls") ));
1090 extern sint32
__clz( sint32) __attribute__((intrinsic_pseudo(1, "
clz") ));
1098 insert %d2, d, 0, 31, 1
1107 insert %d2, f, 0, 31, 1
1112 extern sint32
__mfcr(
const uint32) __attribute__((intrinsic_function(0x101, 0, "
mfcr") ));
1116 extern
void __mtcr( const uint32, sint32) __attribute__((intrinsic_function(0x102, 0, "
mtcr") ));
1172 extern sint32
__adds( sint32, sint32) __attribute__((intrinsic_pseudo(1, "
adds") ));
1185 asm volatile sint32
__subs(sint32 a, sint32 b)
1213 extern void __debug(
void) __attribute__((intrinsic_function(0x103, 0, "
debug") ));
1217 extern
void __dsync(
void) __attribute__((intrinsic_function(0x103, 0, "
dsync") ));
1221 extern
void __isync(
void) __attribute__((intrinsic_function(0x103, 0, "
isync") ));
1225 #ifdef INTRINSIC_WORKAROUND
1226 #define __ldmst __ldmst_c
1228 asm volatile void __ldmst(
volatile void *address, uint32 mask, uint32 value)
1230 %reg address, mask, value;
1241 extern void __nop(
void) __attribute__((intrinsic_function(0x103, 0, "
nop") ));
1274 extern void __rslcx(
void) __attribute__((intrinsic_function(0x103, 0, "
rslcx") ));
1278 extern
void __svlcx(
void) __attribute__((intrinsic_function(0x103, 0, "
svlcx") ));
1282 #ifdef INTRINSIC_WORKAROUND
1283 extern uint32
__swap(
void* place, uint32 value);
1285 asm volatile uint32
__swap(
void* place, uint32 value)
1295 asm volatile unsigned int __cmpAndSwap(
unsigned int *address,
unsigned long value,
unsigned long CmpVal)
1297 %reg value, address, CmpVal
1301 cmpswap.w %e0, [address]
1309 #define __setareg(areg,val) ___setareg(areg,val)
1311 #define ___setareg(areg,val) \
1312 { __asm ("#$$bp"); \
1313 __asm (" movh.a\t %a15,"#val"@ha\n"); \
1314 __asm (" lea\t %a15,[%a15]"#val"@l\n"); \
1315 __asm (" mov.aa %"#areg", %a15\n"); \
1342 q31tof %d2, value, shift
1355 mov.aa %a10, stackAddr