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)))
84 extern sint32
__max( sint32, sint32) __attribute__((intrinsic_pseudo(3, "
max") ));
88 extern uint32
__maxs( uint32, uint32) __attribute__((intrinsic_function(0x10b, 0, "max.h") ));
92 extern uint32
__maxu( uint32, uint32) __attribute__((intrinsic_pseudo(3, "max.u") ));
100 #define __saturate(X,Min,Max) ( __minf(__maxf(X, Min), Max) )
102 #define __sqrf(X) ((X) * (X))
103 #define __sqrtf(X) sqrtf(X)
104 #define __checkrange(X,Min,Max) (((X) >= (Min)) && ((X) <= (Max)))
106 #define __roundf(X) ((((X) - (sint32)(X)) > 0.5) ? (1 + (sint32)(X)) : ((sint32)(X)))
107 #define __absf(X) ( ((X) < 0.0) ? -(X) : (X) )
108 #define __minf(X,Y) ( ((X) < (Y)) ? (X) : (Y) )
109 #define __maxf(X,Y) ( ((X) > (Y)) ? (X) : (Y) )
110 #define __saturatef(X,Min,Max) ( __minf(__maxf(X, Min), Max) )
111 #define __checkrangef(X,Min,Max) (((X) >= (Min)) && ((X) <= (Max)))
113 #define __abs_stdreal(X) ( ((X) > 0.0) ? (X) : -(X) )
114 #define __min_stdreal(X,Y) ( ((X) < (Y)) ? (X) : (Y) )
115 #define __max_stdreal(X,Y) ( ((X) > (Y)) ? (X) : (Y) )
116 #define __saturate_stdreal(X,Min,Max) ( __min_stdreal(__max_stdreal(X, Min), Max) )
118 #define __neqf(X,Y) ( ((X) > (Y)) || ((X) < (Y)) )
119 #define __leqf(X,Y) ( !((X) > (Y)) )
120 #define __geqf(X,Y) ( !((X) < (Y)) )
166 dextr %d2, a!H, a!L, 17
171 #ifdef INTRINSIC_WORKAROUND
178 maddrs.q %d2,
a, bU, cU, 1
184 #ifdef INTRINSIC_WORKAROUND
191 madds.q %d2,
a, bU, cU, 1
221 insert %d2, %d0, 0, 0, 0x10
254 % lab L0, L1; reg
a, b
259 dextr %d2, a!H, a!L, b
262 dextr %d2, a!H, a!L, b
269 #ifdef INTRINSIC_WORKAROUND
282 #ifdef INTRINSIC_WORKAROUND
311 extern sint32
__extr( sint32, uint32,
const uint32) __attribute__((intrinsic_function(0x108, 0, "
extr") ));
315 extern uint32
__extru( uint32, uint32, const uint32) __attribute__((intrinsic_function(0x108, 0, "extr.u") ));
319 #define __getbit( address, bitoffset ) __extru( *(address), bitoffset, 1 )
323 extern uint32
__ins( uint32,
const uint32, uint32,
const uint32) __attribute__((intrinsic_function(0x121, 0, "ins.
t") ));
328 extern uint32
__insert( uint32, uint32, uint32, const uint32) __attribute__((intrinsic_function(0x109, 0, "
insert") ));
332 extern uint32
__insn( uint32, const uint32, uint32, const uint32) __attribute__((intrinsic_function(0x121, 0, "insn.t") ));
336 #ifdef INTRINSIC_WORKAROUND
337 extern void __imaskldmst(uint32*
a, sint32 b, sint32 p,
const sint32 w);
339 asm volatile void __imaskldmst(uint32*
a, sint32 b, sint32 p,
const sint32 w)
350 #define __putbit(value,address,bitoffset) __imaskldmst(address,value,bitoffset,1)
362 extern void __bisr(
const uint32) __attribute__((intrinsic_function(0x100, 0, "
bisr") ));
370 #if defined INTRINSIC_WORKAROUND
376 extern void __enable(
void) __attribute__((intrinsic_function(0x103, 0, "
enable") ));
384 extern
void __syscall( const uint32) __attribute__((intrinsic_function(0x100, 0, "
syscall") ));
395 extern
void __cacheawi(
void*) __attribute__((intrinsic_function(0x110, 0, "cachea.
wi") ));
421 % reg buf, bufsize, byteindex
424 extr.u bufsize, bufsize, 0, 16
425 insert bufsize, byteindex, bufsize, 16, 16
433 asm volatile sint32
__mulsc(sint32
a, sint32 b, sint32 offset)
438 dextr %d2, %d3, %d2, offset
443 asm volatile uint32
__rol(uint32 operand, uint32 count)
447 dextr %d2, operand, operand, count
452 asm volatile uint32
__ror(uint32 operand, uint32 count)
457 dextr %d2, operand, operand, count
660 extr %d2, %d2, 16, 16
720 extr %d2, %d2, 16, 16
731 insert %d2, d, c, 16, 16
749 insert %d2,
a, b, 16, 16
769 insert %d2,
a, c, 16, 16
778 insert %d2,
a, b, 16, 16
787 insert %d2,
a, b, 0, 8
796 insert %d2,
a, b, 8, 8
805 insert %d2,
a, b, 16, 8
814 insert %d2,
a, b, 24, 8
823 insert %d2,
a, b, 0, 16
832 insert %d2,
a, b, 16, 16
841 insert %d2,
a, b, 0, 8
850 insert %d2,
a, b, 8, 8
859 insert %d2,
a, b, 16, 8
868 insert %d2,
a, b, 24, 8
877 insert %d2,
a, b, 0, 16
886 insert %d2,
a, b, 16, 16
891 #ifdef INTRINSIC_WORKAROUND
936 insert %d2, %d2, b, 0, 8
947 insert %d2, %d2, b, 8, 8
958 insert %d2, %d2, b, 16, 8
969 insert %d2, %d2, b, 24, 8
980 insert %d2, %d2, b, 0, 16
991 insert %d2, %d2, b, 16, 16
1002 insert %d2, %d2, b, 0, 8
1013 insert %d2, %d2, b, 8, 8
1024 insert %d2, %d2, b, 16, 8
1035 insert %d2, %d2, b, 24, 8
1046 insert %d2, %d2, b, 0, 16
1057 insert %d2, %d2, b, 16, 16
1071 extern sint32
__abs( sint32) __attribute__((intrinsic_pseudo(1, "
abs") ));
1075 extern sint32
__absdif( sint32, sint32) __attribute__((intrinsic_pseudo(1, "
absdif") ));
1079 extern sint32
__abss( sint32) __attribute__((intrinsic_pseudo(1, "
abss") ));
1083 extern sint32
__clo( sint32) __attribute__((intrinsic_pseudo(1, "
clo") ));
1087 extern sint32
__cls( sint32) __attribute__((intrinsic_pseudo(1, "
cls") ));
1091 extern sint32
__clz( sint32) __attribute__((intrinsic_pseudo(1, "
clz") ));
1099 insert %d2, d, 0, 31, 1
1108 insert %d2, f, 0, 31, 1
1113 extern sint32
__mfcr(
const uint32) __attribute__((intrinsic_function(0x101, 0, "
mfcr") ));
1117 extern
void __mtcr( const uint32, sint32) __attribute__((intrinsic_function(0x102, 0, "
mtcr") ));
1173 extern sint32
__adds( sint32, sint32) __attribute__((intrinsic_pseudo(1, "
adds") ));
1214 extern void __debug(
void) __attribute__((intrinsic_function(0x103, 0, "
debug") ));
1218 extern
void __dsync(
void) __attribute__((intrinsic_function(0x103, 0, "
dsync") ));
1222 extern
void __isync(
void) __attribute__((intrinsic_function(0x103, 0, "
isync") ));
1226 #ifdef INTRINSIC_WORKAROUND
1227 #define __ldmst __ldmst_c
1229 asm volatile void __ldmst(
volatile void *address, uint32 mask, uint32 value)
1231 %reg address, mask, value;
1242 extern void __nop(
void) __attribute__((intrinsic_function(0x103, 0, "
nop") ));
1275 extern void __rslcx(
void) __attribute__((intrinsic_function(0x103, 0, "
rslcx") ));
1279 extern
void __svlcx(
void) __attribute__((intrinsic_function(0x103, 0, "
svlcx") ));
1283 #ifdef INTRINSIC_WORKAROUND
1284 extern uint32
__swap(
void* place, uint32 value);
1286 asm volatile uint32
__swap(
void* place, uint32 value)
1296 asm volatile unsigned int __cmpAndSwap(
unsigned int *address,
unsigned long value,
unsigned long CmpVal)
1298 %reg value, address, CmpVal
1302 cmpswap.w %e0, [address]
1310 #define __setareg(areg,val) ___setareg(areg,val)
1312 #define ___setareg(areg,val) \
1313 { __asm ("#$$bp"); \
1314 __asm (" movh.a\t %a15,"#val"@ha\n"); \
1315 __asm (" lea\t %a15,[%a15]"#val"@l\n"); \
1316 __asm (" mov.aa %"#areg", %a15\n"); \