85 static char NumBits[32] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5};
89 int nArgsNew, nEvals, i, k;
98 return Ivy_Oper( pArgsInit[0], pArgsInit[1], Type );
103 for ( i = 0; i < nArgs; i++ )
105 pArgs[i] = pArgsInit[i];
107 pEva->Mask = (1 << i);
110 pEva->
Level = Ivy_Regular(pArgs[i])->Level;
118 for ( i = 1; i < nArgsNew; i++ )
119 for ( k = 0; k < i; k++ )
122 pEva = pEvals + nArgsNew;
123 pEva->Mask = pEvals[k].Mask | pEvals[i].Mask;
124 pEva->Weight = NumBits[pEva->Mask];
125 pEva->Cost = pEvals[k].Cost + pEvals[i].Cost + NumBits[pEvals[k].Mask & pEvals[i].Mask];
126 pEva->Level = 1 +
IVY_MAX(pEvals[k].Level, pEvals[i].Level);
131 if ( pEvaBest->Weight < pEva->Weight ||
132 pEvaBest->Weight == pEva->Weight && pEvaBest->Cost > pEva->Cost ||
133 pEvaBest->Weight == pEva->Weight && pEvaBest->Cost == pEva->Cost && pEvaBest->Level > pEva->Level )
136 pArgs[nArgsNew++] = pTemp;
137 if ( nArgsNew == 15 )
145 if ( nArgsNew == nArgs )
147 Ivy_MultiSort( pArgs, nArgs );
151 if ( nArgsNew == nArgs + 1 )
153 assert( pEvaBest - pEvals == nArgs );
155 for ( i = 0; i < nArgs; i++ )
156 if ( i != (
int)pEvaBest->Fan0 && i != (
int)pEvaBest->Fan1 )
157 pArgs[k++] = pArgs[i];
158 pArgs[k++] = pArgs[nArgs];
161 Ivy_MultiSort( pArgs, nArgs );
165 if ( (
int)pEvaBest->Mask == ((1 << nArgs) - 1) )
166 return Ivy_MultiBuild_rec( pEvals, pEvaBest - pEvals, pArgs, nArgsNew, Type );
170 for ( i = 1; i < nArgsNew; i++ )
171 for ( k = 0; k < i; k++ )
173 pEva = pEvals + nEvals;
174 pEva->Mask = pEvals[k].Mask | pEvals[i].Mask;
175 pEva->Weight = NumBits[pEva->Mask];
176 pEva->Cost = pEvals[k].Cost + pEvals[i].Cost + NumBits[pEvals[k].Mask & pEvals[i].Mask];
177 pEva->Level = 1 +
IVY_MAX(pEvals[k].Level, pEvals[i].Level);
181 if ( pEvaBest->Weight < pEva->Weight ||
182 pEvaBest->Weight == pEva->Weight && pEvaBest->Cost > pEva->Cost ||
183 pEvaBest->Weight == pEva->Weight && pEvaBest->Cost == pEva->Cost && pEvaBest->Level > pEva->Level )
188 assert( pEvaBest - pEvals >= nArgsNew );
193 pTemp = Ivy_MultiBuild_rec( pEvals, pEvaBest - pEvals, pArgs, nArgsNew, Type );
197 for ( i = 0; i < nArgs; i++ )
198 if ( (pEvaBest->Mask & (1 << i)) == 0 )
199 pArgs[k++] = pArgs[i];
201 assert( k == nArgs - (
int)pEvaBest->Weight + 1 );
203 Ivy_MultiSort( pArgs, nArgs );
366 int i, k, m, nArgsNew, Counter = 0;
379 for ( i = 0; i < nArgs; i++ )
380 if ( Ivy_ObjRefs( Ivy_Regular(pArgs[i]) ) > 0 )
381 pArgsRef[nArgsNew++] = pArgs[i];
385 for ( i = 0; i < nArgsNew; i++ )
386 for ( k = i + 1; k < nArgsNew; k++ )
393 for ( i = 0; i < nArgsNew; i++ )
394 for ( k = i + 1; k < nArgsNew; k++ )
398 for ( m = 0; m < nArgs; m++ )
399 if ( pArgs[m] != pArgsRef[i] && pArgs[m] != pArgsRef[k] )
400 pArgs[nArgsNew++] = pArgs[m];
401 pArgs[nArgsNew++] = pTemp;
402 assert( nArgsNew == nArgs - 1 );