Max 5 API Reference
00001 /* 00002 00003 jit.op.macros.h 00004 00005 Copyright 2001-2005 - Cycling '74 00006 Joshua Kit Clayton jkc@cycling74.com 00007 00008 C macros useful for jit.op development (see jit.op.simd.h for simd macros) 00009 00010 */ 00011 00012 #ifndef _JIT_OP_MACROS_H_ 00013 #define _JIT_OP_MACROS_H_ 00014 00015 #ifdef WIN32 00016 #define JIT_OP_BINARY_USE_SIMD 0 00017 #define JIT_OP_UNARY_USE_SIMD 0 00018 #else 00019 #define JIT_OP_BINARY_USE_SIMD (_jit_altivec&&(!(((long)ip0)&0x0F))&&(!(((long)ip1)&0x0F))&&(!(((long)op)&0x0F))) 00020 #define JIT_OP_UNARY_USE_SIMD (_jit_altivec&&(!(((long)ip0)&0x0F))&&(!(((long)op)&0x0F))) 00021 #endif 00022 00023 #define JIT_OP_BINARY_IS_PACKED ((is0==1)&&(is1==1)&&(os==1)) 00024 #define JIT_OP_UNARY_IS_PACKED ((is0==1)&&(os==1)) 00025 00026 00027 // ---------------------------------------------------- 00028 // binary op macros 00029 00030 00031 #define JIT_OP_BINARY_PREAMBLE(vtype) \ 00032 vtype *ip0,*ip1,*op; \ 00033 long i,is0,is1,os; \ 00034 vtype sin0,sin1,st0,st1; \ 00035 \ 00036 ip0 = ((vtype *)in0->p); \ 00037 ip1 = ((vtype *)in1->p); \ 00038 op = ((vtype *)out->p); \ 00039 is0 = in0->stride; \ 00040 is1 = in1->stride; \ 00041 os = out->stride; 00042 00043 00044 #define JIT_OP_BINARY_PACKED_WORK_OP(voperator) \ 00045 st0 = voperator (sin0,sin1); \ 00046 00047 00048 #define JIT_OP_BINARY_PACKED_LOOP_GENERIC(vtype,vwork) \ 00049 for (i=0;i<n;i++) { \ 00050 sin0 = ip0[i]; sin1 = ip1[i]; \ 00051 vwork; \ 00052 op[i] = st0; \ 00053 } 00054 00055 00056 #define JIT_OP_BINARY_PACKED_LOOP(vtype,voperator) \ 00057 JIT_OP_BINARY_PACKED_LOOP_GENERIC(vtype,JIT_OP_BINARY_PACKED_WORK_OP(voperator)); 00058 00059 00060 #define JIT_OP_BINARY_WORK_OP(voperator) \ 00061 st0 = voperator (sin0,sin1); \ 00062 00063 00064 #define JIT_OP_BINARY_LOOP_GENERIC(vtype,vwork) \ 00065 for (i=0;i<n;i++) { \ 00066 sin0 = *ip0; sin1 = *ip1; \ 00067 vwork; \ 00068 *op = st0; \ 00069 op += os; ip0 += is0; ip1 += is1; \ 00070 } 00071 00072 00073 #define JIT_OP_BINARY_LOOP(vtype,voperator) \ 00074 JIT_OP_BINARY_LOOP_GENERIC(vtype,JIT_OP_BINARY_WORK_OP(voperator)); 00075 00076 00077 // no SIMD 00078 #define JIT_OP_BINARY_BIG_NO_SIMD(vtype,voperator) \ 00079 JIT_OP_BINARY_PREAMBLE(vtype); \ 00080 if (JIT_OP_BINARY_IS_PACKED) { \ 00081 JIT_OP_BINARY_PACKED_LOOP(vtype,voperator); \ 00082 } else { \ 00083 JIT_OP_BINARY_LOOP(vtype,voperator); \ 00084 } 00085 00086 #define JIT_OP_BINARY_BIG_SIMD_BEGIN(vtype,voperator) \ 00087 JIT_OP_BINARY_PREAMBLE(vtype); \ 00088 if (JIT_OP_BINARY_IS_PACKED) { \ 00089 if (JIT_OP_BINARY_USE_SIMD) { 00090 00091 00092 #define JIT_OP_BINARY_BIG_SIMD_END(vtype,voperator) \ 00093 } else { \ 00094 JIT_OP_BINARY_PACKED_LOOP(vtype,voperator); \ 00095 } \ 00096 } else { \ 00097 JIT_OP_BINARY_LOOP(vtype,voperator); \ 00098 } 00099 00100 00101 // ---------------------------------------------------- 00102 // unary op macros 00103 00104 00105 #define JIT_OP_UNARY_PREAMBLE(vtype) \ 00106 vtype *ip0,*op; \ 00107 long i,is0,os; \ 00108 vtype sin0,st0,st1; \ 00109 \ 00110 ip0 = ((vtype *)in0->p); \ 00111 op = ((vtype *)out->p); \ 00112 is0 = in0->stride; \ 00113 os = out->stride; 00114 00115 00116 #define JIT_OP_UNARY_PACKED_WORK_OP(voperator) \ 00117 st0 = voperator (sin0); 00118 00119 00120 #define JIT_OP_UNARY_PACKED_LOOP_GENERIC(vtype,vwork) \ 00121 for (i=0;i<n;i++) { \ 00122 sin0 = ip0[i]; \ 00123 vwork; \ 00124 op[i] = st0; \ 00125 } 00126 00127 00128 #define JIT_OP_UNARY_PACKED_LOOP(vtype,voperator) \ 00129 JIT_OP_UNARY_PACKED_LOOP_GENERIC(vtype,JIT_OP_UNARY_PACKED_WORK_OP(voperator)); 00130 00131 00132 #define JIT_OP_UNARY_WORK_OP(voperator) \ 00133 st0 = voperator (sin0); \ 00134 00135 00136 #define JIT_OP_UNARY_LOOP_GENERIC(vtype,vwork) \ 00137 for (i=0;i<n;i++) { \ 00138 sin0 = *ip0;\ 00139 vwork; \ 00140 *op = st0; \ 00141 op += os; ip0 += is0; \ 00142 } 00143 00144 00145 #define JIT_OP_UNARY_LOOP(vtype,voperator) \ 00146 JIT_OP_UNARY_LOOP_GENERIC(vtype,JIT_OP_UNARY_WORK_OP(voperator)); 00147 00148 00149 // no SIMD 00150 #define JIT_OP_UNARY_BIG_NO_SIMD(vtype,voperator) \ 00151 JIT_OP_UNARY_PREAMBLE(vtype); \ 00152 if (JIT_OP_UNARY_IS_PACKED) { \ 00153 JIT_OP_UNARY_PACKED_LOOP(vtype,voperator); \ 00154 } else { \ 00155 JIT_OP_UNARY_LOOP(vtype,voperator); \ 00156 } 00157 00158 #define JIT_OP_UNARY_BIG_SIMD_BEGIN(vtype,voperator) \ 00159 JIT_OP_UNARY_PREAMBLE(vtype); \ 00160 if (JIT_OP_UNARY_IS_PACKED) { \ 00161 if (JIT_OP_UNARY_USE_SIMD) { 00162 00163 00164 #define JIT_OP_UNARY_BIG_SIMD_END(vtype,voperator) \ 00165 } else { \ 00166 JIT_OP_UNARY_PACKED_LOOP(vtype,voperator); \ 00167 } \ 00168 } else { \ 00169 JIT_OP_UNARY_LOOP(vtype,voperator); \ 00170 } 00171 00172 #endif //_JIT_OP_MACROS_H_
Copyright © 2008, Cycling '74