15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_CASTPACK_H__ 16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_CASTPACK_H__ 28 #include <boost/type_traits/is_same.hpp> 29 #include <boost/type_traits/is_signed.hpp> 38 template <
typename TIn,
typename TOut>
40 typename boost::enable_if_c<sizeof(TIn)==1 && sizeof(TOut)==1>::type>
72 template <
typename TIn,
typename TOut>
74 typename boost::enable_if_c<sizeof(TIn)==2 && sizeof(TOut)==2>::type>
110 template <
typename TIn,
typename TOut>
112 typename boost::enable_if_c<sizeof(TIn)==4 && sizeof(TOut)==4>::type>
156 template <
typename TIn,
typename TOut>
158 typename boost::enable_if_c<sizeof(TIn)==8 && sizeof(TOut)==8>::type>
218 template <
typename TIn,
typename TOut>
220 typename boost::enable_if_c<sizeof(TIn)==1 && sizeof(TOut)==2>::type>
222 static IPSDK_FORCEINLINE
241 template <
typename TIn,
typename TOut>
243 typename boost::enable_if_c<sizeof(TIn)==2 && sizeof(TOut)==4>::type>
245 static IPSDK_FORCEINLINE
266 template <
typename TIn,
typename TOut>
268 typename boost::enable_if_c<sizeof(TIn)==1 && sizeof(TOut)==4>::type>
270 static IPSDK_FORCEINLINE
292 in._val[0], in16._val[0], in16._val[1]);
295 in16._val[0], out._val[0], out._val[1]);
297 in16._val[1], out._val[2], out._val[3]);
301 template <
typename TIn,
typename TOut>
303 typename boost::enable_if_c<sizeof(TIn)==4 && sizeof(TOut)==8>::type>
305 static IPSDK_FORCEINLINE
311 Cast::act(in._val[0], out._val[0], out._val[1]);
312 Cast::act(in._val[1], out._val[2], out._val[3]);
313 Cast::act(in._val[2], out._val[4], out._val[5]);
314 Cast::act(in._val[3], out._val[6], out._val[7]);
325 Cast::act(in._val[0], out._val[0], out._val[1]);
326 Cast::act(in._val[1], out._val[2], out._val[3]);
327 Cast::act(in._val[2], out._val[4], out._val[5]);
328 Cast::act(in._val[3], out._val[6], out._val[7]);
332 template <
typename TIn,
typename TOut>
334 typename boost::enable_if_c<sizeof(TIn) <= 2 && sizeof(TOut)==8>::type>
336 static IPSDK_FORCEINLINE
352 CastPack<eInstructionSet::eIS_Sse2, TIn, ipInt32>::act(in, packInt32);
353 CastPack<eInstructionSet::eIS_Sse2, ipInt32, TOut>::act(packInt32, out);
357 template <
typename TIn,
typename TOut>
359 typename boost::enable_if_c<sizeof(TIn)==2 && sizeof(TOut)==1>::type>
361 static IPSDK_FORCEINLINE
362 BasePack<ePackType::ePT_Sse, TOut>
363 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
365 BasePack<ePackType::ePT_Sse, TOut> out;
366 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
367 in._val[0], in._val[1], out._val[0]);
374 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
375 BasePack<ePackType::ePT_Sse, TOut>& out)
377 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
378 in._val[0], in._val[1], out._val[0]);
382 template <
typename TIn,
typename TOut>
384 typename boost::enable_if_c<sizeof(TIn)==4 && sizeof(TOut)==2>::type>
386 static IPSDK_FORCEINLINE
387 BasePack<ePackType::ePT_Sse, TOut>
388 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
390 BasePack<ePackType::ePT_Sse, TOut> out;
391 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
392 in._val[0], in._val[1], out._val[0]);
393 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
394 in._val[2], in._val[3], out._val[1]);
401 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
402 BasePack<ePackType::ePT_Sse, TOut>& out)
404 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
405 in._val[0], in._val[1], out._val[0]);
406 CastReg<eInstructionSet::eIS_Sse2, TIn, TOut>::act(
407 in._val[2], in._val[3], out._val[1]);
411 template <
typename TIn,
typename TOut>
413 typename boost::enable_if_c<sizeof(TIn)==4 && sizeof(TOut)==1>::type>
415 static IPSDK_FORCEINLINE
416 BasePack<ePackType::ePT_Sse, TOut>
417 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
419 typedef typename UpperType<TOut>::Type T16;
420 BasePack<ePackType::ePT_Sse, T16> in16;
421 CastPack<eInstructionSet::eIS_Sse2, TIn, T16>::act(in, in16);
422 BasePack<ePackType::ePT_Sse, TOut> out;
423 CastReg<eInstructionSet::eIS_Sse2, T16, TOut>::act(
424 in16._val[0], in16._val[1], out._val[0]);
431 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
432 BasePack<ePackType::ePT_Sse, TOut>& out)
434 typedef typename UpperType<TOut>::Type T16;
435 BasePack<ePackType::ePT_Sse, T16> in16;
436 CastPack<eInstructionSet::eIS_Sse2, TIn, T16>::act(in, in16);
437 CastReg<eInstructionSet::eIS_Sse2, T16, TOut>::act(
438 in16._val[0], in16._val[1], out._val[0]);
467 static IPSDK_FORCEINLINE
468 BasePack<ePackType::ePT_Sse, ipReal32>
469 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in)
471 BasePack<ePackType::ePT_Sse, ipReal32> out;
472 typedef CastReg<eInstructionSet::eIS_Sse2, ipReal64, ipReal32> Cast;
474 Cast::act(in._val[0], in._val[1], out._val[0]);
475 Cast::act(in._val[2], in._val[3], out._val[1]);
476 Cast::act(in._val[4], in._val[5], out._val[2]);
477 Cast::act(in._val[6], in._val[7], out._val[3]);
484 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in,
485 BasePack<ePackType::ePT_Sse, ipReal32>& out)
487 typedef CastReg<eInstructionSet::eIS_Sse2, ipReal64, ipReal32> Cast;
488 Cast::act(in._val[0], in._val[1], out._val[0]);
489 Cast::act(in._val[2], in._val[3], out._val[1]);
490 Cast::act(in._val[4], in._val[5], out._val[2]);
491 Cast::act(in._val[6], in._val[7], out._val[3]);
495 template <
typename TOut>
497 typename boost::enable_if_c<
499 boost::is_integral<TOut>::value
503 static IPSDK_FORCEINLINE
504 BasePack<ePackType::ePT_Sse, TOut>
505 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in)
507 BasePack<ePackType::ePT_Sse, TOut> out;
508 typedef CastReg<eInstructionSet::eIS_Sse2, ipReal64, TOut> Cast;
510 Cast::act(in._val[0], in._val[1], out._val[0]);
511 Cast::act(in._val[2], in._val[3], out._val[1]);
512 Cast::act(in._val[4], in._val[5], out._val[2]);
513 Cast::act(in._val[6], in._val[7], out._val[3]);
520 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in,
521 BasePack<ePackType::ePT_Sse, TOut>& out)
523 typedef CastReg<eInstructionSet::eIS_Sse2, ipReal64, TOut> Cast;
524 Cast::act(in._val[0], in._val[1], out._val[0]);
525 Cast::act(in._val[2], in._val[3], out._val[1]);
526 Cast::act(in._val[4], in._val[5], out._val[2]);
527 Cast::act(in._val[6], in._val[7], out._val[3]);
531 template <
typename TOut>
533 typename boost::enable_if_c<
535 boost::is_integral<TOut>::value
539 static IPSDK_FORCEINLINE
540 BasePack<ePackType::ePT_Sse, TOut>
541 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in)
543 BasePack<ePackType::ePT_Sse, TOut> out;
544 BasePack<ePackType::ePT_Sse, ipInt32> inInt32;
546 CastPack<eInstructionSet::eIS_Sse2, ipReal64, ipInt32>::act(in, inInt32);
547 CastPack<eInstructionSet::eIS_Sse2, ipInt32, TOut>::act(inInt32, out);
554 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in,
555 BasePack<ePackType::ePT_Sse, TOut>& out)
557 BasePack<ePackType::ePT_Sse, ipInt32> inInt32;
559 CastPack<eInstructionSet::eIS_Sse2, ipReal64, ipInt32>::act(in, inInt32);
560 CastPack<eInstructionSet::eIS_Sse2, ipInt32, TOut>::act(inInt32, out);
571 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_CASTPACK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: CastPack.h:33
structure containing set of masks for vectorized operations
Definition: BaseMaskPackDecl.h:29
BaseMaskPack class; defines a set of masks; the number of masks in this set depends on the type of th...
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
utility functions for array operations
BasePack class; defines a set of scalars (for instruction set "standard") or registers (for all other...
template structures used for immediate type promotion
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
template structure UpperType<typename T>; its typedef Type gives the type just upper to T...
Definition: UpperType.h:42
function assigning a given value of type T to a given Pack<instructionSet, T>
Definition of import/export macro for library.
Streaming SIMD Extensions 2.
Definition: InstructionSetTypes.h:36
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29