12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465 |
- /*===---- smmintrin.h - SSE4 intrinsics ------------------------------------===
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- *===-----------------------------------------------------------------------===
- */
- #ifndef _SMMINTRIN_H
- #define _SMMINTRIN_H
- #include <tmmintrin.h>
- /* Define the default attributes for the functions in this file. */
- #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.1")))
- /* SSE4 Rounding macros. */
- #define _MM_FROUND_TO_NEAREST_INT 0x00
- #define _MM_FROUND_TO_NEG_INF 0x01
- #define _MM_FROUND_TO_POS_INF 0x02
- #define _MM_FROUND_TO_ZERO 0x03
- #define _MM_FROUND_CUR_DIRECTION 0x04
- #define _MM_FROUND_RAISE_EXC 0x00
- #define _MM_FROUND_NO_EXC 0x08
- #define _MM_FROUND_NINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEAREST_INT)
- #define _MM_FROUND_FLOOR (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEG_INF)
- #define _MM_FROUND_CEIL (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_POS_INF)
- #define _MM_FROUND_TRUNC (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_ZERO)
- #define _MM_FROUND_RINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_CUR_DIRECTION)
- #define _MM_FROUND_NEARBYINT (_MM_FROUND_NO_EXC | _MM_FROUND_CUR_DIRECTION)
- /// \brief Rounds up each element of the 128-bit vector of [4 x float] to an
- /// integer and returns the rounded values in a 128-bit vector of
- /// [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_ceil_ps(__m128 X);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float] values to be rounded up.
- /// \returns A 128-bit vector of [4 x float] containing the rounded values.
- #define _mm_ceil_ps(X) _mm_round_ps((X), _MM_FROUND_CEIL)
- /// \brief Rounds up each element of the 128-bit vector of [2 x double] to an
- /// integer and returns the rounded values in a 128-bit vector of
- /// [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_ceil_pd(__m128d X);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double] values to be rounded up.
- /// \returns A 128-bit vector of [2 x double] containing the rounded values.
- #define _mm_ceil_pd(X) _mm_round_pd((X), _MM_FROUND_CEIL)
- /// \brief Copies three upper elements of the first 128-bit vector operand to
- /// the corresponding three upper elements of the 128-bit result vector of
- /// [4 x float]. Rounds up the lowest element of the second 128-bit vector
- /// operand to an integer and copies it to the lowest element of the 128-bit
- /// result vector of [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_ceil_ss(__m128 X, __m128 Y);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
- /// rounded up to the nearest integer and copied to the corresponding bits
- /// of the result.
- /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
- /// values.
- #define _mm_ceil_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_CEIL)
- /// \brief Copies the upper element of the first 128-bit vector operand to the
- /// corresponding upper element of the 128-bit result vector of [2 x double].
- /// Rounds up the lower element of the second 128-bit vector operand to an
- /// integer and copies it to the lower element of the 128-bit result vector
- /// of [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_ceil_sd(__m128d X, __m128d Y);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
- /// rounded up to the nearest integer and copied to the corresponding bits
- /// of the result.
- /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
- /// values.
- #define _mm_ceil_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_CEIL)
- /// \brief Rounds down each element of the 128-bit vector of [4 x float] to an
- /// an integer and returns the rounded values in a 128-bit vector of
- /// [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_floor_ps(__m128 X);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float] values to be rounded down.
- /// \returns A 128-bit vector of [4 x float] containing the rounded values.
- #define _mm_floor_ps(X) _mm_round_ps((X), _MM_FROUND_FLOOR)
- /// \brief Rounds down each element of the 128-bit vector of [2 x double] to an
- /// integer and returns the rounded values in a 128-bit vector of
- /// [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_floor_pd(__m128d X);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double].
- /// \returns A 128-bit vector of [2 x double] containing the rounded values.
- #define _mm_floor_pd(X) _mm_round_pd((X), _MM_FROUND_FLOOR)
- /// \brief Copies three upper elements of the first 128-bit vector operand to
- /// the corresponding three upper elements of the 128-bit result vector of
- /// [4 x float]. Rounds down the lowest element of the second 128-bit vector
- /// operand to an integer and copies it to the lowest element of the 128-bit
- /// result vector of [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_floor_ss(__m128 X, __m128 Y);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
- /// rounded down to the nearest integer and copied to the corresponding bits
- /// of the result.
- /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
- /// values.
- #define _mm_floor_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_FLOOR)
- /// \brief Copies the upper element of the first 128-bit vector operand to the
- /// corresponding upper element of the 128-bit result vector of [2 x double].
- /// Rounds down the lower element of the second 128-bit vector operand to an
- /// integer and copies it to the lower element of the 128-bit result vector
- /// of [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_floor_sd(__m128d X, __m128d Y);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
- /// rounded down to the nearest integer and copied to the corresponding bits
- /// of the result.
- /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
- /// values.
- #define _mm_floor_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_FLOOR)
- /// \brief Rounds each element of the 128-bit vector of [4 x float] to an
- /// integer value according to the rounding control specified by the second
- /// argument and returns the rounded values in a 128-bit vector of
- /// [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_round_ps(__m128 X, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float].
- /// \param M
- /// An integer value that specifies the rounding operation. \n
- /// Bits [7:4] are reserved. \n
- /// Bit [3] is a precision exception value: \n
- /// 0: A normal PE exception is used \n
- /// 1: The PE field is not updated \n
- /// Bit [2] is the rounding control source: \n
- /// 0: Use bits [1:0] of \a M \n
- /// 1: Use the current MXCSR setting \n
- /// Bits [1:0] contain the rounding control definition: \n
- /// 00: Nearest \n
- /// 01: Downward (toward negative infinity) \n
- /// 10: Upward (toward positive infinity) \n
- /// 11: Truncated
- /// \returns A 128-bit vector of [4 x float] containing the rounded values.
- #define _mm_round_ps(X, M) __extension__ ({ \
- (__m128)__builtin_ia32_roundps((__v4sf)(__m128)(X), (M)); })
- /// \brief Copies three upper elements of the first 128-bit vector operand to
- /// the corresponding three upper elements of the 128-bit result vector of
- /// [4 x float]. Rounds the lowest element of the second 128-bit vector
- /// operand to an integer value according to the rounding control specified
- /// by the third argument and copies it to the lowest element of the 128-bit
- /// result vector of [4 x float].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_round_ss(__m128 X, __m128 Y, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
- /// rounded to the nearest integer using the specified rounding control and
- /// copied to the corresponding bits of the result.
- /// \param M
- /// An integer value that specifies the rounding operation. \n
- /// Bits [7:4] are reserved. \n
- /// Bit [3] is a precision exception value: \n
- /// 0: A normal PE exception is used \n
- /// 1: The PE field is not updated \n
- /// Bit [2] is the rounding control source: \n
- /// 0: Use bits [1:0] of \a M \n
- /// 1: Use the current MXCSR setting \n
- /// Bits [1:0] contain the rounding control definition: \n
- /// 00: Nearest \n
- /// 01: Downward (toward negative infinity) \n
- /// 10: Upward (toward positive infinity) \n
- /// 11: Truncated
- /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
- /// values.
- #define _mm_round_ss(X, Y, M) __extension__ ({ \
- (__m128)__builtin_ia32_roundss((__v4sf)(__m128)(X), \
- (__v4sf)(__m128)(Y), (M)); })
- /// \brief Rounds each element of the 128-bit vector of [2 x double] to an
- /// integer value according to the rounding control specified by the second
- /// argument and returns the rounded values in a 128-bit vector of
- /// [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_round_pd(__m128d X, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double].
- /// \param M
- /// An integer value that specifies the rounding operation. \n
- /// Bits [7:4] are reserved. \n
- /// Bit [3] is a precision exception value: \n
- /// 0: A normal PE exception is used \n
- /// 1: The PE field is not updated \n
- /// Bit [2] is the rounding control source: \n
- /// 0: Use bits [1:0] of \a M \n
- /// 1: Use the current MXCSR setting \n
- /// Bits [1:0] contain the rounding control definition: \n
- /// 00: Nearest \n
- /// 01: Downward (toward negative infinity) \n
- /// 10: Upward (toward positive infinity) \n
- /// 11: Truncated
- /// \returns A 128-bit vector of [2 x double] containing the rounded values.
- #define _mm_round_pd(X, M) __extension__ ({ \
- (__m128d)__builtin_ia32_roundpd((__v2df)(__m128d)(X), (M)); })
- /// \brief Copies the upper element of the first 128-bit vector operand to the
- /// corresponding upper element of the 128-bit result vector of [2 x double].
- /// Rounds the lower element of the second 128-bit vector operand to an
- /// integer value according to the rounding control specified by the third
- /// argument and copies it to the lower element of the 128-bit result vector
- /// of [2 x double].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_round_sd(__m128d X, __m128d Y, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
- /// copied to the corresponding bits of the result.
- /// \param Y
- /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
- /// rounded to the nearest integer using the specified rounding control and
- /// copied to the corresponding bits of the result.
- /// \param M
- /// An integer value that specifies the rounding operation. \n
- /// Bits [7:4] are reserved. \n
- /// Bit [3] is a precision exception value: \n
- /// 0: A normal PE exception is used \n
- /// 1: The PE field is not updated \n
- /// Bit [2] is the rounding control source: \n
- /// 0: Use bits [1:0] of \a M \n
- /// 1: Use the current MXCSR setting \n
- /// Bits [1:0] contain the rounding control definition: \n
- /// 00: Nearest \n
- /// 01: Downward (toward negative infinity) \n
- /// 10: Upward (toward positive infinity) \n
- /// 11: Truncated
- /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
- /// values.
- #define _mm_round_sd(X, Y, M) __extension__ ({ \
- (__m128d)__builtin_ia32_roundsd((__v2df)(__m128d)(X), \
- (__v2df)(__m128d)(Y), (M)); })
- /* SSE4 Packed Blending Intrinsics. */
- /// \brief Returns a 128-bit vector of [2 x double] where the values are
- /// selected from either the first or second operand as specified by the
- /// third operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_blend_pd(__m128d V1, __m128d V2, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VBLENDPD / BLENDPD </c> instruction.
- ///
- /// \param V1
- /// A 128-bit vector of [2 x double].
- /// \param V2
- /// A 128-bit vector of [2 x double].
- /// \param M
- /// An immediate integer operand, with mask bits [1:0] specifying how the
- /// values are to be copied. The position of the mask bit corresponds to the
- /// index of a copied value. When a mask bit is 0, the corresponding 64-bit
- /// element in operand \a V1 is copied to the same position in the result.
- /// When a mask bit is 1, the corresponding 64-bit element in operand \a V2
- /// is copied to the same position in the result.
- /// \returns A 128-bit vector of [2 x double] containing the copied values.
- #define _mm_blend_pd(V1, V2, M) __extension__ ({ \
- (__m128d)__builtin_shufflevector((__v2df)(__m128d)(V1), \
- (__v2df)(__m128d)(V2), \
- (((M) & 0x01) ? 2 : 0), \
- (((M) & 0x02) ? 3 : 1)); })
- /// \brief Returns a 128-bit vector of [4 x float] where the values are selected
- /// from either the first or second operand as specified by the third
- /// operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_blend_ps(__m128 V1, __m128 V2, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VBLENDPS / BLENDPS </c> instruction.
- ///
- /// \param V1
- /// A 128-bit vector of [4 x float].
- /// \param V2
- /// A 128-bit vector of [4 x float].
- /// \param M
- /// An immediate integer operand, with mask bits [3:0] specifying how the
- /// values are to be copied. The position of the mask bit corresponds to the
- /// index of a copied value. When a mask bit is 0, the corresponding 32-bit
- /// element in operand \a V1 is copied to the same position in the result.
- /// When a mask bit is 1, the corresponding 32-bit element in operand \a V2
- /// is copied to the same position in the result.
- /// \returns A 128-bit vector of [4 x float] containing the copied values.
- #define _mm_blend_ps(V1, V2, M) __extension__ ({ \
- (__m128)__builtin_shufflevector((__v4sf)(__m128)(V1), (__v4sf)(__m128)(V2), \
- (((M) & 0x01) ? 4 : 0), \
- (((M) & 0x02) ? 5 : 1), \
- (((M) & 0x04) ? 6 : 2), \
- (((M) & 0x08) ? 7 : 3)); })
- /// \brief Returns a 128-bit vector of [2 x double] where the values are
- /// selected from either the first or second operand as specified by the
- /// third operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VBLENDVPD / BLENDVPD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [2 x double].
- /// \param __V2
- /// A 128-bit vector of [2 x double].
- /// \param __M
- /// A 128-bit vector operand, with mask bits 127 and 63 specifying how the
- /// values are to be copied. The position of the mask bit corresponds to the
- /// most significant bit of a copied value. When a mask bit is 0, the
- /// corresponding 64-bit element in operand \a __V1 is copied to the same
- /// position in the result. When a mask bit is 1, the corresponding 64-bit
- /// element in operand \a __V2 is copied to the same position in the result.
- /// \returns A 128-bit vector of [2 x double] containing the copied values.
- static __inline__ __m128d __DEFAULT_FN_ATTRS
- _mm_blendv_pd (__m128d __V1, __m128d __V2, __m128d __M)
- {
- return (__m128d) __builtin_ia32_blendvpd ((__v2df)__V1, (__v2df)__V2,
- (__v2df)__M);
- }
- /// \brief Returns a 128-bit vector of [4 x float] where the values are
- /// selected from either the first or second operand as specified by the
- /// third operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VBLENDVPS / BLENDVPS </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x float].
- /// \param __V2
- /// A 128-bit vector of [4 x float].
- /// \param __M
- /// A 128-bit vector operand, with mask bits 127, 95, 63, and 31 specifying
- /// how the values are to be copied. The position of the mask bit corresponds
- /// to the most significant bit of a copied value. When a mask bit is 0, the
- /// corresponding 32-bit element in operand \a __V1 is copied to the same
- /// position in the result. When a mask bit is 1, the corresponding 32-bit
- /// element in operand \a __V2 is copied to the same position in the result.
- /// \returns A 128-bit vector of [4 x float] containing the copied values.
- static __inline__ __m128 __DEFAULT_FN_ATTRS
- _mm_blendv_ps (__m128 __V1, __m128 __V2, __m128 __M)
- {
- return (__m128) __builtin_ia32_blendvps ((__v4sf)__V1, (__v4sf)__V2,
- (__v4sf)__M);
- }
- /// \brief Returns a 128-bit vector of [16 x i8] where the values are selected
- /// from either of the first or second operand as specified by the third
- /// operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPBLENDVB / PBLENDVB </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [16 x i8].
- /// \param __V2
- /// A 128-bit vector of [16 x i8].
- /// \param __M
- /// A 128-bit vector operand, with mask bits 127, 119, 111 ... 7 specifying
- /// how the values are to be copied. The position of the mask bit corresponds
- /// to the most significant bit of a copied value. When a mask bit is 0, the
- /// corresponding 8-bit element in operand \a __V1 is copied to the same
- /// position in the result. When a mask bit is 1, the corresponding 8-bit
- /// element in operand \a __V2 is copied to the same position in the result.
- /// \returns A 128-bit vector of [16 x i8] containing the copied values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_blendv_epi8 (__m128i __V1, __m128i __V2, __m128i __M)
- {
- return (__m128i) __builtin_ia32_pblendvb128 ((__v16qi)__V1, (__v16qi)__V2,
- (__v16qi)__M);
- }
- /// \brief Returns a 128-bit vector of [8 x i16] where the values are selected
- /// from either of the first or second operand as specified by the third
- /// operand, the control mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_blend_epi16(__m128i V1, __m128i V2, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPBLENDW / PBLENDW </c> instruction.
- ///
- /// \param V1
- /// A 128-bit vector of [8 x i16].
- /// \param V2
- /// A 128-bit vector of [8 x i16].
- /// \param M
- /// An immediate integer operand, with mask bits [7:0] specifying how the
- /// values are to be copied. The position of the mask bit corresponds to the
- /// index of a copied value. When a mask bit is 0, the corresponding 16-bit
- /// element in operand \a V1 is copied to the same position in the result.
- /// When a mask bit is 1, the corresponding 16-bit element in operand \a V2
- /// is copied to the same position in the result.
- /// \returns A 128-bit vector of [8 x i16] containing the copied values.
- #define _mm_blend_epi16(V1, V2, M) __extension__ ({ \
- (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(V1), \
- (__v8hi)(__m128i)(V2), \
- (((M) & 0x01) ? 8 : 0), \
- (((M) & 0x02) ? 9 : 1), \
- (((M) & 0x04) ? 10 : 2), \
- (((M) & 0x08) ? 11 : 3), \
- (((M) & 0x10) ? 12 : 4), \
- (((M) & 0x20) ? 13 : 5), \
- (((M) & 0x40) ? 14 : 6), \
- (((M) & 0x80) ? 15 : 7)); })
- /* SSE4 Dword Multiply Instructions. */
- /// \brief Multiples corresponding elements of two 128-bit vectors of [4 x i32]
- /// and returns the lower 32 bits of the each product in a 128-bit vector of
- /// [4 x i32].
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMULLD / PMULLD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit integer vector.
- /// \param __V2
- /// A 128-bit integer vector.
- /// \returns A 128-bit integer vector containing the products of both operands.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_mullo_epi32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) ((__v4su)__V1 * (__v4su)__V2);
- }
- /// \brief Multiplies corresponding even-indexed elements of two 128-bit
- /// vectors of [4 x i32] and returns a 128-bit vector of [2 x i64]
- /// containing the products.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMULDQ / PMULDQ </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x i32].
- /// \param __V2
- /// A 128-bit vector of [4 x i32].
- /// \returns A 128-bit vector of [2 x i64] containing the products of both
- /// operands.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_mul_epi32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pmuldq128 ((__v4si)__V1, (__v4si)__V2);
- }
- /* SSE4 Floating Point Dot Product Instructions. */
- /// \brief Computes the dot product of the two 128-bit vectors of [4 x float]
- /// and returns it in the elements of the 128-bit result vector of
- /// [4 x float].
- ///
- /// The immediate integer operand controls which input elements
- /// will contribute to the dot product, and where the final results are
- /// returned.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_dp_ps(__m128 X, __m128 Y, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VDPPS / DPPS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float].
- /// \param Y
- /// A 128-bit vector of [4 x float].
- /// \param M
- /// An immediate integer operand. Mask bits [7:4] determine which elements
- /// of the input vectors are used, with bit [4] corresponding to the lowest
- /// element and bit [7] corresponding to the highest element of each [4 x
- /// float] vector. If a bit is set, the corresponding elements from the two
- /// input vectors are used as an input for dot product; otherwise that input
- /// is treated as zero. Bits [3:0] determine which elements of the result
- /// will receive a copy of the final dot product, with bit [0] corresponding
- /// to the lowest element and bit [3] corresponding to the highest element of
- /// each [4 x float] subvector. If a bit is set, the dot product is returned
- /// in the corresponding element; otherwise that element is set to zero.
- /// \returns A 128-bit vector of [4 x float] containing the dot product.
- #define _mm_dp_ps(X, Y, M) __extension__ ({ \
- (__m128) __builtin_ia32_dpps((__v4sf)(__m128)(X), \
- (__v4sf)(__m128)(Y), (M)); })
- /// \brief Computes the dot product of the two 128-bit vectors of [2 x double]
- /// and returns it in the elements of the 128-bit result vector of
- /// [2 x double].
- ///
- /// The immediate integer operand controls which input
- /// elements will contribute to the dot product, and where the final results
- /// are returned.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128d _mm_dp_pd(__m128d X, __m128d Y, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VDPPD / DPPD </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [2 x double].
- /// \param Y
- /// A 128-bit vector of [2 x double].
- /// \param M
- /// An immediate integer operand. Mask bits [5:4] determine which elements
- /// of the input vectors are used, with bit [4] corresponding to the lowest
- /// element and bit [5] corresponding to the highest element of each of [2 x
- /// double] vector. If a bit is set, the corresponding elements from the two
- /// input vectors are used as an input for dot product; otherwise that input
- /// is treated as zero. Bits [1:0] determine which elements of the result
- /// will receive a copy of the final dot product, with bit [0] corresponding
- /// to the lowest element and bit [1] corresponding to the highest element of
- /// each [2 x double] vector. If a bit is set, the dot product is returned in
- /// the corresponding element; otherwise that element is set to zero.
- #define _mm_dp_pd(X, Y, M) __extension__ ({\
- (__m128d) __builtin_ia32_dppd((__v2df)(__m128d)(X), \
- (__v2df)(__m128d)(Y), (M)); })
- /* SSE4 Streaming Load Hint Instruction. */
- /// \brief Loads integer values from a 128-bit aligned memory location to a
- /// 128-bit integer vector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VMOVNTDQA / MOVNTDQA </c> instruction.
- ///
- /// \param __V
- /// A pointer to a 128-bit aligned memory location that contains the integer
- /// values.
- /// \returns A 128-bit integer vector containing the data stored at the
- /// specified memory location.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_stream_load_si128 (__m128i const *__V)
- {
- return (__m128i) __builtin_nontemporal_load ((const __v2di *) __V);
- }
- /* SSE4 Packed Integer Min/Max Instructions. */
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [16 x i8] and returns a 128-bit vector of [16 x i8] containing the lesser
- /// of the two values.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMINSB / PMINSB </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [16 x i8].
- /// \param __V2
- /// A 128-bit vector of [16 x i8]
- /// \returns A 128-bit vector of [16 x i8] containing the lesser values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_min_epi8 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pminsb128 ((__v16qi) __V1, (__v16qi) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [16 x i8] and returns a 128-bit vector of [16 x i8] containing the
- /// greater value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMAXSB / PMAXSB </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [16 x i8].
- /// \param __V2
- /// A 128-bit vector of [16 x i8].
- /// \returns A 128-bit vector of [16 x i8] containing the greater values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_max_epi8 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pmaxsb128 ((__v16qi) __V1, (__v16qi) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [8 x u16] and returns a 128-bit vector of [8 x u16] containing the lesser
- /// value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMINUW / PMINUW </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [8 x u16].
- /// \param __V2
- /// A 128-bit vector of [8 x u16].
- /// \returns A 128-bit vector of [8 x u16] containing the lesser values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_min_epu16 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pminuw128 ((__v8hi) __V1, (__v8hi) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [8 x u16] and returns a 128-bit vector of [8 x u16] containing the
- /// greater value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMAXUW / PMAXUW </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [8 x u16].
- /// \param __V2
- /// A 128-bit vector of [8 x u16].
- /// \returns A 128-bit vector of [8 x u16] containing the greater values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_max_epu16 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pmaxuw128 ((__v8hi) __V1, (__v8hi) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [4 x i32] and returns a 128-bit vector of [4 x i32] containing the lesser
- /// value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMINSD / PMINSD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x i32].
- /// \param __V2
- /// A 128-bit vector of [4 x i32].
- /// \returns A 128-bit vector of [4 x i32] containing the lesser values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_min_epi32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pminsd128 ((__v4si) __V1, (__v4si) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [4 x i32] and returns a 128-bit vector of [4 x i32] containing the
- /// greater value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMAXSD / PMAXSD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x i32].
- /// \param __V2
- /// A 128-bit vector of [4 x i32].
- /// \returns A 128-bit vector of [4 x i32] containing the greater values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_max_epi32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pmaxsd128 ((__v4si) __V1, (__v4si) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [4 x u32] and returns a 128-bit vector of [4 x u32] containing the lesser
- /// value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMINUD / PMINUD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x u32].
- /// \param __V2
- /// A 128-bit vector of [4 x u32].
- /// \returns A 128-bit vector of [4 x u32] containing the lesser values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_min_epu32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pminud128((__v4si) __V1, (__v4si) __V2);
- }
- /// \brief Compares the corresponding elements of two 128-bit vectors of
- /// [4 x u32] and returns a 128-bit vector of [4 x u32] containing the
- /// greater value of the two.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMAXUD / PMAXUD </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x u32].
- /// \param __V2
- /// A 128-bit vector of [4 x u32].
- /// \returns A 128-bit vector of [4 x u32] containing the greater values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_max_epu32 (__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_pmaxud128((__v4si) __V1, (__v4si) __V2);
- }
- /* SSE4 Insertion and Extraction from XMM Register Instructions. */
- /// \brief Takes the first argument \a X and inserts an element from the second
- /// argument \a Y as selected by the third argument \a N. That result then
- /// has elements zeroed out also as selected by the third argument \a N. The
- /// resulting 128-bit vector of [4 x float] is then returned.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128 _mm_insert_ps(__m128 X, __m128 Y, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VINSERTPS </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector source operand of [4 x float]. With the exception of
- /// those bits in the result copied from parameter \a Y and zeroed by bits
- /// [3:0] of \a N, all bits from this parameter are copied to the result.
- /// \param Y
- /// A 128-bit vector source operand of [4 x float]. One single-precision
- /// floating-point element from this source, as determined by the immediate
- /// parameter, is copied to the result.
- /// \param N
- /// Specifies which bits from operand \a Y will be copied, which bits in the
- /// result they will be be copied to, and which bits in the result will be
- /// cleared. The following assignments are made: \n
- /// Bits [7:6] specify the bits to copy from operand \a Y: \n
- /// 00: Selects bits [31:0] from operand \a Y. \n
- /// 01: Selects bits [63:32] from operand \a Y. \n
- /// 10: Selects bits [95:64] from operand \a Y. \n
- /// 11: Selects bits [127:96] from operand \a Y. \n
- /// Bits [5:4] specify the bits in the result to which the selected bits
- /// from operand \a Y are copied: \n
- /// 00: Copies the selected bits from \a Y to result bits [31:0]. \n
- /// 01: Copies the selected bits from \a Y to result bits [63:32]. \n
- /// 10: Copies the selected bits from \a Y to result bits [95:64]. \n
- /// 11: Copies the selected bits from \a Y to result bits [127:96]. \n
- /// Bits[3:0]: If any of these bits are set, the corresponding result
- /// element is cleared.
- /// \returns A 128-bit vector of [4 x float] containing the copied
- /// single-precision floating point elements from the operands.
- #define _mm_insert_ps(X, Y, N) __builtin_ia32_insertps128((X), (Y), (N))
- /// \brief Extracts a 32-bit integer from a 128-bit vector of [4 x float] and
- /// returns it, using the immediate value parameter \a N as a selector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_extract_ps(__m128 X, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VEXTRACTPS / EXTRACTPS </c>
- /// instruction.
- ///
- /// \param X
- /// A 128-bit vector of [4 x float].
- /// \param N
- /// An immediate value. Bits [1:0] determines which bits from the argument
- /// \a X are extracted and returned: \n
- /// 00: Bits [31:0] of parameter \a X are returned. \n
- /// 01: Bits [63:32] of parameter \a X are returned. \n
- /// 10: Bits [95:64] of parameter \a X are returned. \n
- /// 11: Bits [127:96] of parameter \a X are returned.
- /// \returns A 32-bit integer containing the extracted 32 bits of float data.
- #define _mm_extract_ps(X, N) (__extension__ \
- ({ union { int __i; float __f; } __t; \
- __v4sf __a = (__v4sf)(__m128)(X); \
- __t.__f = __a[(N) & 3]; \
- __t.__i;}))
- /* Miscellaneous insert and extract macros. */
- /* Extract a single-precision float from X at index N into D. */
- #define _MM_EXTRACT_FLOAT(D, X, N) (__extension__ ({ __v4sf __a = (__v4sf)(X); \
- (D) = __a[N]; }))
- /* Or together 2 sets of indexes (X and Y) with the zeroing bits (Z) to create
- an index suitable for _mm_insert_ps. */
- #define _MM_MK_INSERTPS_NDX(X, Y, Z) (((X) << 6) | ((Y) << 4) | (Z))
- /* Extract a float from X at index N into the first index of the return. */
- #define _MM_PICK_OUT_PS(X, N) _mm_insert_ps (_mm_setzero_ps(), (X), \
- _MM_MK_INSERTPS_NDX((N), 0, 0x0e))
- /* Insert int into packed integer array at index. */
- /// \brief Constructs a 128-bit vector of [16 x i8] by first making a copy of
- /// the 128-bit integer vector parameter, and then inserting the lower 8 bits
- /// of an integer parameter \a I into an offset specified by the immediate
- /// value parameter \a N.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_insert_epi8(__m128i X, int I, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPINSRB / PINSRB </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector of [16 x i8]. This vector is copied to the
- /// result and then one of the sixteen elements in the result vector is
- /// replaced by the lower 8 bits of \a I.
- /// \param I
- /// An integer. The lower 8 bits of this operand are written to the result
- /// beginning at the offset specified by \a N.
- /// \param N
- /// An immediate value. Bits [3:0] specify the bit offset in the result at
- /// which the lower 8 bits of \a I are written. \n
- /// 0000: Bits [7:0] of the result are used for insertion. \n
- /// 0001: Bits [15:8] of the result are used for insertion. \n
- /// 0010: Bits [23:16] of the result are used for insertion. \n
- /// 0011: Bits [31:24] of the result are used for insertion. \n
- /// 0100: Bits [39:32] of the result are used for insertion. \n
- /// 0101: Bits [47:40] of the result are used for insertion. \n
- /// 0110: Bits [55:48] of the result are used for insertion. \n
- /// 0111: Bits [63:56] of the result are used for insertion. \n
- /// 1000: Bits [71:64] of the result are used for insertion. \n
- /// 1001: Bits [79:72] of the result are used for insertion. \n
- /// 1010: Bits [87:80] of the result are used for insertion. \n
- /// 1011: Bits [95:88] of the result are used for insertion. \n
- /// 1100: Bits [103:96] of the result are used for insertion. \n
- /// 1101: Bits [111:104] of the result are used for insertion. \n
- /// 1110: Bits [119:112] of the result are used for insertion. \n
- /// 1111: Bits [127:120] of the result are used for insertion.
- /// \returns A 128-bit integer vector containing the constructed values.
- #define _mm_insert_epi8(X, I, N) (__extension__ \
- ({ __v16qi __a = (__v16qi)(__m128i)(X); \
- __a[(N) & 15] = (I); \
- (__m128i)__a;}))
- /// \brief Constructs a 128-bit vector of [4 x i32] by first making a copy of
- /// the 128-bit integer vector parameter, and then inserting the 32-bit
- /// integer parameter \a I at the offset specified by the immediate value
- /// parameter \a N.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_insert_epi32(__m128i X, int I, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPINSRD / PINSRD </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector of [4 x i32]. This vector is copied to the
- /// result and then one of the four elements in the result vector is
- /// replaced by \a I.
- /// \param I
- /// A 32-bit integer that is written to the result beginning at the offset
- /// specified by \a N.
- /// \param N
- /// An immediate value. Bits [1:0] specify the bit offset in the result at
- /// which the integer \a I is written. \n
- /// 00: Bits [31:0] of the result are used for insertion. \n
- /// 01: Bits [63:32] of the result are used for insertion. \n
- /// 10: Bits [95:64] of the result are used for insertion. \n
- /// 11: Bits [127:96] of the result are used for insertion.
- /// \returns A 128-bit integer vector containing the constructed values.
- #define _mm_insert_epi32(X, I, N) (__extension__ \
- ({ __v4si __a = (__v4si)(__m128i)(X); \
- __a[(N) & 3] = (I); \
- (__m128i)__a;}))
- #ifdef __x86_64__
- /// \brief Constructs a 128-bit vector of [2 x i64] by first making a copy of
- /// the 128-bit integer vector parameter, and then inserting the 64-bit
- /// integer parameter \a I, using the immediate value parameter \a N as an
- /// insertion location selector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_insert_epi64(__m128i X, long long I, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPINSRQ / PINSRQ </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector of [2 x i64]. This vector is copied to the
- /// result and then one of the two elements in the result vector is replaced
- /// by \a I.
- /// \param I
- /// A 64-bit integer that is written to the result beginning at the offset
- /// specified by \a N.
- /// \param N
- /// An immediate value. Bit [0] specifies the bit offset in the result at
- /// which the integer \a I is written. \n
- /// 0: Bits [63:0] of the result are used for insertion. \n
- /// 1: Bits [127:64] of the result are used for insertion. \n
- /// \returns A 128-bit integer vector containing the constructed values.
- #define _mm_insert_epi64(X, I, N) (__extension__ \
- ({ __v2di __a = (__v2di)(__m128i)(X); \
- __a[(N) & 1] = (I); \
- (__m128i)__a;}))
- #endif /* __x86_64__ */
- /* Extract int from packed integer array at index. This returns the element
- * as a zero extended value, so it is unsigned.
- */
- /// \brief Extracts an 8-bit element from the 128-bit integer vector of
- /// [16 x i8], using the immediate value parameter \a N as a selector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_extract_epi8(__m128i X, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPEXTRB / PEXTRB </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector.
- /// \param N
- /// An immediate value. Bits [3:0] specify which 8-bit vector element from
- /// the argument \a X to extract and copy to the result. \n
- /// 0000: Bits [7:0] of parameter \a X are extracted. \n
- /// 0001: Bits [15:8] of the parameter \a X are extracted. \n
- /// 0010: Bits [23:16] of the parameter \a X are extracted. \n
- /// 0011: Bits [31:24] of the parameter \a X are extracted. \n
- /// 0100: Bits [39:32] of the parameter \a X are extracted. \n
- /// 0101: Bits [47:40] of the parameter \a X are extracted. \n
- /// 0110: Bits [55:48] of the parameter \a X are extracted. \n
- /// 0111: Bits [63:56] of the parameter \a X are extracted. \n
- /// 1000: Bits [71:64] of the parameter \a X are extracted. \n
- /// 1001: Bits [79:72] of the parameter \a X are extracted. \n
- /// 1010: Bits [87:80] of the parameter \a X are extracted. \n
- /// 1011: Bits [95:88] of the parameter \a X are extracted. \n
- /// 1100: Bits [103:96] of the parameter \a X are extracted. \n
- /// 1101: Bits [111:104] of the parameter \a X are extracted. \n
- /// 1110: Bits [119:112] of the parameter \a X are extracted. \n
- /// 1111: Bits [127:120] of the parameter \a X are extracted.
- /// \returns An unsigned integer, whose lower 8 bits are selected from the
- /// 128-bit integer vector parameter and the remaining bits are assigned
- /// zeros.
- #define _mm_extract_epi8(X, N) (__extension__ \
- ({ __v16qi __a = (__v16qi)(__m128i)(X); \
- (int)(unsigned char) __a[(N) & 15];}))
- /// \brief Extracts a 32-bit element from the 128-bit integer vector of
- /// [4 x i32], using the immediate value parameter \a N as a selector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_extract_epi32(__m128i X, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPEXTRD / PEXTRD </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector.
- /// \param N
- /// An immediate value. Bits [1:0] specify which 32-bit vector element from
- /// the argument \a X to extract and copy to the result. \n
- /// 00: Bits [31:0] of the parameter \a X are extracted. \n
- /// 01: Bits [63:32] of the parameter \a X are extracted. \n
- /// 10: Bits [95:64] of the parameter \a X are extracted. \n
- /// 11: Bits [127:96] of the parameter \a X are exracted.
- /// \returns An integer, whose lower 32 bits are selected from the 128-bit
- /// integer vector parameter and the remaining bits are assigned zeros.
- #define _mm_extract_epi32(X, N) (__extension__ \
- ({ __v4si __a = (__v4si)(__m128i)(X); \
- (int)__a[(N) & 3];}))
- #ifdef __x86_64__
- /// \brief Extracts a 64-bit element from the 128-bit integer vector of
- /// [2 x i64], using the immediate value parameter \a N as a selector.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// long long _mm_extract_epi64(__m128i X, const int N);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPEXTRQ / PEXTRQ </c> instruction.
- ///
- /// \param X
- /// A 128-bit integer vector.
- /// \param N
- /// An immediate value. Bit [0] specifies which 64-bit vector element from
- /// the argument \a X to return. \n
- /// 0: Bits [63:0] are returned. \n
- /// 1: Bits [127:64] are returned. \n
- /// \returns A 64-bit integer.
- #define _mm_extract_epi64(X, N) (__extension__ \
- ({ __v2di __a = (__v2di)(__m128i)(X); \
- (long long)__a[(N) & 1];}))
- #endif /* __x86_64 */
- /* SSE4 128-bit Packed Integer Comparisons. */
- /// \brief Tests whether the specified bits in a 128-bit integer vector are all
- /// zeros.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param __M
- /// A 128-bit integer vector containing the bits to be tested.
- /// \param __V
- /// A 128-bit integer vector selecting which bits to test in operand \a __M.
- /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
- static __inline__ int __DEFAULT_FN_ATTRS
- _mm_testz_si128(__m128i __M, __m128i __V)
- {
- return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V);
- }
- /// \brief Tests whether the specified bits in a 128-bit integer vector are all
- /// ones.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param __M
- /// A 128-bit integer vector containing the bits to be tested.
- /// \param __V
- /// A 128-bit integer vector selecting which bits to test in operand \a __M.
- /// \returns TRUE if the specified bits are all ones; FALSE otherwise.
- static __inline__ int __DEFAULT_FN_ATTRS
- _mm_testc_si128(__m128i __M, __m128i __V)
- {
- return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V);
- }
- /// \brief Tests whether the specified bits in a 128-bit integer vector are
- /// neither all zeros nor all ones.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param __M
- /// A 128-bit integer vector containing the bits to be tested.
- /// \param __V
- /// A 128-bit integer vector selecting which bits to test in operand \a __M.
- /// \returns TRUE if the specified bits are neither all zeros nor all ones;
- /// FALSE otherwise.
- static __inline__ int __DEFAULT_FN_ATTRS
- _mm_testnzc_si128(__m128i __M, __m128i __V)
- {
- return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V);
- }
- /// \brief Tests whether the specified bits in a 128-bit integer vector are all
- /// ones.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_test_all_ones(__m128i V);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param V
- /// A 128-bit integer vector containing the bits to be tested.
- /// \returns TRUE if the bits specified in the operand are all set to 1; FALSE
- /// otherwise.
- #define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_cmpeq_epi32((V), (V)))
- /// \brief Tests whether the specified bits in a 128-bit integer vector are
- /// neither all zeros nor all ones.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_test_mix_ones_zeros(__m128i M, __m128i V);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param M
- /// A 128-bit integer vector containing the bits to be tested.
- /// \param V
- /// A 128-bit integer vector selecting which bits to test in operand \a M.
- /// \returns TRUE if the specified bits are neither all zeros nor all ones;
- /// FALSE otherwise.
- #define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V))
- /// \brief Tests whether the specified bits in a 128-bit integer vector are all
- /// zeros.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_test_all_zeros(__m128i M, __m128i V);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
- ///
- /// \param M
- /// A 128-bit integer vector containing the bits to be tested.
- /// \param V
- /// A 128-bit integer vector selecting which bits to test in operand \a M.
- /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
- #define _mm_test_all_zeros(M, V) _mm_testz_si128 ((M), (V))
- /* SSE4 64-bit Packed Integer Comparisons. */
- /// \brief Compares each of the corresponding 64-bit values of the 128-bit
- /// integer vectors for equality.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPCMPEQQ / PCMPEQQ </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit integer vector.
- /// \param __V2
- /// A 128-bit integer vector.
- /// \returns A 128-bit integer vector containing the comparison results.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cmpeq_epi64(__m128i __V1, __m128i __V2)
- {
- return (__m128i)((__v2di)__V1 == (__v2di)__V2);
- }
- /* SSE4 Packed Integer Sign-Extension. */
- /// \brief Sign-extends each of the lower eight 8-bit integer elements of a
- /// 128-bit vector of [16 x i8] to 16-bit values and returns them in a
- /// 128-bit vector of [8 x i16]. The upper eight elements of the input vector
- /// are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXBW / PMOVSXBW </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are sign-
- /// extended to 16-bit values.
- /// \returns A 128-bit vector of [8 x i16] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi8_epi16(__m128i __V)
- {
- /* This function always performs a signed extension, but __v16qi is a char
- which may be signed or unsigned, so use __v16qs. */
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
- }
- /// \brief Sign-extends each of the lower four 8-bit integer elements of a
- /// 128-bit vector of [16 x i8] to 32-bit values and returns them in a
- /// 128-bit vector of [4 x i32]. The upper twelve elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXBD / PMOVSXBD </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower four 8-bit elements are sign-
- /// extended to 32-bit values.
- /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi8_epi32(__m128i __V)
- {
- /* This function always performs a signed extension, but __v16qi is a char
- which may be signed or unsigned, so use __v16qs. */
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4si);
- }
- /// \brief Sign-extends each of the lower two 8-bit integer elements of a
- /// 128-bit integer vector of [16 x i8] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXBQ / PMOVSXBQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower two 8-bit elements are sign-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi8_epi64(__m128i __V)
- {
- /* This function always performs a signed extension, but __v16qi is a char
- which may be signed or unsigned, so use __v16qs. */
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1), __v2di);
- }
- /// \brief Sign-extends each of the lower four 16-bit integer elements of a
- /// 128-bit integer vector of [8 x i16] to 32-bit values and returns them in
- /// a 128-bit vector of [4 x i32]. The upper four elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXWD / PMOVSXWD </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [8 x i16]. The lower four 16-bit elements are sign-
- /// extended to 32-bit values.
- /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi16_epi32(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4si);
- }
- /// \brief Sign-extends each of the lower two 16-bit integer elements of a
- /// 128-bit integer vector of [8 x i16] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper six elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXWQ / PMOVSXWQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [8 x i16]. The lower two 16-bit elements are sign-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi16_epi64(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1), __v2di);
- }
- /// \brief Sign-extends each of the lower two 32-bit integer elements of a
- /// 128-bit integer vector of [4 x i32] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper two elements of the input vector
- /// are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVSXDQ / PMOVSXDQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [4 x i32]. The lower two 32-bit elements are sign-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepi32_epi64(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4si)__V, (__v4si)__V, 0, 1), __v2di);
- }
- /* SSE4 Packed Integer Zero-Extension. */
- /// \brief Zero-extends each of the lower eight 8-bit integer elements of a
- /// 128-bit vector of [16 x i8] to 16-bit values and returns them in a
- /// 128-bit vector of [8 x i16]. The upper eight elements of the input vector
- /// are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXBW / PMOVZXBW </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are zero-
- /// extended to 16-bit values.
- /// \returns A 128-bit vector of [8 x i16] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu8_epi16(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
- }
- /// \brief Zero-extends each of the lower four 8-bit integer elements of a
- /// 128-bit vector of [16 x i8] to 32-bit values and returns them in a
- /// 128-bit vector of [4 x i32]. The upper twelve elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXBD / PMOVZXBD </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower four 8-bit elements are zero-
- /// extended to 32-bit values.
- /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu8_epi32(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4si);
- }
- /// \brief Zero-extends each of the lower two 8-bit integer elements of a
- /// 128-bit integer vector of [16 x i8] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXBQ / PMOVZXBQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [16 x i8]. The lower two 8-bit elements are zero-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu8_epi64(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1), __v2di);
- }
- /// \brief Zero-extends each of the lower four 16-bit integer elements of a
- /// 128-bit integer vector of [8 x i16] to 32-bit values and returns them in
- /// a 128-bit vector of [4 x i32]. The upper four elements of the input
- /// vector are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXWD / PMOVZXWD </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [8 x i16]. The lower four 16-bit elements are zero-
- /// extended to 32-bit values.
- /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu16_epi32(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4si);
- }
- /// \brief Zero-extends each of the lower two 16-bit integer elements of a
- /// 128-bit integer vector of [8 x i16] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper six elements of the input vector
- /// are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXWQ / PMOVZXWQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [8 x i16]. The lower two 16-bit elements are zero-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu16_epi64(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1), __v2di);
- }
- /// \brief Zero-extends each of the lower two 32-bit integer elements of a
- /// 128-bit integer vector of [4 x i32] to 64-bit values and returns them in
- /// a 128-bit vector of [2 x i64]. The upper two elements of the input vector
- /// are unused.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPMOVZXDQ / PMOVZXDQ </c> instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [4 x i32]. The lower two 32-bit elements are zero-
- /// extended to 64-bit values.
- /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cvtepu32_epi64(__m128i __V)
- {
- return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4su)__V, (__v4su)__V, 0, 1), __v2di);
- }
- /* SSE4 Pack with Unsigned Saturation. */
- /// \brief Converts 32-bit signed integers from both 128-bit integer vector
- /// operands into 16-bit unsigned integers, and returns the packed result.
- /// Values greater than 0xFFFF are saturated to 0xFFFF. Values less than
- /// 0x0000 are saturated to 0x0000.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPACKUSDW / PACKUSDW </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
- /// signed integer and is converted to a 16-bit unsigned integer with
- /// saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
- /// less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
- /// are written to the lower 64 bits of the result.
- /// \param __V2
- /// A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
- /// signed integer and is converted to a 16-bit unsigned integer with
- /// saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
- /// less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
- /// are written to the higher 64 bits of the result.
- /// \returns A 128-bit vector of [8 x i16] containing the converted values.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_packus_epi32(__m128i __V1, __m128i __V2)
- {
- return (__m128i) __builtin_ia32_packusdw128((__v4si)__V1, (__v4si)__V2);
- }
- /* SSE4 Multiple Packed Sums of Absolute Difference. */
- /// \brief Subtracts 8-bit unsigned integer values and computes the absolute
- /// values of the differences to the corresponding bits in the destination.
- /// Then sums of the absolute differences are returned according to the bit
- /// fields in the immediate operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_mpsadbw_epu8(__m128i X, __m128i Y, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VMPSADBW / MPSADBW </c> instruction.
- ///
- /// \param X
- /// A 128-bit vector of [16 x i8].
- /// \param Y
- /// A 128-bit vector of [16 x i8].
- /// \param M
- /// An 8-bit immediate operand specifying how the absolute differences are to
- /// be calculated, according to the following algorithm:
- /// \code
- /// // M2 represents bit 2 of the immediate operand
- /// // M10 represents bits [1:0] of the immediate operand
- /// i = M2 * 4
- /// j = M10 * 4
- /// for (k = 0; k < 8; k = k + 1) {
- /// d0 = abs(X[i + k + 0] - Y[j + 0])
- /// d1 = abs(X[i + k + 1] - Y[j + 1])
- /// d2 = abs(X[i + k + 2] - Y[j + 2])
- /// d3 = abs(X[i + k + 3] - Y[j + 3])
- /// r[k] = d0 + d1 + d2 + d3
- /// }
- /// \endcode
- /// \returns A 128-bit integer vector containing the sums of the sets of
- /// absolute differences between both operands.
- #define _mm_mpsadbw_epu8(X, Y, M) __extension__ ({ \
- (__m128i) __builtin_ia32_mpsadbw128((__v16qi)(__m128i)(X), \
- (__v16qi)(__m128i)(Y), (M)); })
- /// \brief Finds the minimum unsigned 16-bit element in the input 128-bit
- /// vector of [8 x u16] and returns it and along with its index.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPHMINPOSUW / PHMINPOSUW </c>
- /// instruction.
- ///
- /// \param __V
- /// A 128-bit vector of [8 x u16].
- /// \returns A 128-bit value where bits [15:0] contain the minimum value found
- /// in parameter \a __V, bits [18:16] contain the index of the minimum value
- /// and the remaining bits are set to 0.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_minpos_epu16(__m128i __V)
- {
- return (__m128i) __builtin_ia32_phminposuw128((__v8hi)__V);
- }
- /* Handle the sse4.2 definitions here. */
- /* These definitions are normally in nmmintrin.h, but gcc puts them in here
- so we'll do the same. */
- #undef __DEFAULT_FN_ATTRS
- #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.2")))
- /* These specify the type of data that we're comparing. */
- #define _SIDD_UBYTE_OPS 0x00
- #define _SIDD_UWORD_OPS 0x01
- #define _SIDD_SBYTE_OPS 0x02
- #define _SIDD_SWORD_OPS 0x03
- /* These specify the type of comparison operation. */
- #define _SIDD_CMP_EQUAL_ANY 0x00
- #define _SIDD_CMP_RANGES 0x04
- #define _SIDD_CMP_EQUAL_EACH 0x08
- #define _SIDD_CMP_EQUAL_ORDERED 0x0c
- /* These macros specify the polarity of the operation. */
- #define _SIDD_POSITIVE_POLARITY 0x00
- #define _SIDD_NEGATIVE_POLARITY 0x10
- #define _SIDD_MASKED_POSITIVE_POLARITY 0x20
- #define _SIDD_MASKED_NEGATIVE_POLARITY 0x30
- /* These macros are used in _mm_cmpXstri() to specify the return. */
- #define _SIDD_LEAST_SIGNIFICANT 0x00
- #define _SIDD_MOST_SIGNIFICANT 0x40
- /* These macros are used in _mm_cmpXstri() to specify the return. */
- #define _SIDD_BIT_MASK 0x00
- #define _SIDD_UNIT_MASK 0x40
- /* SSE4.2 Packed Comparison Intrinsics. */
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns a 128-bit integer vector representing the result
- /// mask of the comparison.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_cmpistrm(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRM / PCMPISTRM </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words, the type of comparison to perform, and the format of the return
- /// value. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// Bit [6]: Determines whether the result is zero-extended or expanded to 16
- /// bytes. \n
- /// 0: The result is zero-extended to 16 bytes. \n
- /// 1: The result is expanded to 16 bytes (this expansion is performed by
- /// repeating each bit 8 or 16 times).
- /// \returns Returns a 128-bit integer vector representing the result mask of
- /// the comparison.
- #define _mm_cmpistrm(A, B, M) \
- (__m128i)__builtin_ia32_pcmpistrm128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns an integer representing the result index of the
- /// comparison.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistri(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words, the type of comparison to perform, and the format of the return
- /// value. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// Bit [6]: Determines whether the index of the lowest set bit or the
- /// highest set bit is returned. \n
- /// 0: The index of the least significant set bit. \n
- /// 1: The index of the most significant set bit. \n
- /// \returns Returns an integer representing the result index of the comparison.
- #define _mm_cmpistri(A, B, M) \
- (int)__builtin_ia32_pcmpistri128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns a 128-bit integer vector representing the result
- /// mask of the comparison.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// __m128i _mm_cmpestrm(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRM / PCMPESTRM </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words, the type of comparison to perform, and the format of the return
- /// value. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// Bit [6]: Determines whether the result is zero-extended or expanded to 16
- /// bytes. \n
- /// 0: The result is zero-extended to 16 bytes. \n
- /// 1: The result is expanded to 16 bytes (this expansion is performed by
- /// repeating each bit 8 or 16 times). \n
- /// \returns Returns a 128-bit integer vector representing the result mask of
- /// the comparison.
- #define _mm_cmpestrm(A, LA, B, LB, M) \
- (__m128i)__builtin_ia32_pcmpestrm128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns an integer representing the result index of the
- /// comparison.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestri(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words, the type of comparison to perform, and the format of the return
- /// value. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// Bit [6]: Determines whether the index of the lowest set bit or the
- /// highest set bit is returned. \n
- /// 0: The index of the least significant set bit. \n
- /// 1: The index of the most significant set bit. \n
- /// \returns Returns an integer representing the result index of the comparison.
- #define _mm_cmpestri(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestri128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /* SSE4.2 Packed Comparison Intrinsics and EFlag Reading. */
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the bit mask is zero and the length of the
- /// string in \a B is the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistra(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// \returns Returns 1 if the bit mask is zero and the length of the string in
- /// \a B is the maximum; otherwise, returns 0.
- #define _mm_cmpistra(A, B, M) \
- (int)__builtin_ia32_pcmpistria128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the bit mask is non-zero, otherwise, returns
- /// 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistrc(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B.
- /// \returns Returns 1 if the bit mask is non-zero, otherwise, returns 0.
- #define _mm_cmpistrc(A, B, M) \
- (int)__builtin_ia32_pcmpistric128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns bit 0 of the resulting bit mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistro(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// \returns Returns bit 0 of the resulting bit mask.
- #define _mm_cmpistro(A, B, M) \
- (int)__builtin_ia32_pcmpistrio128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the length of the string in \a A is less than
- /// the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistrs(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// \returns Returns 1 if the length of the string in \a A is less than the
- /// maximum, otherwise, returns 0.
- #define _mm_cmpistrs(A, B, M) \
- (int)__builtin_ia32_pcmpistris128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with implicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the length of the string in \a B is less than
- /// the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpistrz(__m128i A, __m128i B, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B.
- /// \returns Returns 1 if the length of the string in \a B is less than the
- /// maximum, otherwise, returns 0.
- #define _mm_cmpistrz(A, B, M) \
- (int)__builtin_ia32_pcmpistriz128((__v16qi)(__m128i)(A), \
- (__v16qi)(__m128i)(B), (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the bit mask is zero and the length of the
- /// string in \a B is the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestra(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B.
- /// \returns Returns 1 if the bit mask is zero and the length of the string in
- /// \a B is the maximum, otherwise, returns 0.
- #define _mm_cmpestra(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestria128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the resulting mask is non-zero, otherwise,
- /// returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestrc(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// \returns Returns 1 if the resulting mask is non-zero, otherwise, returns 0.
- #define _mm_cmpestrc(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestric128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns bit 0 of the resulting bit mask.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestro(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B.
- /// \returns Returns bit 0 of the resulting bit mask.
- #define _mm_cmpestro(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestrio128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the length of the string in \a A is less than
- /// the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestrs(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
- /// instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement in the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B. \n
- /// \returns Returns 1 if the length of the string in \a A is less than the
- /// maximum, otherwise, returns 0.
- #define _mm_cmpestrs(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestris128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /// \brief Uses the immediate operand \a M to perform a comparison of string
- /// data with explicitly defined lengths that is contained in source operands
- /// \a A and \a B. Returns 1 if the length of the string in \a B is less than
- /// the maximum, otherwise, returns 0.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// \code
- /// int _mm_cmpestrz(__m128i A, int LA, __m128i B, int LB, const int M);
- /// \endcode
- ///
- /// This intrinsic corresponds to the <c> VPCMPESTRI </c> instruction.
- ///
- /// \param A
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LA
- /// An integer that specifies the length of the string in \a A.
- /// \param B
- /// A 128-bit integer vector containing one of the source operands to be
- /// compared.
- /// \param LB
- /// An integer that specifies the length of the string in \a B.
- /// \param M
- /// An 8-bit immediate operand specifying whether the characters are bytes or
- /// words and the type of comparison to perform. \n
- /// Bits [1:0]: Determine source data format. \n
- /// 00: 16 unsigned bytes \n
- /// 01: 8 unsigned words \n
- /// 10: 16 signed bytes \n
- /// 11: 8 signed words \n
- /// Bits [3:2]: Determine comparison type and aggregation method. \n
- /// 00: Subset: Each character in \a B is compared for equality with all
- /// the characters in \a A. \n
- /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
- /// basis is greater than or equal for even-indexed elements in \a A,
- /// and less than or equal for odd-indexed elements in \a A. \n
- /// 10: Match: Compare each pair of corresponding characters in \a A and
- /// \a B for equality. \n
- /// 11: Substring: Search \a B for substring matches of \a A. \n
- /// Bits [5:4]: Determine whether to perform a one's complement on the bit
- /// mask of the comparison results. \n
- /// 00: No effect. \n
- /// 01: Negate the bit mask. \n
- /// 10: No effect. \n
- /// 11: Negate the bit mask only for bits with an index less than or equal
- /// to the size of \a A or \a B.
- /// \returns Returns 1 if the length of the string in \a B is less than the
- /// maximum, otherwise, returns 0.
- #define _mm_cmpestrz(A, LA, B, LB, M) \
- (int)__builtin_ia32_pcmpestriz128((__v16qi)(__m128i)(A), (int)(LA), \
- (__v16qi)(__m128i)(B), (int)(LB), \
- (int)(M))
- /* SSE4.2 Compare Packed Data -- Greater Than. */
- /// \brief Compares each of the corresponding 64-bit values of the 128-bit
- /// integer vectors to determine if the values in the first operand are
- /// greater than those in the second operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> VPCMPGTQ / PCMPGTQ </c> instruction.
- ///
- /// \param __V1
- /// A 128-bit integer vector.
- /// \param __V2
- /// A 128-bit integer vector.
- /// \returns A 128-bit integer vector containing the comparison results.
- static __inline__ __m128i __DEFAULT_FN_ATTRS
- _mm_cmpgt_epi64(__m128i __V1, __m128i __V2)
- {
- return (__m128i)((__v2di)__V1 > (__v2di)__V2);
- }
- /* SSE4.2 Accumulate CRC32. */
- /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
- /// unsigned char operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> CRC32B </c> instruction.
- ///
- /// \param __C
- /// An unsigned integer operand to add to the CRC-32C checksum of operand
- /// \a __D.
- /// \param __D
- /// An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
- /// \returns The result of adding operand \a __C to the CRC-32C checksum of
- /// operand \a __D.
- static __inline__ unsigned int __DEFAULT_FN_ATTRS
- _mm_crc32_u8(unsigned int __C, unsigned char __D)
- {
- return __builtin_ia32_crc32qi(__C, __D);
- }
- /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
- /// unsigned short operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> CRC32W </c> instruction.
- ///
- /// \param __C
- /// An unsigned integer operand to add to the CRC-32C checksum of operand
- /// \a __D.
- /// \param __D
- /// An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
- /// \returns The result of adding operand \a __C to the CRC-32C checksum of
- /// operand \a __D.
- static __inline__ unsigned int __DEFAULT_FN_ATTRS
- _mm_crc32_u16(unsigned int __C, unsigned short __D)
- {
- return __builtin_ia32_crc32hi(__C, __D);
- }
- /// \brief Adds the first unsigned integer operand to the CRC-32C checksum of
- /// the second unsigned integer operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> CRC32L </c> instruction.
- ///
- /// \param __C
- /// An unsigned integer operand to add to the CRC-32C checksum of operand
- /// \a __D.
- /// \param __D
- /// An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
- /// \returns The result of adding operand \a __C to the CRC-32C checksum of
- /// operand \a __D.
- static __inline__ unsigned int __DEFAULT_FN_ATTRS
- _mm_crc32_u32(unsigned int __C, unsigned int __D)
- {
- return __builtin_ia32_crc32si(__C, __D);
- }
- #ifdef __x86_64__
- /// \brief Adds the unsigned integer operand to the CRC-32C checksum of the
- /// unsigned 64-bit integer operand.
- ///
- /// \headerfile <x86intrin.h>
- ///
- /// This intrinsic corresponds to the <c> CRC32Q </c> instruction.
- ///
- /// \param __C
- /// An unsigned integer operand to add to the CRC-32C checksum of operand
- /// \a __D.
- /// \param __D
- /// An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
- /// \returns The result of adding operand \a __C to the CRC-32C checksum of
- /// operand \a __D.
- static __inline__ unsigned long long __DEFAULT_FN_ATTRS
- _mm_crc32_u64(unsigned long long __C, unsigned long long __D)
- {
- return __builtin_ia32_crc32di(__C, __D);
- }
- #endif /* __x86_64__ */
- #undef __DEFAULT_FN_ATTRS
- #ifdef __POPCNT__
- #include <popcntintrin.h>
- #endif
- #endif /* _SMMINTRIN_H */
|