§ y<ˆjï‡ã ó—dZddlZddlZddlZddlZddlZddlZddlZGd„d¦«ZGd„d¦«Z iZ Gd„d¦«Z Gd „d ¦«Z Gd „d ¦«Z Gd „d¦«ZGd„dee e e e e¦«Zd„ZdS)aProvides the `CCompilerOpt` class, used for handling the CPU/hardware optimization, starting from parsing the command arguments, to managing the relation between the CPU baseline and dispatch-able features, also generating the required C headers and ending with compiling the sources with proper compiler's flags. `CCompilerOpt` doesn't provide runtime detection for the CPU features, instead only focuses on the compiler side, but it creates abstract C headers that can be used later for the final runtime dispatching process.éNc óô—eZdZdZdZdZdZdZej   ej   ej   e ¦«¦«d¦«ZiZdZdZeeddd ¬ ¦«eddd ¬ ¦«ed dd ¬ ¦«ed dd¬ ¦«eddd¬ ¦«eddd¬ ¦«¬¦«Zeddddddd¬¦«Zedzideddd¬¦«“deddd ¬!¦«“d"ed#dd$¬!¦«“d%ed&d"d'¬!¦«“d(ed)d%d*¬!¦«“d+ed,d(d-¬!¦«“d.ed/d+¬0¦«“d1ed2d.d3d¬4¦«“d5ed6d1d7¬!¦«“d8ed9d1d7¬!¦«“d:ed;d1¬0¦«“d<ed=d:¬0¦«“d>ed?d:¬0¦«“d@edAdBddC¬D¦«“dEedFd@¬0¦«“dGedHdEdIdGd¬J¦«“dKedLdGdMdKd¬J¦«“dNedOdEdPdNddQ¬R¦«“dSedTdNdUdS¬V¦«“dWedXdNdYdWd¬J¦«“dZed[d\d]dZd¬J¦«“d^ed_dZd`d^d¬J¦«“daeddbdc¬d¦«“deeddad¬f¦«“dged#ded¬f¦«“dhed&dgddi¬D¦«“djeddk¬l¦«“dmeddjd¬f¦«“dned#dmd¬f¦«“doeddp¬l¦«“dqeddo¬0¦«“dred#dq¬0¦«“dsed&dtd¬f¦«“dued)ds¬0¦«“dved,ds¬0¦«“dwed/du¬0¦«“ŽZdx„Zdy„ZdS){Ú_ConfigaÉAn abstract class holds all configurable attributes of `CCompilerOpt`, these class attributes can be used to change the default behavior of `CCompilerOpt` in order to fit other requirements. Attributes ---------- conf_nocache : bool Set True to disable memory and file cache. Default is False. conf_noopt : bool Set True to forces the optimization to be disabled, in this case `CCompilerOpt` tends to generate all expected headers in order to 'not' break the build. Default is False. conf_cache_factors : list Add extra factors to the primary caching factors. The caching factors are utilized to determine if there are changes had happened that requires to discard the cache and re-updating it. The primary factors are the arguments of `CCompilerOpt` and `CCompiler`'s properties(type, flags, etc). Default is list of two items, containing the time of last modification of `ccompiler_opt` and value of attribute "conf_noopt" conf_tmp_path : str, The path of temporary directory. Default is auto-created temporary directory via ``tempfile.mkdtemp()``. conf_check_path : str The path of testing files. Each added CPU feature must have a **C** source file contains at least one intrinsic or instruction that related to this feature, so it can be tested against the compiler. Default is ``./distutils/checks``. conf_target_groups : dict Extra tokens that can be reached from dispatch-able sources through the special mark ``@targets``. Default is an empty dictionary. **Notes**: - case-insensitive for tokens and group names - sign '#' must stick in the begin of group name and only within ``@targets`` **Example**: .. code-block:: console $ "@targets #avx_group other_tokens" > group_inside.c >>> CCompilerOpt.conf_target_groups["avx_group"] = \ "$werror $maxopt avx2 avx512f avx512_skx" >>> cco = CCompilerOpt(cc_instance) >>> cco.try_dispatch(["group_inside.c"]) conf_c_prefix : str The prefix of public C definitions. Default is ``"NPY_"``. conf_c_prefix_ : str The prefix of internal C definitions. Default is ``"NPY__"``. conf_cc_flags : dict Nested dictionaries defining several compiler flags that linked to some major functions, the main key represent the compiler name and sub-keys represent flags names. Default is already covers all supported **C** compilers. Sub-keys explained as follows: "native": str or None used by argument option `native`, to detect the current machine support via the compiler. "werror": str or None utilized to treat warning as errors during testing CPU features against the compiler and also for target's policy `$werror` via dispatch-able sources. "maxopt": str or None utilized for target's policy '$maxopt' and the value should contains the maximum acceptable optimization by the compiler. e.g. in gcc `'-O3'` **Notes**: * case-sensitive for compiler names and flags * use space to separate multiple flags * any flag will tested against the compiler and it will skipped if it's not applicable. conf_min_features : dict A dictionary defines the used CPU features for argument option `'min'`, the key represent the CPU architecture name e.g. `'x86'`. Default values provide the best effort on wide range of users platforms. **Note**: case-sensitive for architecture names. conf_features : dict Nested dictionaries used for identifying the CPU features. the primary key is represented as a feature name or group name that gathers several features. Default values covers all supported features but without the major options like "flags", these undefined options handle it by method `conf_features_partial()`. Default value is covers almost all CPU features for *X86*, *IBM/Power64* and *ARM 7/8*. Sub-keys explained as follows: "implies" : str or list, optional, List of CPU feature names to be implied by it, the feature name must be defined within `conf_features`. Default is None. "flags": str or list, optional List of compiler flags. Default is None. "detect": str or list, optional List of CPU feature names that required to be detected in runtime. By default, its the feature name or features in "group" if its specified. "implies_detect": bool, optional If True, all "detect" of implied features will be combined. Default is True. see `feature_detect()`. "group": str or list, optional Same as "implies" but doesn't require the feature name to be defined within `conf_features`. "interest": int, required a key for sorting CPU features "headers": str or list, optional intrinsics C header file "disable": str, optional force disable feature, the string value should contains the reason of disabling. "autovec": bool or None, optional True or False to declare that CPU feature can be auto-vectorized by the compiler. By default(None), treated as True if the feature contains at least one applicable flag. see `feature_can_autovec()` "extra_checks": str or list, optional Extra test case names for the CPU feature that need to be tested against the compiler. Each test case must have a C file named ``extra_xxxx.c``, where ``xxxx`` is the case name in lower case, under 'conf_check_path'. It should contain at least one intrinsic or function related to the test case. If the compiler able to successfully compile the C file then `CCompilerOpt` will add a C ``#define`` for it into the main dispatch header, e.g. ``#define {conf_c_prefix}_XXXX`` where ``XXXX`` is the case name in upper case. **NOTES**: * space can be used as separator with options that supports "str or list" * case-sensitive for all values and feature name must be in upper-case. * if flags aren't applicable, its will skipped rather than disable the CPU feature * the CPU feature will disabled if the compiler fail to compile the test file FNÚchecksÚNPY_ÚNPY__z -march=nativez-O3z-Werror)ÚnativeÚoptÚwerrorz-Werror=switch -Werrorz-xHostz/QxHostz/O3z/Werrorz/O2z/WXz -mcpu=a64fx)ÚgccÚclangÚiccÚiccwÚmsvcÚfcczSSE SSE2z SSE SSE2 SSE3ÚzVSX VSX2zNEON NEON_FP16 NEON_VFPV4 ASIMD)Úx86Úx64Úppc64Úppc64leÚs390xÚarmhfÚaarch64ÚSSEéz xmmintrin.hÚSSE2)ÚinterestÚheadersÚimplieséz emmintrin.h)rrrÚSSE3éz pmmintrin.hÚSSSE3éz tmmintrin.hÚSSE41éz smmintrin.hÚPOPCNTézpopcntintrin.hÚSSE42é)rrÚAVXéz immintrin.h)rrrÚimplies_detectÚXOPé z x86intrin.hÚFMA4é ÚF16Cé ÚFMA3é ÚAVX2é ÚAVX512Féz FMA3 AVX2ÚAVX512F_REDUCE)rrr,Ú extra_checksÚAVX512CDéÚ AVX512_KNLé(zAVX512ER AVX512PF)rrÚgroupÚdetectr,Ú AVX512_KNMé)z)AVX5124FMAPS AVX5124VNNIW AVX512VPOPCNTDQÚ AVX512_SKXé*zAVX512VL AVX512BW AVX512DQzAVX512BW_MASK AVX512DQ_MASK)rrr?r@r,r:Ú AVX512_CLXé+Ú AVX512VNNI)rrr?r@Ú AVX512_CNLé,zAVX512IFMA AVX512VBMIÚ AVX512_ICLé-zAVX512_CLX AVX512_CNLz(AVX512VBMI2 AVX512BITALG AVX512VPOPCNTDQÚ AVX512_SPRé.Ú AVX512FP16ÚVSXz altivec.hÚVSX_ASM)rrr:ÚVSX2)rrr,ÚVSX3ÚVSX4ÚVSX4_MMAÚVXz vecintrin.h)rrÚVXEÚVXE2ÚNEONz arm_neon.hÚ NEON_FP16Ú NEON_VFPV4ÚASIMDzNEON_FP16 NEON_VFPV4ÚASIMDHPÚASIMDDPÚASIMDFHMc óp—|jriS|jp|j}|jp |jp|j}|�rƒ|�r€t dwidt d¬¦«“dt d¬¦«“dt d¬¦«“dt d ¬¦«“d t d ¬¦«“d t d ¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“dt d¬¦«“d t d!¬¦«“d"t d#¬¦«“d$t d%¬¦«“d&t d'¬¦«“d(t d)¬¦«“d*t d+¬¦«“d,t d-¬¦«“ŽS|�rp|j�rht dwidt d¬¦«“dt d¬¦«“dt d¬¦«“dt d ¬¦«“d t d ¬¦«“d i“dt d¬¦«“dt d¬¦«“di“dt d.¬/¦«“dt d.¬/¦«“dt d0d1¬2¦«“dt dd1¬2¦«“dt d3d4¬2¦«“dt d5d4¬2¦«“d t d6¬¦«“d"t d7¬¦«“d$t d8¬¦«“d&t d9¬¦«“d(t d:¬¦«“d*t d;¬¦«“d,t d<¬/¦«“ŽS|�rp|j�rht dwidt d=¬¦«“dt d>¬¦«“dt d?¬¦«“dt d@¬¦«“d t dA¬¦«“d i“dt dB¬¦«“dt dC¬¦«“di“dt d.¬/¦«“dt d.¬/¦«“dt d0dD¬2¦«“dt ddD¬2¦«“dt d3dE¬2¦«“dt d5dE¬2¦«“d t dF¬¦«“d"t dG¬¦«“d$t dH¬¦«“d&t dI¬¦«“d(t dJ¬¦«“d*t dK¬¦«“d,t d<¬/¦«“ŽS|�r.|j �r&t dwid|jrt d=¬¦«ni“d|jrt d>¬¦«ni“di“di“d i“d t dL¬M¦«“di“dt dC¬¦«“di“dt dN¬M¦«“dt dN¬M¦«“dt d0dO¬2¦«“dt dPdO¬2¦«“dt dQdR¬2¦«“dt dSdR¬2¦«“d t dT¬/¦«“d"t dT¬/¦«“d$t dR¬¦«“d&i“d(i“d*i“d,t dT¬/¦«“ŽS|j p|j }|r�t t |j rdUndVdW¬2¦«t dXdY¬Z¦«t d[dY¬Z¦«t d\dY¬Z¦«¬]¦«}|jr,d^|d_d`<dX|dUd`<da|dbd`<dc|ddd`<|S|j }|r@t t de¬¦«t dfdY¬Z¦«t dgdY¬Z¦«¬h¦«}|S|j r~|r|t t didj¬k¦«t dldj¬k¦«t dmdj¬k¦«t dndj¬k¦«t do¬¦«t dp¬¦«t dq¬¦«¬r¦«S|jrz|rxt t ds¬¦«t dt¬¦«t du¬¦«t dv¬¦«t do¬¦«t dp¬¦«t dq¬¦«¬r¦«SiS)xa7Return a dictionary of supported CPU features by the platform, and accumulate the rest of undefined options in `conf_features`, the returned dict has same rules and notes in class attribute `conf_features`, also its override any options that been set in 'conf_features'. rz-msse)Úflagsrz-msse2r z-msse3r"z-mssse3r$z-msse4.1r&z-mpopcntr(z-msse4.2r*z-mavxr1z-mf16cr-z-mxopr/z-mfma4r3z-mfmar5z-mavx2r7z-mavx512f -mno-mmxr;z -mavx512cdr=z-mavx512er -mavx512pfrAz/-mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdqrCz -mavx512vl -mavx512bw -mavx512dqrEz -mavx512vnnirHz-mavx512ifma -mavx512vbmirJz.-mavx512vbmi2 -mavx512bitalg -mavx512vpopcntdqrLz -mavx512fp16z!Intel Compiler doesn't support it)Údisablez F16C AVX2z-march=core-avx2)rr`z AVX2 AVX512CDz-march=common-avx512z AVX2 AVX512Fz-xKNLz-xKNMz-xSKYLAKE-AVX512z -xCASCADELAKEz -xCANNONLAKEz-xICELAKE-CLIENTzNot supported yetz /arch:SSEz /arch:SSE2z /arch:SSE3z /arch:SSSE3z /arch:SSE4.1z /arch:SSE4.2z /arch:AVXz/arch:CORE-AVX2z/Qx:COMMON-AVX512z/Qx:KNLz/Qx:KNMz/Qx:SKYLAKE-AVX512z/Qx:CASCADELAKEz/Qx:CANNONLAKEz/Qx:ICELAKE-CLIENTz nmmintrin.h)rz ammintrin.hz /arch:AVX2z F16C FMA3zAVX2 AVX512CD AVX512_SKXz /arch:AVX512zAVX512F AVX512_SKXz MSVC compiler doesn't support itrQrz-mvsxz -mcpu=power8F)r`r,z-mcpu=power9 -mtune=power9z-mcpu=power10 -mtune=power10)rOrQrRrSz-maltivec -mvsxrOr`z -mcpu=power9rRz -mcpu=power10rSz-march=arch11 -mzvectorz -march=arch12z -march=arch13)rUrVrWzNEON_FP16 NEON_VFPV4 ASIMDT)rÚautoveczNEON NEON_VFPV4 ASIMDzNEON NEON_FP16 ASIMDzNEON NEON_FP16 NEON_VFPV4z-march=armv8.2-a+fp16z-march=armv8.2-a+dotprodz-march=armv8.2-a+fp16fml)rXrYrZr[r\r]r^z -mfpu=neonz"-mfpu=neon-fp16 -mfp16-format=ieeez-mfpu=neon-vfpv4z'-mfpu=neon-fp-armv8 -march=armv8-a+simd©)Úcc_nooptÚ cc_on_x86Ú cc_on_x64Ú cc_is_gccÚ cc_is_clangÚ cc_is_fccÚdictÚ cc_is_iccÚ cc_is_iccwÚ cc_is_msvcÚ cc_on_ppc64leÚ cc_on_ppc64Ú cc_on_s390xÚ cc_on_aarch64Ú cc_on_armhf)ÚselfÚon_x86Úis_unixÚon_powerÚpartialÚon_zarchs úq/builddir/build/BUILD/cloudlinux-venv-1.0.12/venv/lib64/python3.11/site-packages/numpy/distutils/ccompiler_opt.pyÚconf_features_partialz_Config.conf_features_partialIsT €ð Œ=ð àˆIà”Ð1 4¤>ˆØ”.ÐF DÔ$4ÐF¸¼ˆà ñ �gñ ¥dð' ð' ð' Ý Ð(Ñ(Ô(Ð(ð' å Ð)Ñ)Ô)Ð)ð' õ Ð)Ñ)Ô)Ð)ð' õ  Ð*Ñ*Ô*Ð*ð ' õ   Ð+Ñ+Ô+Ð+ð ' õ   Ð+Ñ+Ô+Ð+ð ' õ  Ð+Ñ+Ô+Ð+ð' õ Ð(Ñ(Ô(Ð(ð' õ Ð)Ñ)Ô)Ð)ð' õ Ð(Ñ(Ô(Ð(ð' õ Ð)Ñ)Ô)Ð)ð' õ Ð(Ñ(Ô(Ð(ð' õ Ð)Ñ)Ô)Ð)ð' õÐ!5Ð6Ñ6Ô6Ð6ð' õ ,Ð/Ñ/Ô/Ð/ð' õ Ð$;Ð<Ñ<Ô<Ð<ð!' õ"ØGðñôðð#' õ(Ð$FÐGÑGÔGÐGð)' õ* NÐ3Ñ3Ô3Ð3ð+' õ,Ð$?Ð@Ñ@Ô@Ð@ð-' õ.ØFðñôðð/' õ4 NÐ3Ñ3Ô3Ð3ð5' ð ð8 ñ �d”nñ ­Tð. ð. ð. Ý Ð(Ñ(Ô(Ð(ð. å Ð)Ñ)Ô)Ð)ð. õ Ð)Ñ)Ô)Ð)ð. õ  Ð*Ñ*Ô*Ð*ð . õ   Ð+Ñ+Ô+Ð+ð . ð �Rð . õ  Ð+Ñ+Ô+Ð+ð. õ Ð(Ñ(Ô(Ð(ð. ð�Rð. õÐ"EÐFÑFÔFÐFð. õÐ"EÐFÑFÔFÐFð. õØ#Ð+=ðñôðð. õ  Ð.@ÐAÑAÔAÐAð!. õ$Ø'Ð/Eðñôðð%. õ*Ø&Ð.Dðñôðð+. õ0 GÐ,Ñ,Ô,Ð,ð1. õ2 GÐ,Ñ,Ô,Ð,ð3. õ4Ð$6Ð7Ñ7Ô7Ð7ð5. õ6 OÐ4Ñ4Ô4Ð4ð7. õ8 NÐ3Ñ3Ô3Ð3ð9. õ:Ð$6Ð7Ñ7Ô7Ð7ð;. õ<Ð&9Ð:Ñ:Ô:Ð:ð=. ð' ð@ ñ! �d”oñ! ­dð!/ ð!/ ð!/ Ý  Ð,Ñ,Ô,Ð,ð!/ å  Ð-Ñ-Ô-Ð-ð!/ õ  Ð-Ñ-Ô-Ð-ð!/ õ  Ð.Ñ.Ô.Ð.ð !/ õ  Ð/Ñ/Ô/Ð/ð !/ ð �Rð !/ õ Ð/Ñ/Ô/Ð/ð!/ õ  Ð,Ñ,Ô,Ð,ð!/ ð�Rð!/ õÐ"EÐFÑFÔFÐFð!/ õÐ"EÐFÑFÔFÐFð!/ õØ#Ð+<ðñôðð!/ õ ØÐ&7ðñôðð!!/ õ(Ø'Ð/Bðñôðð)!/ õ.Ø&Ð.Aðñôðð/!/ õ4 IÐ.Ñ.Ô.Ð.ð5!/ õ6 IÐ.Ñ.Ô.Ð.ð7!/ õ8Ð$8Ð9Ñ9Ô9Ð9ð9!/ õ:Ð$5Ð6Ñ6Ô6Ð6ð;!/ õ<Ð$4Ð5Ñ5Ô5Ð5ð=!/ õ>Ð$8Ð9Ñ9Ô9Ð9ð?!/ õ@Ð&9Ð:Ñ:Ô:Ð:ðA!/ ð!( ðD ñ( �d”oñ( ­dð(/ ð(/ ð(/ Ø-1¬^ÐC•$˜[Ð)Ñ)Ô)Ð)Àøð(/ à/3¬~ÐE•4˜lÐ+Ñ+Ô+Ð+À2øð(/ ð�Rð(/ ð�Rð (/ ð �Rð (/ õ  -Ð0Ñ0Ô0Ð0ð (/ ð�Rð(/ õ  Ð,Ñ,Ô,Ð,ð(/ ð�Rð(/ õ -Ð0Ñ0Ô0Ð0ð(/ õ -Ð0Ñ0Ô0Ð0ð(/ õØ#¨<ðñôðð(/ õ Ø#¨<ðñôðð!(/ õ*Ø2¸.ðñôðð+(/ õ0Ø,°Nðñôðð1(/ õ6Ø:ðñôðð7(/ õ<Ø:ðñôðð=(/ õB NÐ3Ñ3Ô3Ð3ðC(/ ðD˜ðE(/ ðF˜ðG(/ ðH˜ðI(/ õJØ:ðñôððK(/ ð(( ðTÔ%Ð9¨Ô)9ˆØ ð ÝÝØ'+Ô'9ÐA˜V˜V¸rØ!ðñôõØ(¸ðñôõØ6ÀuðñôõØ8ÈðñôðñôˆGðÔð ;Ø+<�˜”˜wÑ'Ø+9�˜” Ñ(Ø+9�˜” Ñ(Ø+:�˜” Ñ(àˆNàÔ#ˆØ ð ÝÝØ3ðñôõØ)¸%ðñôõØ)¸%ðñôð ñ ô ˆGðˆNð Ô ð  'ð µ$ÝØ4¸dðñôõØ/¸ðñôõØ.¸ðñôõØ3¸TðñôõØ-ðñôõØ0ðñôõØ0ðñôð'3 ñ3 ô3 ð, ð. Ô ð  ð µÝØ"ðñôõØ:ðñôõØ(ðñôõØ?ðñôõØ-ðñôõØ0ðñôõØ0ðñôð'1 ñ1 ô1 ð* ð0ˆ óc󇇗|j€=ddlŠddl}| ¦«Šˆˆfd„}t j|¦«‰|_|j€2tj  t¦«|j g|_dSdS)NrcóV•— ‰ ‰¦«dS#t$rYdSwxYw©N)ÚrmtreeÚOSError)ÚshutilÚtmps€€ryÚrm_tempz!_Config.__init__..rm_temp?sBø€ðØ—M’M #Ñ&Ô&Ð&Ð&Ð&øÝðððØ�D�Dðøøøs ƒš (§() Ú conf_tmp_pathr�ÚtempfileÚmkdtempÚatexitÚregisterÚconf_cache_factorsÚosÚpathÚgetmtimeÚ__file__Ú conf_nocache)rsr…rƒr�r‚s @@ryÚ__init__z_Config.__init__:s¢øø€Ø Ô Ð %Ø ˆMˆMˆMØ ˆOˆOˆOØ×"Ò"Ñ$Ô$ˆCð ð ð ð ð ð õ ŒO˜GÑ $Ô $Ð $Ø!$ˆDÔ à Ô "Ð *å”× Ò ¥Ñ*Ô*ØÔ!ð'ˆDÔ #Ð #Ð #ð +Ð *r{rc)Ú__name__Ú __module__Ú __qualname__Ú__doc__rŽÚ conf_nooptr‰r„rŠr‹ÚjoinÚdirnameÚrealpathr�Úconf_check_pathÚconf_target_groupsÚ conf_c_prefixÚconf_c_prefix_rjÚ conf_cc_flagsÚconf_min_featuresÚ conf_featuresrzr�rcr{ryrrsÇ€€€€€ð`ð`ðB€LØ€JØÐØ€MØ”g—l’lØ Œ�Š˜œ×(Ò(¨Ñ2Ô2Ñ3Ô3°Xñô€OðÐØ€MØ€NØ�D؈dð%ØØð  ñ ô ð�Ø$Øð .ð  ñ  ô  ðˆdØØØð ñ ô ð ˆtØØØð ñ ô ð ˆtØØØð ñ ô ð ˆdØ"ØØð ñ ô ðC&ñ&ô&€MðN˜ØØØØØØØ3ðñôÐð�DðYðYðYàˆdØ  ðð  ñ ô ð ðYð�˜q¨%¸ÐGÑGÔGÐGðYð�˜q¨&¸-ÐHÑHÔHÐHðYð�˜q¨&¸-ÐHÑHÔHÐHðYð�˜q¨'¸=ÐIÑIÔIÐIðYð�˜q¨'Ð;KÐLÑLÔLÐLðYð�˜q¨(Ð3Ñ3Ô3Ð3ðYð�Ø °Ø ð ñ ô ð ðYð$�˜q¨%¸ÐGÑGÔGÐGð%Yð&�˜r¨5¸-ÐHÑHÔHÐHð'Yð(�˜r¨5Ð1Ñ1Ô1Ð1ð)Yð*�˜r¨6Ð2Ñ2Ô2Ð2ð+Yð,�˜r¨6Ð2Ñ2Ô2Ð2ð-Yð.�$Ø ¸UØ)ð ñ ô ð ð/Yð6�4 ¨YÐ7Ñ7Ô7Ð7ð7Yð8�TØ Ð3Fذð ñ ô ð ð9Yð@�TØ Ø=ذð ñ ô ð ðAYðJ�TØ Ð3OذØ6ð ñ ô ð ðKYðT�TØ °\Øð ñ ô ð ðUYð\�TØ Ð5Lذð ñ ô ð ð]Yðd�TØÐ!8Ø<ذð ñ ô ð ðeYðn�TØ °\ذð ñ ô ð ðoYðzˆd˜A {ÀÐKÑKÔKÐKð{Yð~ˆt˜Q¨¸eÐDÑDÔDÐDðYðBˆt˜Q¨¸uÐEÑEÔEÐEðCYðFˆt˜Q¨¸uØ!+ð-ñ-ô-ð-ðGYðNˆT˜1 mÐ 4Ñ 4Ô 4Ð 4ðOYðRˆd˜A t¸EÐBÑBÔBÐBðSYðVˆt˜Q¨¸eÐDÑDÔDÐDðWYðZ�˜a¨Ð6Ñ6Ô6Ð6ð[Yð\�D !¨VÐ4Ñ4Ô4Ð4ð]Yð`�T 1¨kÐ:Ñ:Ô:Ð:ðaYðd�˜aÐ)?ÐPUÐVÑVÔVÐVðeYðh�$ ¨7Ð3Ñ3Ô3Ð3ðiYðl�$ ¨7Ð3Ñ3Ô3Ð3ðmYðp�4 ¨IÐ6Ñ6Ô6Ð6ðqY€Mðtoðoðoðbððððr{rcóä—eZdZdZd„Zdd„Zgfd„Zd„Zed„¦«Z ed„¦«Z ed d œd „¦«Z ed „¦«Z ed „¦«Z dd„Zejd¦«Zedd„¦«ZdS)Ú _Distutilsa¾A helper class that provides a collection of fundamental methods implemented in a top of Python and NumPy Distutils. The idea behind this class is to gather all methods that it may need to override in case of reuse 'CCompilerOpt' in environment different than of what NumPy has. Parameters ---------- ccompiler : `CCompiler` The generate instance that returned from `distutils.ccompiler.new_compiler()`. có—||_dSr~)Ú _ccompiler)rsÚ ccompilers ryr�z_Distutils.__init__Zs €Ø#ˆŒˆˆr{Nc ó—t|t¦«sJ‚t|t¦«sJ‚| dg¦«|z}|s|j}|j|fd|i|¤ŽS)zWrap CCompiler.compile()Úextra_postargs)Ú isinstanceÚlistÚpopr¢Úcompile)rsÚsourcesr`r£Úkwargss ryÚ dist_compilez_Distutils.dist_compile]sv€å˜'¥4Ñ(Ô(Ð)Ð)Ð(ݘ%¥Ñ&Ô&Ð'Ð'Ð&Ø— ’ Ð+¨RÑ0Ô0°5Ñ8ˆØð (ØœˆIà ˆyÔ  ÐIÐI¸ÐIÀ&ÐIÐIÐIr{cóÞ—t|t¦«sJ‚ddlm}|j}t |dd¦«}|rGt |jdd¦«}|dvrt |d|j¦«nt |d|j¦«d} |  |g|||j ¬ ¦«d }n6#|$r.} |  t| ¦«d ¬ ¦«Yd} ~ nd} ~ wwxYw|rt |d|¦«|S) zgReturn True if 'CCompiler.compile()' able to compile a source file with certain flags. r©Ú CompileErrorÚspawnNÚ compiler_typer)rF)ÚmacrosÚ output_dirT©Ústderr) r¦ÚstrÚdistutils.errorsr¯r¢ÚgetattrÚsetattrÚ_dist_test_spawn_pathsÚ_dist_test_spawnr¬r„Údist_log) rsÚsourcer`r²r¯ÚccÚbk_spawnÚcc_typeÚtestÚes ryÚ dist_testz_Distutils.dist_testgs>€õ˜&¥#Ñ&Ô&Ð'Ð'Ð&Ø1Ð1Ð1Ð1Ð1Ð1Ø Œ_ˆÝ˜2˜w¨Ñ-Ô-ˆØ ð <ݘdœo¨ÀÑCÔCˆGؘ)Ð#Ð#ݘ˜G TÔ%@ÑAÔAÐAÐA嘘G TÔ%:Ñ;Ô;Ð;؈ð /Ø × Ò Ø�˜%¨¸4Ô;Mð ñ ô ð ðˆDˆDøØð /ð /ð /Ø �MŠM�#˜a™&œ&¨ˆMÑ .Ô .Ð .Ð .Ð .Ð .Ð .Ð .øøøøð /øøøà ð +Ý �B˜ Ñ *Ô *Ð *؈ sÂ!B$Â$CÂ)$CÃCc ó|—t|d¦«r|jSt|jdd¦«}|dvrd}n|dvrd}ndd lm}|¦«}t|jd t|jd d¦«¦«}|r|d kr)t|d ¦«r |d}nt |¦«}n|}t|d ¦«r1t|¦«dkrd |dd…¦«}nCtj   dd¦«}|tj   dd¦«z }|||f|_|jS)a! Return a tuple containing info about (platform, compiler, extra_args), required by the abstract class '_CCompiler' for discovering the platform environment. This is also used as a cache factor in order to detect any changes happening from outside. Ú _dist_infor±r)ÚintelemÚintelemwÚx86_64)ÚintelÚintelwÚintelerr)Ú get_platformÚcompilerÚ compiler_soÚunixÚ__iter__rú NÚCFLAGSÚCPPFLAGS) ÚhasattrrÅr¸r¢Údistutils.utilrÌr¶Úlenr•rŠÚenvironÚget)rsrÀÚplatformrÌÚcc_inforÍÚ extra_argss ryÚ dist_infoz_Distutils.dist_info�sZ€õ �4˜Ñ &Ô &ð #Ø”?Ð "å˜$œ/¨?¸BÑ?Ô?ˆØ Ð-Ð -Ð -؈HˆHØ Ð5Ð 5Ð 5؈HˆHà 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø#�|‘~”~ˆHå˜$œ/¨:µw¸t¼ÐP]Ð_aÑ7bÔ7bÑcÔcˆØð ˜' VÒ+Ð+Ý�w  Ñ+Ô+ð (Ø" 1œ:��å˜w™<œ<��àˆHå �7˜JÑ 'Ô 'ð 9­C°©L¬L¸1Ò,<Ð,<ØŸš '¨!¨"¨"¤+Ñ.Ô.ˆJˆJåœ*Ÿ.š.¨°2Ñ6Ô6ˆJØ �"œ*Ÿ.š.¨°RÑ8Ô8Ñ 8ˆJà# X¨zÐ:ˆŒØŒÐr{có<—ddlm}|tj|ަ«‚)zRaise a compiler errorrr®)r·r¯r Ú _dist_str)Úargsr¯s ryÚ dist_errorz_Distutils.dist_error¦s.€ð 2Ð1Ð1Ð1Ð1Ð1؈l�:Ô/°Ð6Ñ7Ô7Ð7r{có<—ddlm}|tj|ަ«‚)zRaise a distutils errorr)ÚDistutilsError)r·râr rÞ)rßrâs ryÚ dist_fatalz_Distutils.dist_fatal¬s.€ð 4Ð3Ð3Ð3Ð3Ð3؈n�ZÔ1°4Ð8Ñ9Ô9Ð9r{Fr´cóŠ—ddlm}tj|Ž}|r| |¦«dS| |¦«dS)zPrint a console messager)ÚlogN)Únumpy.distutilsrår rÞÚwarnÚinfo)rµrßråÚouts ryr¼z_Distutils.dist_log²sQ€ð (Ð'Ð'Ð'Ð'Ð'ÝÔ" DÐ)ˆØ ð Ø �HŠH�S‰MŒMˆMˆMˆMà �HŠH�S‰MŒMˆMˆMˆMr{có’—ddlm} |||¦«S#t$r&}t |d¬¦«Yd}~nd}~wwxYwdS)zALoad a module from file, required by the abstract class '_Cache'.r)Úexec_mod_from_locationTr´N)Ú misc_utilrëÚ Exceptionr r¼)Únamer‹rërÂs ryÚdist_load_modulez_Distutils.dist_load_module¼sz€ð 6Ð5Ð5Ð5Ð5Ð5ð 0Ø)Ð)¨$°Ñ5Ô5Ð 5øÝð 0ð 0ð 0Ý × Ò  ¨$Ð Ñ /Ô /Ð /Ð /Ð /Ð /Ð /Ð /øøøøð 0øøøàˆtsˆ ” Až?¿Acó´‡—ˆfd„Štj¦«d}d|j|jfz}d ˆfd„g|¢RD¦«¦«}||zS)z+Return a string to print by log and errors.cóì•—t|t¦«sPt|d¦«r@g}|D] }| ‰|¦«¦«Œ!dd |¦«zdzSt|¦«S)NrÐú(rÑú))r¦r¶rÔÚappendr•)ÚargÚretÚaÚto_strs €ryrøz$_Distutils._dist_str..to_strÉs|ø€Ý˜c¥3Ñ'Ô'ð 0­G°C¸Ñ,DÔ,Dð 0Ø�Øð*ð*�AØ—J’J˜v˜v a™yœyÑ)Ô)Ð)Ð)ؘCŸHšH S™MœMÑ)¨CÑ/Ð/Ý�s‘8”8ˆOr{rzCCompilerOpt.%s[%d] : rÑcó&•—g|] }‰|¦«‘ŒSrcrc)Ú.0r÷røs €ryú z(_Distutils._dist_str..Ós1ø€ð ð ð àð ˆF�1‰IŒIð ð ð r{)ÚinspectÚstackÚfunctionÚlinenor•)rßrýÚstartrérøs @ryrÞz_Distutils._dist_strÆsŒø€ð ð ð ð ð õ” ‘” Ô"ˆØ(¨E¬N¸E¼LÐ+IÑIˆØ�hŠhð ð ð ð à�t�X�Xð ñ ô ñ ô ˆð�s‰{Ðr{có*—t|jd¦«s| |¦«dStjd¦«} |jjtjd<| |¦«|tjd<dS#|tjd<wxYw)zŠ Fix msvc SDK ENV path same as distutils do without it we get c1: fatal error C1356: unable to find mspdbcore.dll Ú_pathsNr‹)rÔr¢r»rŠÚgetenvrr×)rsÚcmdÚdisplayÚold_paths ryrºz!_Distutils._dist_test_spawn_pathsÙs”€õ �t”¨Ñ1Ô1ð Ø × !Ò ! #Ñ &Ô &Ð &Ø ˆFÝ”9˜VÑ$Ô$ˆð *Ø!%¤Ô!7�BŒJ�vÑ Ø × !Ò ! #Ñ &Ô &Ð &à!)�BŒJ�vÑ Ð Ð ø �BŒJ�vÑ Ð )Ð )Ð )Ð )s Á.BÂBz/.*(warning D9002|invalid argument for option).*có�— tj|tjd¬¦«}|r>tjt j|¦«rt  d|d|z¦«dS#tj$r}|j }|j }Yd}~nd}~wt$r}|}d}Yd}~nd}~wwxYwt  d|d||fz¦«dS)NT)rµÚtextzFlags in commandz/aren't supported by the compiler, output -> %séÚCommandz(failed with exit status %d output -> %s) Ú subprocessÚ check_outputÚSTDOUTÚreÚmatchr Ú_dist_warn_regexràÚCalledProcessErrorÚoutputÚ returncoder€)rrÚoÚexcÚsrÂs ryr»z_Distutils._dist_test_spawnðs€ð ÝÔ'¨µJÔ4EØ-1ð3ñ3ô3ˆAàð •R”X�jÔ9¸1Ñ=Ô=ð Ý×%Ò%Ø&¨ð.'Ø)*ñ.+ñôðð�4øõÔ,ð ð ð Ø” ˆAØ”ˆAˆAˆAˆAˆAˆAøøøøÝð ð ð ØˆA؈AˆAˆAˆAˆAˆAøøøøð øøøõ ×ÒØ �sÐGØ ˆqðK ñ ñ ô ð ð ð s$‚A!A%Á%B"Á4B B"ÂBÂB"r~)r�r‘r’r“r�r¬rÃrÜÚ staticmethodràrãr¼rïrÞrºrr©rr»rcr{ryr r MsQ€€€€€ð ð ð$ð$ð$ðJðJðJðJð/1ððððð4#ð#ð#ðJð8ð8ñ„\ð8ð ð:ð:ñ„\ð:ð Ø$ððððñ„\ððððñ„\ððððñ„\ðð$ *ð *ð *ð *ð"�r”zð ñôÐðð ð ð ñ„\ð ð ð r{r cób—eZdZdZejd¦«Zd d„Zd„Zd„Z d„Z e d„¦«Z dS) Ú_Cachea'An abstract class handles caching functionality, provides two levels of caching, in-memory by share instances attributes among each other and by store attributes into files. **Note**: any attributes that start with ``_`` or ``conf_`` will be ignored. Parameters ---------- cache_path : str or None The path of cache file, if None then cache in file will disabled. *factors : The caching factors that need to utilize next to `conf_cache_factors`. Attributes ---------- cache_private : set Hold the attributes that need be skipped from "in-memory cache". cache_infile : bool Utilized during initializing this class, to determine if the cache was able to loaded from the specified cache path in 'cache_path'. z ^(_|conf_)Ncóh—i|_t¦«|_d|_d|_|jr| d¦«dS|jg|¢|j¢RŽ|_ ||_|�rtj   |¦«rð| d|¦«|  d|¦«}|s| dd¬¦«nªt|d¦«rt|d ¦«s| d d¬¦«nr|j |jkrM| d ¦«|j ¦«D]\}}t%|||¦«Œd|_n| d ¦«|jsŠt& |j ¦«}|ri| d ¦«|j ¦«D]:\}}||jvst-j|j|¦«rŒ)t%|||¦«Œ;|t&|j <t3j|j¦«dS)NFzcache is disabled by `Config`zload cache from file ->Úcachez)unable to load the cache file as a moduleTr´ÚhashÚdatazinvalid cache filezhit the file cachezmiss the file cachezhit the memory cache)Úcache_meÚsetÚ cache_privateÚ cache_infileÚ _cache_pathrŽr¼Ú cache_hashr‰Ú _cache_hashrŠr‹ÚexistsrïrÔrrÚitemsr¹Ú _share_cacherØÚ__dict__rrÚ _cache_ignorer‡rˆÚ cache_flush)rsÚ cache_pathÚfactorsÚ cache_modÚattrÚvalÚ other_caches ryr�z_Cache.__init__%s`€ØˆŒ Ý ™UœUˆÔØ!ˆÔ؈Ôà Ô ð Ø �MŠMÐ9Ñ :Ô :Ð :Ø ˆFà*˜4œ?ÐN¨GÐN°dÔ6MÐNÐNÐNˆÔØ%ˆÔØ ñ 9ÝŒw�~Š~˜jÑ)Ô)ð 9Ø— ’ Ð7¸ÑDÔDÐDØ ×1Ò1°'¸:ÑFÔF� Ø ð9Ø—M’MØCØ#ð"ñôððõ! ¨FÑ3Ô3ð 9Ý  ¨FÑ3Ô3ð 9à—M’MÐ"6¸t�MÑDÔDÐDÐDØÔ%¨¬Ò7Ð7Ø—M’MÐ"6Ñ7Ô7Ð7Ø%.¤^×%9Ò%9Ñ%;Ô%;ð1ð1™ ˜˜cÝ  d¨CÑ0Ô0Ð0Ð0Ø(,�DÔ%Ð%à—M’MÐ"7Ñ8Ô8Ð8àÔ ð -Ý&×*Ò*¨4Ô+;Ñ<Ô<ˆKØð -Ø— ’ Ð4Ñ5Ô5Ð5Ø!,Ô!5×!;Ò!;Ñ!=Ô!=ð-ð-‘I�D˜#ؘ{Ô8Ð8Ð8Ý!œx¨Ô(:¸DÑAÔAð9à ݘD $¨Ñ,Ô,Ð,Ð,à)-� �TÔ%Ñ&ÝŒ˜Ô(Ñ)Ô)Ð)Ð)Ð)r{cóŠ—t ¦«D](\}}||krt |¦«dSŒ)dSr~)r'r&r¨)rsÚhrs ryÚ__del__z_Cache.__del__RsT€Ý ×&Ò&Ñ(Ô(ð ð ‰DˆAˆqØ�DŠyˆyÝ× Ò  Ñ#Ô#Ð#Ø��ðð ð r{cóô—|jsdS| d|j¦«|j ¦«}|j ¦«D]1}t j|j|¦«r| |¦«Œ2tj   |j¦«}tj   |¦«stj |¦«tj|d¬¦«}t!|jd¦«5}| t%jd¦« |j¦«¦«| |¦«ddd¦«dS#1swxYwYdS)z) Force update the cache. Nzwrite cache to path ->T)ÚcompactÚwz¿ # AUTOGENERATED DON'T EDIT # Please make changes to the code generator (distutils/ccompiler_opt.py) hash = {} data = \ )r"r¼r(ÚcopyÚkeysrrr)r¨rŠr‹r–r%ÚmakedirsÚpprintÚpformatÚopenÚwriteÚtextwrapÚdedentÚformatr$)rsÚcdictr.ÚdÚ repr_dictÚfs ryr*z_Cache.cache_flushXs“€ðÔð Ø ˆFà � Š Ð.°Ô0@ÑAÔAÐAØ” ×"Ò"Ñ$Ô$ˆØ”M×&Ò&Ñ(Ô(ð ð ˆDÝŒx˜Ô*¨DÑ1Ô1ð Ø— ’ ˜$‘”�øå ŒG�OŠO˜DÔ,Ñ -Ô -ˆÝŒw�~Š~˜aÑ Ô ð Ý ŒK˜‰NŒNˆNå”N 5°$Ð7Ñ7Ô7ˆ Ý �$Ô" CÑ (Ô (ð ¨AØ �GŠG•H”Oð%ñô÷ ’˜Ô(Ñ)Ô)ñ  +ô +ð +ð �GŠG�IÑ Ô Ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð sÄ AE-Å-E1Å4E1có~—d}|D]7}t|¦«D]%}t|¦«|dzz|dzz|z }|dz}Œ&Œ8|S)Nrr'élÿÿ)r¶Úord)rsr,ÚchashrDÚchars ryr#z_Cache.cache_hashtsg€ðˆØð $ð $ˆAݘA™œð $ð $�ݘT™œ e¨q¡jÑ1°U¸b±[ÑAÀEÑI�ؘÑ#��ð $ðˆ r{có‡—ˆfd„}|S)zr A static method that can be treated as a decorator to dynamically cache certain methods. cóà•—t‰jg|¢| ¦«¢| ¦«¢R¦«}||jvr |j|S‰|g|¢Ri|¤Ž}||j|<|Sr~)r¶r�r8Úvaluesr)rsrßr«Ú cache_keyÚccbÚcbs €ryÚ cache_wrap_mez _Cache.me..cache_wrap_me„s•ø€åØ” ðØ"ðØ%+§[¢[¡]¤]ðØ5;·]²]±_´_ððñôˆIð˜DœMÐ)Ð)Ø”} YÔ/Ð/Ø�"�TÐ+˜DÐ+Ð+Ð+ FÐ+Ð+ˆCØ'*ˆDŒM˜)Ñ $؈Jr{rc)rOrPs` ryÚmez _Cache.me~s$ø€ð ð ð ð ð ðÐr{r~) r�r‘r’r“rr©r)r�r3r*r#rrQrcr{ryrrsŽ€€€€€ððð4�B”J˜|Ñ,Ô,€Mð+*ð+*ð+*ð+*ðZððð ððð8ðððððñ„\ðððr{rcó.—eZdZdZd„Zejd„¦«Zejgfd„¦«Zd„Z e j d¦«Z e j d¦«Z e j d¦«Ze j d ¦«Zd „Ze j d ¦«Ze j d ¦«Zd „ZdS)Ú _CCompilera2A helper class for `CCompilerOpt` containing all utilities that related to the fundamental compiler's functions. Attributes ---------- cc_on_x86 : bool True when the target architecture is 32-bit x86 cc_on_x64 : bool True when the target architecture is 64-bit x86 cc_on_ppc64 : bool True when the target architecture is 64-bit big-endian powerpc cc_on_ppc64le : bool True when the target architecture is 64-bit litle-endian powerpc cc_on_s390x : bool True when the target architecture is IBM/ZARCH on linux cc_on_armhf : bool True when the target architecture is 32-bit ARMv7+ cc_on_aarch64 : bool True when the target architecture is 64-bit Armv8-a+ cc_on_noarch : bool True when the target architecture is unknown or not supported cc_is_gcc : bool True if the compiler is GNU or if the compiler is unknown cc_is_clang : bool True if the compiler is Clang cc_is_icc : bool True if the compiler is Intel compiler (unix like) cc_is_iccw : bool True if the compiler is Intel compiler (msvc like) cc_is_nocc : bool True if the compiler isn't supported directly, Note: that cause a fail-back to gcc cc_has_debug : bool True if the compiler has debug flags cc_has_native : bool True if the compiler has native flags cc_noopt : bool True if the compiler has definition 'DISABLE_OPT*', or 'cc_on_noarch' is True cc_march : str The target architecture name, or "unknown" if the architecture isn't supported cc_name : str The compiler name, or "unknown" if the compiler isn't supported cc_flags : dict Dictionary containing the initialized flags of `_Config.conf_cc_flags` cóL—t|d¦«rdSd}d}d}| ¦«}|\}}}|||fD]}|D]\} } } t|| d¦«ŒŒ||f||ffD]Z\} } | D]R\} } } | r!tj| | tj¦«sŒ)| r| | ¦«sŒAt|| d¦«Œ[|D]R\} } } | r!tj| |tj¦«sŒ)| r| | ¦«sŒAt|| d¦«ŒS|jr"| d|›d�d¬ ¦«d|_ |j r| d d¬ ¦«d|_ |j r# | d |›d�d¬ ¦«d|_ d |_ d D]}t|d|z¦«r ||_ nŒd |_dD]}t|d|z¦«r ||_nŒi|_|j |j¦«}|€| d|jz¦«| ¦«D]n\}}gx|j|<}|r[t+|t,¦«sJ‚| ¦«}|D]-}| |g¦«r| |¦«Œ.Œod|_dS)NÚ cc_is_cached))rfz.*(x|x86_|amd)64.*r)rez.*(win32|x86|i386|i686).*r)rnz&.*(powerpc|ppc)64(el|le).*|.*powerpc.*z4defined(__powerpc64__) && defined(__LITTLE_ENDIAN__))roz.*(powerpc|ppc).*|.*powerpc.*z1defined(__powerpc64__) && defined(__BIG_ENDIAN__))rqz.*(aarch64|arm64).*r)rrz.*arm.*z3defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__))rpz .*s390x.*r)Ú cc_on_noarchrr))rgz.*(gcc|gnu\-g).*r)rhz .*clang.*r)rlz.*(intelw|intelemw|iccw).*r)rkz.*(intel|icc).*r)rmz.*msvc.*r)riz.*fcc.*r)Ú cc_is_noccrr))Ú cc_has_debugz$.*(O0|Od|ggdb|coverage|debug:full).*r)Ú cc_has_nativez..*(-march=native|-xHost|/QxHost|-mcpu=a64fx).*r)rdz.*DISABLE_OPT.*rFTz]unable to detect CPU architecture which lead to disable the optimization. check dist_info:<< z >>r´z&Optimization is disabled by the Configzªunable to detect compiler type which leads to treating it as GCC. this is a normal behavior if you're using gcc-like compiler such as MinGW or IBM/XLC.check dist_info:<< Úunknown)rrrrrrrÚcc_on_)r r rr rrÚcc_is_z=undefined flag for compiler '%s', leave an empty dict instead)rÔrÜr¹rrÚ IGNORECASEÚ cc_test_cexprrVr¼rdr”rWrgÚcc_marchr¸Úcc_nameÚcc_flagsrœrØrãr&r¦r¶ÚsplitÚ cc_test_flagsrôrU)rsÚ detect_archÚdetect_compilerÚ detect_argsrÜrÙÚ compiler_inforÛÚsectionr.ÚrgexÚcexprr@ÚsearchinÚarchrîÚcompiler_flagsr`ÚnflagsrDs ryr�z_CCompiler.__init__ÁsÃ€Ý �4˜Ñ (Ô (ð Ø ˆFð ˆ ð  ˆð ˆ ð—N’NÑ$Ô$ˆ Ø.7Ñ+ˆ�- à# _°kÐBð +ð +ˆGØ%,ð +ð +Ñ!��d˜Eݘ˜d EÑ*Ô*Ð*Ð*ð +ð#.¨xÐ!8¸?ÈMÐ:ZÐ [ð ð Ñ ˆF�HØ%+ð ð Ñ!��d˜EØð¥¤¨¨x½¼Ñ GÔ GðØØð ×!3Ò!3°EÑ!:Ô!:ðØÝ˜˜d DÑ)Ô)Ð)Øøà!,ð &ð &Ñ ˆD�$˜Øð �BœH T¨:µr´}ÑEÔEð ØØð ˜T×/Ò/°Ñ6Ô6ð ØÝ �D˜$ Ñ %Ô %Ð %Ð %à Ô ð !Ø �MŠMð7Ø'0ð7ð7ð7àð ñ ô ð ð !ˆDŒMà Œ?ð !Ø �MŠMÐBÈ4ˆMÑ PÔ PÐ PØ ˆDŒMà Œ?ð "ð ð �MŠMð7à'0ð7ð7ð7ðð ñ ô ð ð "ˆDŒNà!ˆŒ ð2ð ð ˆDå�t˜X¨™_Ñ-Ô-ð Ø $�” Ø�ð ð!ˆŒ ØBð ð ˆDÝ�t˜X¨™_Ñ-Ô-ð Ø#�” Ø�ð ðˆŒ ØÔ+×/Ò/°´ Ñ=Ô=ˆØ Ð !Ø �OŠOð.Ø04´ ñ=ñ ô ð ð*×/Ò/Ñ1Ô1ð )ð )‰KˆD�%Ø+-Ð -ˆDŒM˜$Ñ  &Øð )Ý! %­Ñ-Ô-Ð.Ð.Ð-ØŸ š ™ œ �Øð)ð)�AØ×)Ò)¨1¨#Ñ.Ô.ð)ØŸ š  aÑ(Ô(Ð(øøà ˆÔÐÐr{có—t|t¦«sJ‚| d|¦«tj |jd¦«}| ||¦«}|s| dd¬¦«|S)z@ Returns True if the compiler supports 'flags'. z testing flagsz test_flags.cútesting failedTr´)r¦r§r¼rŠr‹r•r˜rÃ)rsr`Ú test_pathrÁs ryrcz_CCompiler.cc_test_flags7s}€õ ˜%¥Ñ&Ô&Ð'Ð'Ð&Ø � Š �o uÑ-Ô-Ð-Ý”G—L’L Ô!5°~ÑFÔFˆ Ø�~Š~˜i¨Ñ/Ô/ˆØð 9Ø �MŠMÐ*°4ˆMÑ 8Ô 8Ð 8؈ r{có€—| d|¦«tj |jd¦«}t |d¦«5}| tjd|›d�¦«¦«ddd¦«n #1swxYwY|  ||¦«}|s| dd¬ ¦«|S) zJ Same as the above but supports compile-time expressions. ztesting compiler expressionznpy_dist_test_cexpr.cr6z #if !(zq) #error "unsupported expression" #endif int dummy; NrpTr´) r¼rŠr‹r•r„r<r=r>r?rÃ)rsrjr`rqÚfdrÁs ryr^z_CCompiler.cc_test_cexprDs€ð � Š Ð3°UÑ;Ô;Ð;Ý”G—L’L Ô!3Ð5LÑMÔMˆ Ý �)˜SÑ !Ô !ð  RØ �HŠH•X”_ð&Øð&ð&ð&ñôñ ô ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð�~Š~˜i¨Ñ/Ô/ˆØð 9Ø �MŠMÐ*°4ˆMÑ 8Ô 8Ð 8؈ sÁ ,BÂB BcóΗt|t¦«sJ‚|js|js|jr| |¦«S|js|jr| |¦«S|S)a” Remove the conflicts that caused due gathering implied features flags. Parameters ---------- 'flags' list, compiler flags flags should be sorted from the lowest to the highest interest. Returns ------- list, filtered from any conflicts. Examples -------- >>> self.cc_normalize_flags(['-march=armv8.2-a+fp16', '-march=armv8.2-a+dotprod']) ['armv8.2-a+fp16+dotprod'] >>> self.cc_normalize_flags( ['-msse', '-msse2', '-msse3', '-mssse3', '-msse4.1', '-msse4.2', '-mavx', '-march=core-avx2'] ) ['-march=core-avx2'] ) r¦r§rgrhrkÚ_cc_normalize_unixrmrlÚ_cc_normalize_win)rsr`s ryÚcc_normalize_flagsz_CCompiler.cc_normalize_flagsWsw€õ.˜%¥Ñ&Ô&Ð'Ð'Ð&Ø Œ>ð 2˜TÔ-ð 2°´ð 2Ø×*Ò*¨5Ñ1Ô1Ð 1à Œ?ð 1˜dœoð 1Ø×)Ò)¨%Ñ0Ô0Ð 0؈ r{z^(-mcpu=|-march=|-x[A-Z0-9\-])zB^(?!(-mcpu=|-march=|-x[A-Z0-9\-]|-m[a-z0-9\-\.]*.$))|(?:-mzvector)z^(-mfpu|-mtune)z[0-9.]có‡—ˆfd„}t|¦«dkr|Stt|¦«¦«D]Ó\}}tj‰j|¦«sŒ |d|dz …}|| d…}t t‰jj |¦«¦«}||¦«\}} } |dkrMt| ¦«dkr:|D]} || ¦«\} } }|| kr|| z} Œ| dzd  | ¦«z}||gz}|dkr||z }g}t¦«}t|¦«D][}tj‰j |¦«}|sn&|d|vrŒ*|  |d¦«| d|¦«Œ\|S)Nc óÚ•—| d¦«}tdd tj‰j|d¦«¦«z¦«}||d|dd…fS)Nú+Ú0rrr)rbÚfloatr•rÚfindallÚ_cc_normalize_arch_ver)rDÚtokensÚverrss €ryÚ ver_flagsz0_CCompiler._cc_normalize_unix..ver_flags‰skø€ð—W’W˜S‘\”\ˆFݘ˜bŸgšgÝ” ˜4Ô6¸¸q¼ ÑBÔBñôññôˆCð˜˜qœ  6¨!¨"¨"¤:Ð-Ð -r{rrrz)rÖÚ enumerateÚreversedrrÚ_cc_normalize_unix_mrgxr§ÚfilterÚ_cc_normalize_unix_frgxÚsearchr•rÚ_cc_normalize_unix_krgxÚaddÚinsert)rsr`r�ÚiÚcur_flagÚ lower_flagsÚ upper_flagsÚfilteredr€rlÚsubflagsÚxflagÚxverÚ_Ú xsubflagsÚ final_flagsÚmatchedrDrs` ryruz_CCompiler._cc_normalize_unixˆsæø€ð .ð .ð .ð .ð .õ ˆu‰:Œ:˜Š?ˆ?؈Lå$¥X¨e¡_¤_Ñ5Ô5ð ð ‰KˆAˆxÝ”8˜DÔ8¸(ÑCÔCð ØØ  1 Q¡3  œ.ˆKØ    œ*ˆKÝ�FØÔ,Ô3°[ñôñôˆHð#, )¨HÑ"5Ô"5Ñ ˆC��xØ�QŠwˆw�3˜x™=œ=¨1Ò,Ð,Ø(ð8ð8�EØ)2¨°5Ñ)9Ô)9Ñ&�D˜!˜Yؘd’{�{Ø#,¨xÑ#7˜øØ #™:¨¯ª°Ñ(:Ô(:Ñ:�à ˜zÑ)ˆEØ�1ŠuˆuؘÑ$�Ø ðˆ Ý‘%”%ˆÝ˜%‘”ð %ð %ˆAÝ”H˜TÔ9¸1Ñ=Ô=ˆEØð &ØØ�q”˜WÐ$Ð$Øà— ’ ˜E !œHÑ%Ô%Ð%Ø × Ò ˜q !Ñ $Ô $Ð $Ð $ØÐr{z^(?!(/arch\:|/Qx\:))z ^(/arch|/Qx:)c ó—tt|¦«¦«D]b\}}tj|j|¦«sŒ |dz }t t |jj|d| …¦«¦«|| d…zcS|S)Nr) r‚rƒrrÚ_cc_normalize_win_mrgxr§r…Ú_cc_normalize_win_frgxr‡)rsr`r‹rDs ryrvz_CCompiler._cc_normalize_win¿sœ€Ý�h u™oœoÑ.Ô.ð ð ‰DˆAˆqÝ”8˜DÔ7¸Ñ;Ô;ð ØØ �‰FˆAÝ�ØÔ+Ô2°E¸#¸A¸2¸#´Jñôñôà˜�r�s�s”ñð ð ð ðˆ r{N)r�r‘r’r“r�rrQrcr^rwrr©r„r†rˆr~rur™r˜rvrcr{ryrSrS�s:€€€€€ð/ð/ð`t!ðt!ðt!ðl „Yð ð ñ„Yð ð „YØ)+ðððñ„Yðð$ððð>)˜bœjà)ñôÐð)˜bœjð ñôÐð)˜bœjàñôÐð(˜RœZØñôÐð/ð/ð/ðb(˜RœZØñôÐð(˜RœZØñôÐðððððr{rScó—eZdZdZd„Zddgfd„Zd„Zdd„Zdd„Zd „Z d „Z d „Z d „Z d „Z ejd„¦«Zejdgfd„¦«Zejdgfd„¦«Zejd„¦«Zejd„¦«Zdd„ZdS)Ú_FeatureaâA helper class for `CCompilerOpt` that managing CPU features. Attributes ---------- feature_supported : dict Dictionary containing all CPU features that supported by the platform, according to the specified values in attribute `_Config.conf_features` and `_Config.conf_features_partial()` feature_min : set The minimum support of CPU features, according to the specified values in attribute `_Config.conf_min_features`. cób‡ —t|d¦«rdS| ¦«x|_}t| ¦«¦«D]Ø}||Š |j|}‰  ˆ fd„| ¦«D¦«¦«‰  d¦«}|�1|  |¦«|  d|z|d¬¦«Œ’dD]C}‰  |¦«}t|t¦«r|  ¦«‰ |<ŒDŒÙt¦«|_|j |jd¦«}| ¦«  ¦«D]%}||jvr|j |¦«Œ&d|_dS) NÚfeature_is_cachedcó$•—i|] \}}|‰v¯ ||“Œ Srcrc)rúÚkÚvÚfeatures €ryú z%_Feature.__init__..Þs0ø€ðððÙ˜˜!°1¸GÐ3CÐ3C��!Ð3CÐ3CÐ3Cr{razfeature '%s' is disabled,Tr´)rr?r@rr`r:r)rÔrzÚfeature_supportedr§r8ržÚupdater&rØr¨r¼r¦r¶rbrÚ feature_minr�r_Úupperr‰r�) rsÚ pfeaturesÚ feature_nameÚcfeatureÚdisabledÚoptionÚovalÚmin_fÚFr¡s @ryr�z_Feature.__init__×sÖø€Ý �4Ð,Ñ -Ô -ð Ø ˆFØ-1×-GÒ-GÑ-IÔ-IÐIˆÔ Ý  §¢Ñ!1Ô!1Ñ2Ô2ð 3ð 3ˆLØ  Ô.ˆGØÔ)¨,Ô7ˆHØ �NŠNððððØ'Ÿ~š~Ñ/Ô/ðñôñ ô ð ð—{’{ 9Ñ-Ô-ˆHØÐ#Ø— ’ ˜lÑ+Ô+Ð+Ø— ’ Ø/°,Ñ>Ø Tðñôðððð 3ð 3�ð—{’{ 6Ñ*Ô*�ݘd¥CÑ(Ô(ð3Ø&*§j¢j¡l¤l�G˜F‘Oøð  3õ™5œ5ˆÔØÔ&×*Ò*¨4¬=¸"Ñ=Ô=ˆØ—’‘”×$Ò$Ñ&Ô&ð (ð (ˆAØ�DÔ*Ð*Ð*ØÔ ×$Ò$ QÑ'Ô'Ð'øà!%ˆÔÐÐr{Ncó@—|�'t|t¦«st|d¦«sJ‚|�t|t¦«sJ‚|€|j ¦«}t ¦«}|D]/}| |||¬¦«r| |¦«Œ0|S)aˆ Returns a set of CPU feature names that supported by platform and the **C** compiler. Parameters ---------- names : sequence or None, optional Specify certain CPU features to test it against the **C** compiler. if None(default), it will test all current supported features. **Note**: feature names must be in upper-case. force_flags : list or None, optional If None(default), default compiler flags for every CPU feature will be used during the test. macros : list of tuples, optional A list of C macro definitions. NrЩÚ force_flagsr²) r¦r¶rÔr§r£r8rÚfeature_is_supportedr‰)rsÚnamesr±r²Úsupported_namesrDs ryÚ feature_namesz_Feature.feature_namesùsÀð& ˆMݘu¥cÑ*Ô*ð 嘘zÑ*Ô*ð ˆMð ð Ð"¥j°½dÑ&CÔ&CÐ"Ð"ÐCØ ˆ=ØÔ*×/Ò/Ñ1Ô1ˆEÝ™%œ%ˆØð 'ð 'ˆAØ×(Ò(ؘ{°6ð)ñôð 'ð ×#Ò# AÑ&Ô&Ð&øØÐr{có@—| ¦«sJ‚||jvS)zÒ Returns True if a certain feature is exist and covered within `_Config.conf_features`. Parameters ---------- 'name': str feature name in uppercase. )Úisupperrž)rsrîs ryÚfeature_is_existz_Feature.feature_is_exists%€ð�|Š|‰~Œ~ÐЈ~Ø�tÔ)Ð)Ð)r{Fcó2‡—ˆfd„}t|||¬¦«S)az Sort a list of CPU features ordered by the lowest interest. Parameters ---------- 'names': sequence sequence of supported feature names in uppercase. 'reverse': bool, optional If true, the sorted features is reversed. (highest interest) Returns ------- list, sorted CPU features c󸕗t|t¦«r‰j|dStˆfd„|D¦«¦«}|t |¦«dz z }|S)Nrcó6•—g|]}‰j|d‘ŒS)r)r£©rúrDrss €ryrûz<_Feature.feature_sorted..sort_cb..<s&ø€ÐIÐIÐIÀ!˜Ô.¨qÔ1°*Ô=ÐIÐIÐIr{r)r¦r¶r£ÚmaxrÖ)rŸÚrankrss €ryÚsort_cbz(_Feature.feature_sorted..sort_cb8seø€Ý˜!�SÑ!Ô!ð =ØÔ-¨aÔ0°Ô<Ð<åÐIÐIÐIÐIÀqÐIÑIÔIÑJÔJˆDð •C˜‘F”F˜A‘IÑ ˆD؈Kr{)ÚreverseÚkey)Úsorted)rsr³rÀr¿s` ryÚfeature_sortedz_Feature.feature_sorted)s3ø€ð ð ð ð ð õ�e W°'Ð:Ñ:Ô:Ð:r{có.‡‡—t¦«fˆˆfd„ Št|t¦«r‰|¦«}|g}nCt|d¦«sJ‚t¦«}|D] }| ‰|¦«¦«}Œ!|s| |¦«|S)aÇ Return a set of CPU features that implied by 'names' Parameters ---------- names : str or sequence of str CPU feature name(s) in uppercase. keep_origins : bool if False(default) then the returned set will not contain any features from 'names'. This case happens only when two features imply each other. Examples -------- >>> self.feature_implies("SSE3") {'SSE', 'SSE2'} >>> self.feature_implies("SSE2") {'SSE'} >>> self.feature_implies("SSE2", keep_origins=True) # 'SSE2' found here since 'SSE' and 'SSE2' imply each other {'SSE', 'SSE2'} có •—t¦«}‰j|}| dg¦«D]P}| |¦«||vrŒ| |¦«| ‰||¦«¦«}ŒQ|S)Nr)rr£rØr‰Úunion)rîÚ_callerrrBr‹Ú get_impliesrss €€ryrÈz-_Feature.feature_implies..get_implies[s‹ø€Ý‘e”eˆGØÔ& tÔ,ˆAØ—U’U˜9 bÑ)Ô)ð Að A�Ø— ’ ˜A‘”�ؘ�<�<ðØ— ’ ˜DÑ!Ô!Ð!Ø!Ÿ-š-¨ ¨ °A°wÑ(?Ô(?Ñ@Ô@��؈Nr{rÐ)rr¦r¶rÔrÆÚdifference_update)rsr³Ú keep_originsrÚnrÈs` @ryÚfeature_impliesz_Feature.feature_impliesCsÆøø€õ0'*¡e¤eð ð ð ð ð ð ð õ �e�SÑ !Ô !ð 8Ø!�k %Ñ(Ô(ˆGØ�GˆEˆEå˜5 *Ñ-Ô-Ð .Ð .Ð-Ý‘e”eˆGØð 8ð 8�Ø!Ÿ-š-¨ ¨ °A©¬Ñ7Ô7��Øð -Ø × %Ò % eÑ ,Ô ,Ð ,؈r{có¼—t|t¦«rt|f¦«}nt|¦«}| | |¦«¦«S)z/same as feature_implies() but combining 'names')r¦r¶rrÆrÌ)rsr³s ryÚfeature_implies_cz_Feature.feature_implies_ctsN€å �e�SÑ !Ô !ð ݘ˜‘M”MˆEˆE嘑J”JˆEØ�{Š{˜4×/Ò/°Ñ6Ô6Ñ7Ô7Ð7r{có‡—t|t¦«st|d¦«sJ‚| |d¬¦«Šˆfd„|D¦«}t |¦«dkr| |d¬¦«dd…}|S) a Return list of features in 'names' after remove any implied features and keep the origins. Parameters ---------- 'names': sequence sequence of CPU feature names in uppercase. Returns ------- list of CPU features sorted as-is 'names' Examples -------- >>> self.feature_ahead(["SSE2", "SSE3", "SSE41"]) ["SSE41"] # assume AVX2 and FMA3 implies each other and AVX2 # is the highest interest >>> self.feature_ahead(["SSE2", "SSE3", "SSE41", "AVX2", "FMA3"]) ["AVX2"] # assume AVX2 and FMA3 don't implies each other >>> self.feature_ahead(["SSE2", "SSE3", "SSE41", "AVX2", "FMA3"]) ["AVX2", "FMA3"] rÐT)rÊcó•—g|]}|‰v¯|‘Œ Srcrc)rúrËrs €ryrûz*_Feature.feature_ahead..›s#ø€Ð6Ð6Ð6�q Q¨gÐ%5Ð%5�Ð%5Ð%5Ð%5r{r©rÀNr)r¦r¶rÔrÌrÖrÃ)rsr³Úaheadrs @ryÚ feature_aheadz_Feature.feature_ahead|s�ø€õ6˜5¥#Ñ&Ô&ð 嘘zÑ*Ô*ð ð ð +ð×&Ò& u¸4Ð&Ñ@Ô@ˆØ6Ð6Ð6Ð6˜EÐ6Ñ6Ô6ˆÝ ˆu‰:Œ:˜Š?ˆ?ð×'Ò'¨°tÐ'Ñ<Ô<¸R¸a¸RÔ@ˆE؈ r{cór‡‡‡—t|t¦«st|d¦«sJ‚g}|D]‡Š‰ ‰¦«Šˆˆˆfd„|D¦«}|rI‰ |‰gz¦«}‰|dd…vrŒO| |dd…d¦«| ‰¦«Œˆ|S)am same as 'feature_ahead()' but if both features implied each other and keep the highest interest. Parameters ---------- 'names': sequence sequence of CPU feature names in uppercase. Returns ------- list of CPU features sorted as-is 'names' Examples -------- >>> self.feature_untied(["SSE2", "SSE3", "SSE41"]) ["SSE2", "SSE3", "SSE41"] # assume AVX2 and FMA3 implies each other >>> self.feature_untied(["SSE2", "SSE3", "SSE41", "FMA3", "AVX2"]) ["SSE2", "SSE3", "SSE41", "AVX2"] rÐcóJ•—g|]}|‰v¯‰‰ |¦«v¯|‘Œ Src)rÌ)rúÚnnrrËrss €€€ryrûz+_Feature.feature_untied..¿sDø€ðððØØ˜�=�= Q¨$×*>Ò*>¸rÑ*BÔ*BÐ%BÐ%BðØ%BÐ%BÐ%Br{rNr)r¦r¶rÔrÌrÃÚremoverô)rsr³ÚfinalÚtiedrrËs` @@ryÚfeature_untiedz_Feature.feature_untied¢sýøøø€õ.˜5¥#Ñ&Ô&ð 嘘zÑ*Ô*ð ð ð +ðˆØð ð ˆAØ×*Ò*¨1Ñ-Ô-ˆGððððððØ"ðñôˆDðð *Ø×*Ò*¨4°1°#©:Ñ6Ô6�ؘD   œHÐ$Ð$ØØ— ’ ˜T " 1 "œX aœ[Ñ)Ô)Ð)Ø �LŠL˜‰OŒOˆOˆO؈ r{c󇇇—ˆˆfd„Št|t¦«st|¦«dkr!‰|¦«}| ¦«|S‰ |¦«}ˆfd„|D¦«}‰ |¦«S)zÝ same as `feature_implies_c()` but stop collecting implied features when feature's option that provided through parameter 'keyisfalse' is False, also sorting the returned features. cóê•—‰ |¦«}‰ |d¬¦«}t|¦«D]5\}}‰j| ‰d¦«s|d|dz…}nŒ6|S)NTrÑr)rÎrÃr‚r£rØ)Útnamesr‹rËÚ keyisfalserss €€ryÚtilz%_Feature.feature_get_til..tilÒs‹ø€à×+Ò+¨FÑ3Ô3ˆFØ×(Ò(¨¸Ð(Ñ>Ô>ˆFÝ! &Ñ)Ô)ð ð ‘��1ØÔ-¨aÔ0×4Ò4°ZÀÑFÔFðØ# D Q q¡S Dœ\�FØ�EððˆMr{rcó0•—h|]}‰|¦«D]}|’ŒŒSrcrc)rúrËÚtrßs €ryú z+_Feature.feature_get_til..ãs.ø€Ð2Ð2Ð2�q¨3¨3¨q©6¬6Ð2Ð2 a�Ð2Ð2Ð2Ð2r{)r¦r¶rÖrÀrÓrÃ)rsr³rÞrßs` `@ryÚfeature_get_tilz_Feature.feature_get_tilËs¤øøø€ð ð ð ð ð ð õ �e�SÑ !Ô !ð ¥S¨¡Z¤Z°1¢_ _Ø�C˜‘J”JˆEà �MŠM‰OŒOˆO؈Là×"Ò" 5Ñ)Ô)ˆØ2Ð2Ð2Ð2˜EÐ2Ñ2Ô2ˆØ×"Ò" 5Ñ)Ô)Ð)r{c ó¶—| |d¦«}g}|D]=}|j|}|| d| d|g¦«¦«z }Œ>|S)z€ Return a list of CPU features that required to be detected sorted from the lowest to highest interest. r,r@r?)rãr£rØ)rsr³r@rËrBs ryÚfeature_detectz_Feature.feature_detectæsj€ð ×$Ò$ UÐ,<Ñ=Ô=ˆØˆØð ;ð ;ˆAØÔ& qÔ)ˆAØ �a—e’e˜H a§e¢e¨G°a°SÑ&9Ô&9Ñ:Ô:Ñ :ˆFˆF؈ r{có —| | |¦«¦«}g}|D]B}|j|}| dg¦«}|r| |¦«sŒ=||z }ŒC| |¦«S)zi Return a list of CPU features flags sorted from the lowest to highest interest. r`)rÃrÎr£rØrcrw)rsr³r`rËrBrDs ryÚ feature_flagsz_Feature.feature_flagsòs˜€ð ×#Ò# D×$:Ò$:¸5Ñ$AÔ$AÑBÔBˆØˆØð ð ˆAØÔ& qÔ)ˆAØ—’�g˜rÑ"Ô"ˆAØð ˜D×.Ò.¨qÑ1Ô1ð ØØ �Q‰JˆEˆEØ×&Ò& uÑ-Ô-Ð-r{cóî—|€| |¦«}| d|›dd |¦«›d�¦«tj |jd| ¦«z¦«}tj |¦«s| d|¦«|  |||j dz|¬ ¦«}|s| d d ¬ ¦«|S) a­ Test a certain CPU feature against the compiler through its own check file. Parameters ---------- name : str Supported CPU feature name. force_flags : list or None, optional If None(default), the returned flags from `feature_flags()` will be used. macros : list of tuples, optional A list of C macro definitions. Nztesting feature 'z' with flags (rÑrózcpu_%s.czfeature test file is not existr ©r²rpTr´) rçr¼r•rŠr‹r˜Úlowerr%rãrÃra)rsrîr±r²rqrÁs ryÚ feature_testz_Feature.feature_tests€ð$ Ð Ø×,Ò,¨TÑ2Ô2ˆKà � Š ˆ à ˆDˆD�#—(’(˜;Ñ'Ô'Ð'Ð'ð ñ ô ð õ ”G—L’LØ Ô  *¨t¯zªz©|¬|Ñ";ñ ô ˆ õŒw�~Š~˜iÑ(Ô(ð IØ �OŠOÐ<¸iÑ HÔ HÐ Hà�~Š~Ø �{ T¤]°8Ô%<Ñ<ÀVðñ ô ˆðð 9Ø �MŠMÐ*°4ˆMÑ 8Ô 8Ð 8؈ r{có—| ¦«sJ‚|�t|t¦«sJ‚||jv}|rM| |¦«D]}| |||¬¦«sdSŒ| |||¬¦«sdS|S)aµ Check if a certain CPU feature is supported by the platform and compiler. Parameters ---------- name : str CPU feature name in uppercase. force_flags : list or None, optional If None(default), default compiler flags for every CPU feature will be used during test. macros : list of tuples, optional A list of C macro definitions. NréF)r·r¦r§r£rÌrë)rsrîr±r²Ú supportedÚimpls ryr²z_Feature.feature_is_supported*sµ€ð"�|Š|‰~Œ~ÐЈ~ØÐ"¥j°½dÑ&CÔ&CÐ"Ð"ÐCà˜DÔ2Ð2ˆ Ø ð Ø×,Ò,¨TÑ2Ô2ð !ð !�Ø×(Ò(¨¨{À6Ð(ÑJÔJð!Ø ˜5˜5ð!à×$Ò$ T¨;¸vÐ$ÑFÔFð Ø�uØÐr{c󿇗t|t¦«sJ‚‰j|}| dd¦«}|€3ˆfd„| dg¦«D¦«}|ot |¦«}|S)zM check if the feature can be auto-vectorized by the compiler rbNcó<•—g|]}‰ |g¦«‘ŒSrc)rcr¼s €ryrûz0_Feature.feature_can_autovec..Ps6ø€ðððØ,-�×"Ò" A 3Ñ'Ô'ðððr{r`)r¦r¶r£rØÚany)rsrîrBÚcanÚ valid_flagss` ryÚfeature_can_autovecz_Feature.feature_can_autovecGs�ø€õ ˜$¥Ñ$Ô$Ð%Ð%Ð$Ø Ô " 4Ô (ˆØ�eŠe�I˜tÑ$Ô$ˆØ ˆ;ððððØ12·²°wÀÑ1CÔ1CðñôˆKðÐ2¥# kÑ"2Ô"2ˆC؈ r{có¤—t|t¦«sJ‚|j|}| dg¦«}|sgS| d|z|¦«| |¦«}g}g}|D]Â}t j |j d|  ¦«z¦«}t j  |¦«s|  d|¦«|  |||jdz¦«} | r| |¦«Œ­| |¦«ŒÃ|r| d|d¬¦«|S) zÐ Return a list of supported extra checks after testing them against the compiler. Parameters ---------- names : str CPU feature name in uppercase. r:z%Testing extra checks for feature '%s'z extra_%s.czextra check file does not existr ztesting failed for checksTr´)r¦r¶r£rØr¼rçrŠr‹r•r˜rêr%rãrÃrarô) rsrîrBr:r`Ú availableÚ not_availableÚchkrqÚ is_supporteds ryÚfeature_extra_checksz_Feature.feature_extra_checksVsb€õ˜$¥Ñ$Ô$Ð$Ð$Ð$Ø Ô " 4Ô (ˆØ—u’u˜^¨RÑ0Ô0ˆ Øð ؈Ià � Š Ð=ÀÑDÀlÑSÔSÐSØ×"Ò" 4Ñ(Ô(ˆØˆ ؈ Øð *ð *ˆCÝœŸ š ØÔ$ l°S·Y²Y±[´[Ñ&@ñôˆIõ”7—>’> )Ñ,Ô,ð NØ—’Ð AÀ9ÑMÔMÐMàŸ>š>¨)°U¸T¼]È8Ô=TÑ5TÑUÔUˆLØð *Ø× Ò  Ñ%Ô%Ð%Ð%à×$Ò$ SÑ)Ô)Ð)Ð)à ð SØ �MŠMÐ5°}ÈTˆMÑ RÔ RÐ RØÐr{rcó·—| ¦«sJ‚|j |¦«}|€J‚d|zd|j›d|›d�g}|d„| dg¦«D¦«z }| dg¦«}|| |¦«z }|D]!}|d |j›d|›�d |j›d|›d�d gz }Œ"‰d krˆfd „|D¦«}d |¦«S)a" Generate C preprocessor definitions and include headers of a CPU feature. Parameters ---------- 'feature_name': str CPU feature name in uppercase. 'tabs': int if > 0, align the generated strings to the right depend on number of tabs. Returns ------- str, generated C preprocessor Examples -------- >>> self.feature_c_preprocessor("SSE3") /** SSE3 **/ #define NPY_HAVE_SSE3 1 #include Nz /** %s **/z#define ÚHAVE_z 1có—g|]}d|z‘ŒS)z #include <%s>rc)rúr2s ryrûz3_Feature.feature_c_preprocessor..›s*€ð ð ð Ø$%ˆO˜aÑ ð ð ð r{rr?z#ifndef z #define z#endifrcó •—g|] }d‰z|z‘Œ S)ú rc)rúÚlÚtabss €ryrûz3_Feature.feature_c_preprocessor..«s!ø€Ð4Ð4Ð4¨�d˜4‘i 1‘_Ð4Ð4Ð4r{ú )r·r£rØršrúr•)rsr¨rr¡ÚpreprÚ extra_defsÚedefs ` ryÚfeature_c_preprocessorz_Feature.feature_c_preprocessor}sSø€ð,×#Ò#Ñ%Ô%Ð&Ð&Ð%ØÔ(×,Ò,¨\Ñ:Ô:ˆØÐ"Ð"Ð"ð ˜<Ñ 'Ð 'Ø%)Ô%7Ð%7Ð%7¸¸¸Ð Fð ˆð ð ð Ø)0¯ª°YÀÑ)CÔ)Cð ñ ô ñ ˆð—[’[ ¨"Ñ-Ô-ˆ Ø�d×/Ò/° Ñ=Ô=Ñ=ˆ Øð ð ˆDð ˆEØ'+Ô'9Ð'9Ð'9¸4¸4Ð@Ð@Ø+/Ô+=Ð+=Ð+=¸t¸t¸tÐDØðñ ˆEˆEð �!Š8ˆ8Ø4Ð4Ð4Ð4¨eÐ4Ñ4Ô4ˆEØ�yŠy˜ÑÔÐr{©F)r)r�r‘r’r“r�rµr¸rÃrÌrÎrÓrÚrãrårrQrçrër²rôrúrrcr{ryr›r›ÉsŒ€€€€€ð ð ð &ð &ð &ðD#'°DÀð!ð!ð!ð!ðF *ð *ð *ð;ð;ð;ð;ð4/ð/ð/ð/ðb8ð8ð8ð$ð$ð$ðL'ð'ð'ðR*ð*ð*ð6 ð ð ð „Yð .ð .ñ„Yð .ð „YØ-1¸"ð%ð%ð%ñ„Yð%ðN „YØ59À"ðððñ„Yðð8 „Yð ð ñ„Yð ð „Yð#ð#ñ„Yð#ðL/ ð/ ð/ ð/ ð/ ð/ r{r›có —eZdZdZd„Zd„Zejd¦«Zd„Z ejd¦«Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„Zd„ZdS)Ú_ParseaéA helper class that parsing main arguments of `CCompilerOpt`, also parsing configuration statements in dispatch-able sources. Parameters ---------- cpu_baseline : str or None minimal set of required CPU features or special options. cpu_dispatch : str or None dispatched set of additional CPU features or special options. Special options can be: - **MIN**: Enables the minimum CPU features that utilized via `_Config.conf_min_features` - **MAX**: Enables all supported CPU features by the Compiler and platform. - **NATIVE**: Enables all CPU features that supported by the current machine. - **NONE**: Enables nothing - **Operand +/-**: remove or add features, useful with options **MAX**, **MIN** and **NATIVE**. NOTE: operand + is only added for nominal reason. NOTES: - Case-insensitive among all CPU features and special options. - Comma or space can be used as a separator. - If the CPU feature is not supported by the user platform or compiler, it will be skipped rather than raising a fatal error. - Any specified CPU features to 'cpu_dispatch' will be skipped if its part of CPU baseline features - 'cpu_baseline' force enables implied features. Attributes ---------- parse_baseline_names : list Final CPU baseline's feature names(sorted from low to high) parse_baseline_flags : list Compiler flags of baseline features parse_dispatch_names : list Final CPU dispatch-able feature names(sorted from low to high) parse_target_groups : dict Dictionary containing initialized target groups that configured through class attribute `conf_target_groups`. The key is represent the group name and value is a tuple contains three items : - bool, True if group has the 'baseline' option. - list, list of CPU features. - list, list of extra compiler flags. c 󯇗td‰jgf‰j‰jgf‰jdgf‰jdgf‰jddgf¬¦«‰_t‰d¦«rdSg‰_ g‰_ g‰_ i‰_ ‰j rdx}}‰ d¦«|�r‰ d|¦«}‰ |¦«}‰ |¦«‰_ ‰ ‰ |¦«¦«‰_ ‰ d¦«|��‰ d|¦«}ˆfd„|D¦«}| |¦«}‰ ‰ |¦«¦«‰_ t+|¦«d kr‰ d |d ¦«‰ d ¦«‰j ¦«D]y\}}‰ d |¦«| ¦«}|r| ¦«sdggf‰j |<ŒS‰ |¦«\} } } | | | f‰j |<Œzd‰_dS)NÚMAXOPT)Ú KEEP_BASELINEÚ KEEP_SORTr ÚWERRORÚAUTOVECÚparse_is_cachedzcheck requested baselineÚ cpu_baselinez&check requested dispatch-able featuresÚ cpu_dispatchcó&•—h|] }|‰jv¯ |’ŒSrc©Úparse_baseline_namesr¼s €ryrâz"_Parse.__init__..s1ø€ðððØØ˜DÔ5Ð5Ð5ðØ5Ð5Ð5r{rz skip featureszsince its part of baselinezinitialize targets groupszparse target groupFT)rjÚ_parse_policy_not_keepbaseÚ_parse_policy_keepsortÚ_parse_policy_not_keepsortÚ_parse_policy_maxoptÚ_parse_policy_werrorÚ_parse_policy_autovecÚ_parse_policiesrÔrÚparse_baseline_flagsÚparse_dispatch_namesÚparse_target_groupsrdr¼Ú_parse_arg_featuresrµrçrÃrÎÚ differencerÖr™r&r¦ÚstripÚ_parse_target_tokensr) rsrrÚbaseline_namesÚ cpu_dispatch_Úconflict_baselineÚ group_namerÚ GROUP_NAMEÚ has_baselineÚfeaturesÚ extra_flagss ` ryr�z_Parse.__init__Ýsíø€Ý#ð�dÔ5Øðð Ô+ØÔ/Øðð Ô)¨4Øðð Ô)¨4Øðð Ô*¨DØ� ðð' ñ ô ˆÔõ0 �4Ð*Ñ +Ô +ð Ø ˆFà$&ˆÔ!Ø$&ˆÔ!Ø$&ˆÔ!Ø#%ˆÔ à Œ=ð /à*.Ð .ˆL˜<à � Š Ð0Ñ1Ô1Ð1Ø Ð #Ø×3Ò3°NÀLÑQÔQˆLØ!×/Ò/° Ñ=Ô=ˆNØ(,×(:Ò(:¸>Ñ(JÔ(JˆDÔ %Ø(,×(;Ò(;Ø×&Ò& ~Ñ6Ô6ñ)ô)ˆDÔ %ð � Š Ð>Ñ?Ô?Ð?Ø Ð #Ø ×4Ò4°^À\ÑRÔRˆMððððØ(ðñôˆLð!.× 8Ò 8¸Ñ FÔ FÐ Ø(,×(;Ò(;Ø×"Ò" <Ñ0Ô0ñ)ô)ˆDÔ %õÐ$Ñ%Ô%¨Ò)Ð)Ø— ’ Ø#Ð%6Ð8Tñôðð � Š Ð1Ñ2Ô2Ð2Ø"&Ô"9×"?Ò"?Ñ"AÔ"Að ð Ñ ˆJ˜Ø �MŠMÐ.° Ñ ;Ô ;Ð ;Ø#×)Ò)Ñ+Ô+ˆJØð  §¢¡¤ð ð ˜2˜rð8�Ô(¨Ñ4ðà×)Ò)¨&Ñ1Ô1ñ 0ˆL˜( Kð˜h¨ ð4ˆDÔ $ ZÑ 0Ð 0ð $ˆÔÐÐr{cóž—| d|¦«t|¦«5}d}d}d}d}d}d}t|¦«D]š\} } | |kr| d¦«ny|dkr.|  |¦«}|dkrŒD|t |¦«z }|| z }|  |¦«}|dkr$|t |¦«t | ¦«z z }nŒ›ddd¦«n #1swxYwY|dkr| d |z¦«|dkr| d |z¦«|||…}| |¦«S) aÖ Fetch and parse configuration statements that required for defining the targeted CPU features, statements should be declared in the top of source in between **C** comment and start with a special mark **@targets**. Configuration statements are sort of keywords representing CPU features names, group of statements and policies, combined together to determine the required optimization. Parameters ---------- source : str the path of **C** source file. Returns ------- - bool, True if group has the 'baseline' option - list, list of CPU features - list, list of extra compiler flags z!looking for '@targets' inside -> rièz@targetséÿÿÿÿz*/zreached the max of linesNz(expected to find '%s' within a C commentzexpected to end with '%s')r¼r<r‚rãÚfindrÖr#) rsr½rsrÚ max_to_reachÚ start_withÚ start_posÚend_withÚend_posÚ current_lineÚlines ryÚ parse_targetsz_Parse.parse_targets/s·€ð, � Š Ð9¸6ÑBÔBÐBå �&‰\Œ\ð ˜R؈F؈LØ#ˆJ؈I؈H؈GÝ&/°¡m¤mð ð Ñ"� ˜dØ <Ò/Ð/Ø—O’OÐ$>Ñ?Ô?Ð?Ø�EØ ’?�?Ø $§ ¢ ¨*Ñ 5Ô 5�IØ  B’�Ø Ø¥ Z¡¤Ñ0�Iؘ$‘�ØŸ)š) HÑ-Ô-�ؘb’=�=Ø�s 6™{œ{­S°©Y¬YÑ6Ñ6�GØ�Eð!ð% ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð, ˜Š?ˆ?Ø �OŠOÐFÈÑSÑ TÔ TÐ TØ �bŠ=ˆ=Ø �OŠOÐ7¸(ÑBÑ CÔ CÐ Cà˜  'Ð)Ô*ˆØ×(Ò(¨Ñ0Ô0Ð0s¦B7C)Ã)C-Ã0C-z \s|,|([+-])c óŠ—t|t¦«s| d|z¦«t¦«}t t dt j|j|¦«¦«¦«}d}|D�]L}|ddvr| |d¦«|dkrd}Œ,|dkrd}Œ5|  ¦«}t¦«}|d krn¿|d kr>|j d } | s| |d ¦«|  | d g¬¦«}n{|dkr|j   ¦«}n[|dkr|j}nM||j vr| |¦«n.| |¦«s| |d|z¦«|r| |¦«}n| |¦«}d}�ŒN|S)Nzexpected a string in '%s'Tr)ú#ú$zYtarget groups and policies aren't allowed from arguments, only from dispatch-able sourcesrzú-FÚNONEÚNATIVErz-native option isn't supported by the compiler)ÚDETECT_FEATURESrr°ÚMAXÚMINz&, '%s' isn't a known feature or option)r¦r¶rãrr§r…rrbÚ_parse_regex_argr¦rarµr£r8r¥r‰r¸rÆr!) rsÚarg_nameÚ req_featuresÚfinal_featuresrrôÚtokÚTOKÚ features_tors ryr z_Parse._parse_arg_featuresfs€Ý˜,­Ñ,Ô,ð DØ �OŠOÐ7¸(ÑBÑ CÔ CÐ C噜ˆå•f˜T¥2¤8¨DÔ,AÀ<Ñ#PÔ#PÑQÔQÑRÔRˆØˆØð, ñ, ˆCØ�1Œv˜Ð#Ð#Ø—’Øð6ñôðð �cŠzˆzØ�ØØ�cŠzˆzØ�Øà—)’)‘+”+ˆCÝ™%œ%ˆKØ�fŠ}ˆ}ØØ˜’�Øœ xÔ0�ØðØ—O’O HØGñôðð#×0Ò0Ø &Ð0FÐ/Gð1ñô� � ð˜’�Ø"Ô4×9Ò9Ñ;Ô;� � ؘ’�Ø"Ô.� � à˜$Ô0Ð0Ð0Ø—O’O CÑ(Ô(Ð(Ð(à×0Ò0°Ñ5Ô5ðØŸš¨ØDÀsÑJñôððð HØ!/×!5Ò!5°kÑ!BÔ!B��à!/×!:Ò!:¸;Ñ!GÔ!G�àˆF‰FàÐr{z\s|[*,/]|([()])c ó^—t|t¦«sJ‚g}g}d}t¦«}t¦«}d}tt dt j|j|¦«¦«¦«}|s| d¦«|D�]!}|  ¦«} |d} | dvr| d¦«Œ9| dkr@|�| d¦«|  |  | ¦«¦«Œ| dkr4|�| d ¦«|  | |||¦«\}}}Œ¹| d kr&|�| d ¦«t¦«}Œå| d kr‹|€| d ¦«|  |¦«} | €#|  t|¦«¦«n6t| ¦«dkr| d} | r| |vr| | ¦«d}�Œv| dkr|�| d¦«d}�Œ—|�|  | ¦«�Œ°| | ¦«s| d| z¦«| |jvp| |jv} | r| |vr| | ¦«�Œ |  | ¦«�Œ#|�| d ¦«|r| d|d¦«| |¦«}t|¦«D]N} |j| \}}}|D]8}||vrŒ| d| ›d|›d�¦«|  |¦«Œ9ŒO|j ¦«D]@\} \}}}d}| |vr|}| d| z¦«n|}|sŒ/||||¦«\}}}ŒA|||fS)NFzexpected one token at leastr)rzr:ze+/- are 'not' allowed from target's groups or @targets, only from cpu_baseline and cpu_dispatch parmsr9zCpolicies aren't allowed inside multi-target '()', only CPU featuresr8zHtarget groups aren't allowed inside multi-target '()', only CPU featuresròz"unclosed multi-target, missing ')'róz$multi-target opener '(' wasn't foundrÚBASELINEz/baseline isn't allowed inside multi-target '()'Tzinvalid target name '%s'z skip targetsz.not part of baseline or dispatch-able featureszpolicy 'z' force enables 'ú'zpolicy '%s' is ON)r¦r¶rr§r…rrbÚ_parse_regex_targetrãr¦r‰Ú_parse_token_policyÚ_parse_token_groupÚ_parse_multi_targetÚtuplerÖrôr¸rrr¼rÚrr&)rsrÚ final_targetsr+r)ÚskippedÚpoliciesÚ multi_targetrDrEÚchÚtargetsÚ is_enabledÚpr“ÚdepsrBÚhaveÚnhaveÚfuncs ryr#z_Parse._parse_target_tokensŸsŒ€Ý˜&¥#Ñ&Ô&Ð'Ð'Ð&؈ ؈ ؈ å‘5”5ˆÝ‘5”5ˆØˆ å•f˜T¥2¤8¨DÔ,DÀfÑ#MÔ#MÑNÔNÑOÔOˆØð ;Ø �OŠOÐ9Ñ :Ô :Ð :àð> !ñ> !ˆCØ—)’)‘+”+ˆCØ�Q”ˆBØ�ZÐÐØ—’ðDñôððð�s’�ØÐ+Ø—O’Oð.ñôðð— ’ ˜T×5Ò5°cÑ:Ô:Ñ;Ô;Ð;Ð;Ø�s’�ØÐ+Ø—O’Oð.ñôðð ×'Ò'¨¨\¸=È+ÑVÔVñ9� ˜m¨[¨[à�s’�ØÐ+Ø—O’OÐ$HÑIÔIÐIÝ"™uœu� � Ø�s’�ØÐ'Ø—O’OÐ$JÑKÔKÐKØ×2Ò2°<Ñ@Ô@�Ø�?Ø—K’K¥ lÑ 3Ô 3Ñ4Ô4Ð4Ð4å˜7‘|”| qÒ(Ð(Ø")¨!¤*˜Øð6 7°-Ð#?Ð#?Ø%×,Ò,¨WÑ5Ô5Ð5Ø#� ‘ à˜*Ò$Ð$Ø#Ð/ØŸšÐ(YÑZÔZÐZØ#'�LÙàÐ+Ø ×$Ò$ SÑ)Ô)Ð)Ùà×,Ò,¨SÑ1Ô1ðFØ—O’OÐ$>ÀÑ$DÑEÔEÐEð˜4Ô4Ð4ð5ؘ4Ô4Ð4ðððØ -Ð/Ð/Ø%×,Ò,¨SÑ1Ô1Ð1Ùà— ’ ˜CÑ Ô Ð Ñ à Ð #Ø �OŠOÐ@Ñ AÔ AÐ AØ ð Ø �MŠMØ Ø@ñ ô ð ð ×+Ò+¨MÑ:Ô:ˆ õ�h‘”ð ð ˆAØÔ-¨aÔ0‰JˆAˆq�$Øð ð �ؘ�=�=ØØ— ’ � à�A�A�q�q�qðñôðð— ’ ˜Q‘”��ð ð$(Ô#7×#=Ò#=Ñ#?Ô#?ð ð Ñ ˆAÑ��e˜Q؈DØ�Hˆ}ˆ}Ø�Ø— ’ Ð1°AÑ5Ñ6Ô6Ð6Ð6à�Øð ØØ7;°tؘm¨[ñ8ô8Ñ 4ˆL˜-¨¨ð˜]¨KÐ7Ð7r{có—t|¦«dks|dd…|dkr| d¦«|dd…}||jvr0| d|z|j ¦«¦«|S)zvalidate policy tokenrr-Nrz*'$' must stuck in the begin of policy namez6'%s' is an invalid policy name, available policies are)rÖrãrr8)rsÚtokens ryrKz_Parse._parse_token_policysŒ€å ˆu‰:Œ:˜Š?ˆ?˜e B C Cœj¨E°!¬HÒ4Ð4Ø �OŠOÐHÑ IÔ IÐ IØ�a�b�b” ˆØ ˜Ô,Ð ,Ð ,Ø �OŠOØHÈ5ÑPØÔ$×)Ò)Ñ+Ô+ñ ô ð ðˆ r{c󖇇—t|¦«dks|dd…|dkr| d¦«|dd…}|j |ddgf¦«\}}}|€3| d|zdz|j ¦«¦«|rd }‰ˆfd „|D¦«z Љˆfd „|D¦«z Š|‰‰fS) zvalidate group tokenrr-Nrz)'#' must stuck in the begin of group nameFz&'%s' is an invalid target group name, zavailable target groups areTcó•—g|]}|‰v¯|‘Œ Srcrc)rúrDrOs €ryrûz-_Parse._parse_token_group..1s#ø€ÐHÐHÐH °¸-Ð1GÐ1G˜!Ð1GÐ1GÐ1Gr{có•—g|]}|‰v¯|‘Œ Srcrc)rúrDr+s €ryrûz-_Parse._parse_token_group..2s#ø€ÐHÐHÐH˜a°1¸KÐ3GÐ3G˜Ð3GÐ3GÐ3Gr{)rÖrãrrØr8)rsr\r)rOr+Ú ghas_baselineÚgtargetsÚ gextra_flagss `` ryrLz_Parse._parse_token_groupsøø€å ˆu‰:Œ:˜Š?ˆ?˜e B C Cœj¨E°!¬HÒ4Ð4Ø �OŠOÐGÑ HÔ HÐ Hà�a�b�b” ˆØ04Ô0H×0LÒ0LØ �E˜4 Ð$ñ1 ô1 Ñ-ˆ �x ð Ð Ø �OŠOØ8¸5Ñ@Ø-ñ.àÔ(×-Ò-Ñ/Ô/ñ ô ð ð ð ØˆLàÐHÐHÐHÐH XÐHÑHÔHÑHˆ ØÐHÐHÐHÐH <ÐHÑHÔHÑHˆ ؘ]¨KÐ7Ð7r{cóL‡—|s‰ d¦«tˆfd„|D¦«¦«s‰ d|¦«tˆfd„|D¦«¦«sdS‰ |¦«}|sdS‰ |¦«}t |¦«}|S)z9validate multi targets that defined between parentheses()zempty multi-target '()'có:•—g|]}‰ |¦«‘ŒSrc)r¸©rúÚtarrss €ryrûz._Parse._parse_multi_target..:s4ø€ð ð ð Ø+.ˆD× !Ò ! #Ñ &Ô &ð ð ð r{z#invalid target name in multi-targetcó4•—g|]}|‰jvp|‰jv‘ŒSrc)rrres €ryrûz._Parse._parse_multi_target..>sCø€ð ð ð ð ð�tÔ0Ð0ð1Ø�tÔ0Ð0ð ð ð r{N)rãÚallrÓrÃrN)rsrTs` ryrMz_Parse._parse_multi_target5sôø€ðð 7Ø �OŠOÐ5Ñ 6Ô 6Ð 6Ýð ð ð ð Ø29ð ñ ô ñ ô ð Lð �OŠOÐAÀ7Ñ KÔ KÐ KÝð ð ð ð ð ð  ñ ô ñ ô ð ð�4Ø×$Ò$ WÑ-Ô-ˆØð Ø�4à×%Ò% gÑ.Ô.ˆÝ˜‘.”.ˆØˆr{có,‡—g}|dd…D]j}d}t|t¦«r |‰jv}ntˆfd„|D¦«¦«}|r*| |¦«| |¦«Œk|r‰ d|¦«|||fS)zskip all baseline featuresNFcó"•—g|] }|‰jv‘Œ Srcrr¼s €ryrûz5_Parse._parse_policy_not_keepbase..Ws1ø€ðððàð˜Ô2Ð2ðððr{zskip baseline features)r¦r¶rrhrôr×r¼)rsr)rOr+rPrfÚis_bases` ryrz!_Parse._parse_policy_not_keepbaseNsØø€àˆØ    Ô#ð *ð *ˆC؈Gݘ#�sÑ#Ô#ð Ø Ô!:Ð:��õððððà ðñôñô�ðð *Ø—’˜sÑ#Ô#Ð#Ø×$Ò$ SÑ)Ô)Ð)øà ð =Ø �MŠMÐ2°GÑ <Ô <Ð <à˜]¨KÐ7Ð7r{có:—| d|d¦«|||fS)z$leave a notice that $keep_sort is onz/policy 'keep_sort' is on, dispatch-able targetszo are 'not' sorted depend on the highest interest butas specified in the dispatch-able source or the extra group)r¼©rsr)rOr+s ryrz_Parse._parse_policy_keepsortds3€à � Š Ø =¸}ðOJñ ô ð ð ˜]¨KÐ7Ð7r{có:—| |d¬¦«}|||fS)z%sorted depend on the highest interestTrÑ)rÃrms ryrz!_Parse._parse_policy_not_keepsortms'€à×+Ò+¨MÀ4Ð+ÑHÔHˆ ؘ]¨KÐ7Ð7r{cóØ—|jr| d¦«nI|jr| d¦«n,|jd}|s| dd¬¦«n||z }|||fS)z&append the compiler optimization flagsz3debug mode is detected, policy 'maxopt' is skipped.z5optimization is disabled, policy 'maxopt' is skipped.r zOcurrent compiler doesn't support optimization flags, policy 'maxopt' is skippedTr´)rXr¼rdra©rsr)rOr+r`s ryrz_Parse._parse_policy_maxoptrs˜€à Ô ð %Ø �MŠMÐOÑ PÔ PÐ PÐ PØ Œ]ð %Ø �MŠMÐQÑ RÔ RÐ RÐ Rà”M %Ô(ˆEØð %Ø— ’ ð1Ø9=ðñôððð ˜uÑ$� ؘ]¨KÐ7Ð7r{cóŽ—|jd}|s| dd¬¦«n| d¦«||z }|||fS)z#force warnings to treated as errorsr zTcurrent compiler doesn't support werror flags, warnings will 'not' treated as errorsTr´z'compiler warnings are treated as errors)rar¼rps ryrz_Parse._parse_policy_werrorƒsj€à” ˜hÔ'ˆØð !Ø �MŠMð8Ø@Dð ñ ô ð ð ð �MŠMÐCÑ DÔ DÐ DØ ˜5Ñ ˆKؘ]¨KÐ7Ð7r{có@‡—g}|dd…D]t}t|t¦«r‰ |¦«}ntˆfd„|D¦«¦«}|s*| |¦«| |¦«Œu|r‰ d|¦«|||fS)z=skip features that has no auto-vectorized support by compilerNcó:•—g|]}‰ |¦«‘ŒSrc)rô)rúrárss €ryrûz0_Parse._parse_policy_autovec..—s7ø€ðððàð×,Ò,¨QÑ/Ô/ðððr{z!skip non auto-vectorized features)r¦r¶rôrhr×rôr¼)rsr)rOr+rPrfròs` ryrz_Parse._parse_policy_autovec�sØø€àˆØ    Ô#ð $ð $ˆCݘ#�sÑ#Ô#ð Ø×.Ò.¨sÑ3Ô3��åððððà ðñôñô�ðð $Ø×$Ò$ SÑ)Ô)Ð)Ø—’˜sÑ#Ô#Ð#øà ð HØ �MŠMÐ=¸wÑ GÔ GÐ Gà˜]¨KÐ7Ð7r{N)r�r‘r’r“r�r6rr©r@r rJr#rKrLrMrrrrrrrcr{ryr r ®s€€€€€ð-ð-ð\P$ðP$ðP$ðd41ð41ð41ðl"�r”z .Ñ1Ô1Ðð6ð6ð6ðp%˜"œ*Ð%7Ñ8Ô8Ððr8ðr8ðr8ðh ð ð ð8ð8ð8ð,ððð28ð8ð8ð,8ð8ð8ð8ð8ð8ð 8ð8ð8ð" 8ð 8ð 8ð8ð8ð8ð8ð8r{r cóX—eZdZdZdd„Zd„Zd„Zd„Zd „Zdd „Z d „Z dd „Z dd„Z dd„Z dS)Ú CCompilerOptz° A helper class for `CCompiler` aims to provide extra build options to effectively control of compiler optimizations that are directly related to CPU features. Úminr½Ncó`—t |¦«t ||¦«t ||| ¦«||¦«t  |¦«t  |¦«|js|jr|  d¦«d}t |||¦«||_ ||_ t|di¦«|_|j d¦«t#|d¦«|_dS)NzSnative flag is specified through environment variables. force cpu-baseline='native'rÚsources_statusÚ hit_cache)rr�r rrÜrSr›rdrYr¼r Ú_requested_baselineÚ_requested_dispatchr¸rxr r‰rÔry)rsr£rrr+s ryr�zCCompilerOpt.__init__ªs€Ý×Ò˜ÑÔÐÝ×Ò˜D )Ñ,Ô,Ð,Ý�Š˜˜j¨$¯.ª.Ñ*:Ô*:¸LÈ,ÑWÔWÐWÝ×Ò˜DÑ!Ô!Ð!Ý×Ò˜$ÑÔÐØŒ}ð $ Ô!3ð $Ø �MŠMð.ñ ô ð ð$ˆLÝ�Š˜˜l¨LÑ9Ô9Ð9ð$0ˆÔ Ø#/ˆÔ õ& dÐ,<¸bÑAÔAˆÔà Ô×ÒÐ/Ñ0Ô0Ð0õ!  {Ñ3Ô3ˆŒˆˆr{có—|jo|jS)zF Returns True if the class loaded from the cache file )r!ry©rss ryÚ is_cachedzCCompilerOpt.is_cachedÄs€ðÔ Ð3 T¤^Ð3r{có—|jS)zE Returns a list of final CPU baseline compiler flags )rr}s ryÚcpu_baseline_flagszCCompilerOpt.cpu_baseline_flagsÊó €ðÔ(Ð(r{có—|jS)zC return a list of final CPU baseline feature names rr}s ryÚcpu_baseline_nameszCCompilerOpt.cpu_baseline_namesÐr�r{có—|jS)zC return a list of final CPU dispatch feature names )rr}s ryÚcpu_dispatch_nameszCCompilerOpt.cpu_dispatch_namesÖr�r{c ó�—i}| ¦«}| dg¦«}|D�]X}tj |¦«} |rN|  |¦«s tj || ¦«} | |vr| | ¦«| |¦«\} } } |  | || | ¦«} | D]i}|  | ||| ¬¦«}t| |  |¦«z¦«}| |g¦« |¦«Œj| r;t| |z¦«}| |g¦« |¦«| | f|j |<�ŒZg}| ¦«D]&\}}||j|t!|¦«fd|i|¤Žz }Œ'|S)a” Compile one or more dispatch-able sources and generates object files, also generates abstract C config headers and macros that used later for the final runtime dispatching process. The mechanism behind it is to takes each source file that specified in 'sources' and branching it into several files depend on special configuration statements that must be declared in the top of each source which contains targeted CPU features, then it compiles every branched source with the proper compiler flags. Parameters ---------- sources : list Must be a list of dispatch-able sources file paths, and configuration statements must be declared inside each file. src_dir : str Path of parent directory for the generated headers and wrapped sources. If None(default) the files will generated in-place. ccompiler : CCompiler Distutils `CCompiler` instance to be used for compilation. If None (default), the provided instance during the initialization will be used instead. **kwargs : any Arguments to pass on to the `CCompiler.compile()` Returns ------- list : generated object files Raises ------ CompileError Raises by `CCompiler.compile()` on compiling failure. DistutilsError Some errors during checking the sanity of configuration statements. See Also -------- parse_targets : Parsing the configuration statements of dispatch-able sources. Ú include_dirs)Únochanger£)r€Ú setdefaultrŠr‹r–Ú startswithr•rôr6Ú_generate_configÚ _wrap_targetrNrçrxr&r¬r§)rsrªÚsrc_dirr£r«Ú to_compileÚbaseline_flagsr‡Úsrcr³r)rTr+rˆrfÚtar_srcr`ÚobjectsÚsrcss ryÚ try_dispatchzCCompilerOpt.try_dispatchÜs €ð^ˆ Ø×0Ò0Ñ2Ô2ˆØ×(Ò(¨¸Ñ<Ô<ˆ àð ?ñ ?ˆCÝœŸš¨Ñ-Ô-ˆJØð 4Ø!×,Ò,¨WÑ5Ô5ðCÝ!#¤§¢¨g°zÑ!BÔ!B�JØ \Ð1Ð1ð!×'Ò'¨ Ñ3Ô3Ð3à15×1CÒ1CÀCÑ1HÔ1HÑ .ˆL˜' ;Ø×,Ò,¨Z¸¸gÀ|ÑTÔTˆHØð Að A�Ø×+Ò+¨J¸¸SÈ8Ð+ÑTÔT�ݘk¨D×,>Ò,>¸sÑ,CÔ,CÑCÑDÔD�Ø×%Ò% e¨RÑ0Ô0×7Ò7¸Ñ@Ô@Ð@Ð@àð =ݘk¨NÑ:Ñ;Ô;�Ø×%Ò% e¨RÑ0Ô0×7Ò7¸Ñ<Ô<Ð<à(4°gÐ'>ˆDÔ  Ñ $Ñ $ðˆØ%×+Ò+Ñ-Ô-ð ð ‰KˆE�4Ø Ð(�tÔ(Ø•d˜5‘k”kððØ-6ðØ:@ððñ ˆGˆGðˆr{c ó´‡—‰ d|z¦«‰ ¦«}‰ ¦«}t|¦«}t|¦«}tj |¦«}tj |¦«s/‰ d|›d�d¬¦«t j|¦«t|d¦«5}d  ˆfd„|D¦«¦«}d  ˆfd „|D¦«¦«} |  tj d ¦« ‰jd   |¦«d   |¦«|||| ¬ ¦«¦«d } |D]} | ‰ | d¬¦«dzz } Œ d } |D]I} | tj d¦« ‰j| ‰ | d¬¦«¬¦«z } ŒJ|  tj d¦« ‰j| | ¬¦«¦«ddd¦«dS#1swxYwYdS)ax Generate the dispatch header which contains the #definitions and headers for platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features. Its highly recommended to take a look at the generated header also the generated source files via `try_dispatch()` in order to get the full picture. z"generate CPU dispatch header: (%s)zdispatch header dir z does not exist, creating itTr´r6ú \ có,•—g|]}d‰j›d|›d�‘ŒS©rÿzWITH_CPU_EXPAND_(MACRO_TO_CALL(ú, __VA_ARGS__))©ršr¼s €ryrûz9CCompilerOpt.generate_dispatch_header..M óAø€ð+ð+ð+ð�AðÔ'Ð'Ð'¨¨¨ð,ð+ð+ð+r{có,•—g|]}d‰j›d|›d�‘ŒSr˜ršr¼s €ryrûz9CCompilerOpt.generate_dispatch_header..S r›r{aà /* * AUTOGENERATED DON'T EDIT * Please make changes to the code generator (distutils/ccompiler_opt.py) */ #define {pfx}WITH_CPU_BASELINE "{baseline_str}" #define {pfx}WITH_CPU_DISPATCH "{dispatch_str}" #define {pfx}WITH_CPU_BASELINE_N {baseline_len} #define {pfx}WITH_CPU_DISPATCH_N {dispatch_len} #define {pfx}WITH_CPU_EXPAND_(X) X #define {pfx}WITH_CPU_BASELINE_CALL(MACRO_TO_CALL, ...) \ {baseline_calls} #define {pfx}WITH_CPU_DISPATCH_CALL(MACRO_TO_CALL, ...) \ {dispatch_calls} rÑ)ÚpfxÚ baseline_strÚ dispatch_strÚ baseline_lenÚ dispatch_lenÚbaseline_callsÚdispatch_callsrr)rrz† #ifdef {pfx}CPU_TARGET_{name} {pre} #endif /*{pfx}CPU_TARGET_{name}*/ )r�rîÚprez¢ /******* baseline features *******/ {baseline_pre} /******* dispatch features *******/ {dispatch_pre} )r�Ú baseline_preÚ dispatch_preN)r¼rƒr…rÖrŠr‹r–r%r9r<r•r=r>r?r@ršrr›) rsÚ header_pathr$Údispatch_namesr r¡Ú header_dirrDr¢r£r¥rîr¦s ` ryÚgenerate_dispatch_headerz%CCompilerOpt.generate_dispatch_header3 sø€ð � Š Ð:¸[ÑHÑIÔIÐIà×0Ò0Ñ2Ô2ˆØ×0Ò0Ñ2Ô2ˆÝ˜>Ñ*Ô*ˆ ݘ>Ñ*Ô*ˆ å”W—_’_ [Ñ1Ô1ˆ ÝŒw�~Š~˜jÑ)Ô)ð $Ø �MŠMØO zÐOÐOÐOØð ñ ô ð õ ŒK˜ Ñ #Ô #Ð #å �+˜sÑ #Ô #ð8  qØ$Ÿ\š\ð+ð+ð+ð+ð(ð +ñ+ô+ñôˆNð %Ÿ\š\ð+ð+ð+ð+ð(ð +ñ+ô+ñôˆNð �GŠG•H”Oð%ñô÷’ØÔ&°S·X²X¸nÑ5MÔ5MØ ŸXšX nÑ5Ô5ÀLØ)¸.Ø-ð ñôñ ô ð ð(ˆLØ&ð Qð Q�Ø × ;Ò ;¸DÀqÐ ;Ñ IÔ IÈDÑ PÑP� � àˆLØ&ð ð �Ø¥¤ð1ñ!ô!÷’VØÔ+°$¸D×.ã s"€Ð4Ð4Ð4¡' $¨•C˜‘I”IÐ4Ð4Ð4r{cóB—g|]\}}|D]\}}t|¦«‘ŒŒSrcr·)rúr“ÚrowsÚcols ryrûz'CCompilerOpt.report..ä s3€ÐFÐFÐF¡  DÀÐFÐF±v°s¸A•C˜‘H”HÐFÐFÐFÐFr{z z: r)rôrVr_rWr`rdÚreprrzrƒr•r€rúr{r…rxr&r‰rÃr¦r¶rÖrçrÌrår½) rsÚfullÚreportÚ platform_rowsÚ baseline_rowsÚ dispatch_rowsr$r�r:rîr¨Útarget_sourcesr½r“rTrfÚ generatedrªÚ pretty_namer`rr@r�rÚsecs_lenÚcols_lenÚtabÚpadÚsecrºr»r/s ryr¾zCCompilerOpt.report† s¿€ØˆØˆ ؈ ؈ Ø� Š �z =Ð1Ñ2Ô2Ð2Ø� Š �hÑÔÐØ� Š �~ }Ð5Ñ6Ô6Ð6Ø� Š �hÑÔÐØ� Š �~ }Ð5Ñ6Ô6Ð6ð ×Ò˜nØ!Ô.Ð AˆMˆM°D´Mð ñ ô ð ð ×Ò˜jØ!œ_Ð @ˆKˆK°D´Lð ñ ô ð ð Œ=ð PØ × Ò Ð!GÑ HÔ HÐ HÐ Hà × Ò  +­t°DÔ4LÑ/MÔ/MÐ!NÑ OÔ OÐ Oà×0Ò0Ñ2Ô2ˆØ×ÒØ °NÐN˜Ÿš Ñ0Ô0Ð0Èð ñ ô ð ð×0Ò0Ñ2Ô2ˆØ×ÒØ °.ÐL�c—h’h˜~Ñ.Ô.Ð.Àfð ñ ô ð ðˆ Ø"ð <ð <ˆDØ ˜D×5Ò5°dÑ;Ô;Ñ ;ˆLˆLØ×ÒØ °|ÐO˜SŸXšX lÑ3Ô3Ð3Èð ñ ô ð ð Œ=ð PØ × Ò Ð!GÑ HÔ HÐ HÐ Hà × Ò  +­t°DÔ4LÑ/MÔ/MÐ!NÑ OÔ OÐ Oà×0Ò0Ñ2Ô2ˆØ×ÒØ °NÐN˜Ÿš Ñ0Ô0Ð0Èð ñ ô ð ðˆØ$(Ô$7×$=Ò$=Ñ$?Ô$?ð Bð BÑ ˆF‘L�Q˜Øð Bð B�Ø×)Ò)¨#¨rÑ2Ô2×9Ò9¸&ÑAÔAÐAÐAð Bðð 4˜>ð 4؈IØ×*Ò*¨>Ñ:Ô:ð ;ð ;�Ø(¨Ô-�Ý(¨­cÑ2Ô2ÐN�s�s¸ÀÇÂÈ#ÁÄÑ8N�ؘT G­c°'©l¬lÑ$:Ñ:Ñ:� � Ø × Ò  +ÀÐ/V¨y¸¸"¸¬~¨~ÐPVÐ!WÑ XÔ XÐ XÑ Xà × Ò Ð!2Ñ 3Ô 3Ð 3Ø×*Ò*¨>Ñ:Ô:ð 4ñ 4�Ø(¨Ô-�Ý%/°µSÑ%9Ô%9ÐU˜c˜c¸vÈÏÊÐQTÉ Ì Ñ?U� ØŸš ×!3Ò!3°CÑ!8Ô!8Ñ9Ô9�ØŸ(š( 4×#6Ò#6°t×7KÒ7KÈCÑ7PÔ7PÑ#QÔ#QÑRÔR�ØŸš $×"5Ò"5°cÑ":Ô":Ñ;Ô;�Ø!� Ý'1°#µsÑ';Ô';ÐD˜c˜V˜VÀðDðD�DØ  D×$=Ò$=¸dÑ$CÔ$CÑC�L�LØ:FÐ R §¢¨Ñ 6Ô 6Ð 6ÈF� à×$Ò$ XÑ.Ô.Ð.Ø×$Ò$ k°7Ð%;Ñ<Ô<Ð<Ø×$Ò$ g¨uÐ%5Ñ6Ô6Ð6Ø×$Ò$ n°lÐ%CÑDÔDÐDØ×$Ò$ h°Ð%7Ñ8Ô8Ð8Ø"ð4ð4�CØ!×(Ò(¨"¨c¨Ñ3Ô3Ð3Ð3ñ4ð ˆØ4Ð4¨VÐ4Ñ4Ô4ˆØFÐF¨FÐFÑFÔFˆØˆÝ•3�x‘=”=¥# h¡-¤-Ñ0Ô0ˆØð 4ð 4‰IˆC�Øð Ø— ’ ˜B‘”�ØØ �3˜#¥ C¡¤™.Ñ)Ñ )ˆCØ �KŠK˜˜c™  DÑ(Ñ )Ô )Ð )Ø ð 4ð 4‘��SØ�s˜c¥C¨¡H¤H™nÑ-Ñ-�Ø— ’ ˜C #™I¨Ñ,¨sÑ2Ñ3Ô3Ð3Ð3ð 4ð�yŠy˜‰ŒÐr{c óî‡ —t|ttf¦«sJ‚t|t¦«r|x}}n*d |¦«}d |¦«}tj |tj |¦«¦«}djgtj |¦«¢|  ¦«‘RŽ}|r!tj  |¦«r|S|  d|¦«|  |  |¦«¦«}d|jzŠ ˆ fd„|D¦«} d | ¦«} t|d¦«5} |  t#jd ¦« |j|tj |¦«| ¬ ¦«¦«ddd¦«n #1swxYwY|S) Nú.Ú__z {0}.{2}{1}zwrap dispatch-able target -> z#define %sCPU_TARGET_có•—g|]}‰|z‘ŒSrcrc)rúrDÚ target_joins €ryrûz-CCompilerOpt._wrap_target.. sø€Ð9Ð9Ð9¨1�{ Q‘Ð9Ð9Ð9r{rr6aR /** * AUTOGENERATED DON'T EDIT * Please make changes to the code generator (distutils/ccompiler_opt.py) */ #define {pfx}CPU_TARGET_MODE #define {pfx}CPU_TARGET_CURRENT {target_name} {target_defs} #include "{path}" )r�Ú target_namer‹Ú target_defs)r¦r¶rNr•rŠr‹Úbasenamer@Úsplitextrêr%r¼rÃrÎr›r<r=r>r?Úabspath) rsr³Ú dispatch_srcÚtargetrˆÚext_namerÏÚ wrap_pathr*rÐrsrÎs @ryrŒzCCompilerOpt._wrap_targetó sø€Ý˜&¥3­ ,Ñ/Ô/Ð0Ð0Ð/Ý �f�cÑ "Ô "ð ,Ø%+Ð +ˆH�{�{ð—x’x Ñ'Ô'ˆHØŸ)š) FÑ+Ô+ˆKå”G—L’L ­R¬W×-=Ò-=¸lÑ-KÔ-KÑLÔLˆ Ø'�LÔ'ÐW­¬×)9Ò)9¸)Ñ)DÔ)DÐWÀhÇnÂnÑFVÔFVÐWÐWÐWˆ Ø ð �œŸš yÑ1Ô1ð ØÐ à � Š Ð5°yÑAÔAÐAà×&Ò& t×'=Ò'=¸fÑ'EÔ'EÑFÔFˆØ-°Ô0CÑCˆ Ø9Ð9Ð9Ð9°Ð9Ñ9Ô9ˆ Ø—i’i  Ñ,Ô,ˆ å �)˜SÑ !Ô !ð  RØ �HŠH•X”_ð &ñ ô ÷’ØÔ'°[Ý”W—_’_ \Ñ2Ô2À ðñôñ ô ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðÐsÅ=A!G*Ç*G.Ç1G.c ó—tj |¦«}tj |¦«ddz}tj ||¦«}| ||¦«} t |¦«5}| ¦« d¦«}t|¦«dkr't|d¦«|kr ddd¦«dSddd¦«n #1swxYwYn#t$rYnwxYwtj tj  |¦«d¬¦«| d|¦«g} |D]‘} t| t ¦«r| } nd  d „| D¦«¦«} | | ¦«} d  d „| D¦«¦«} |  d |j›d| ›d| ›d�¦«Œ’d | ¦«} |r d|jz} nd} t |d¦«5}| t+jd¦« |j| | |¬¦«¦«ddd¦«n #1swxYwYdS)Nrz.hz cache_hash:rrT)Úexist_okzgenerate dispatched config -> rÌcó—g|]}|‘ŒSrcrc)rúrás ryrûz1CCompilerOpt._generate_config../ s€Ð(8Ð(8Ð(8¨q¨Ð(8Ð(8Ð(8r{z&&có—g|]}d|z‘ŒS)zCHK(%s)rc)rúrDs ryrûz1CCompilerOpt._generate_config..1 s)€ð$ð$ð$Ø"#� ˜A‘ ð$ð$ð$r{rÿzCPU_DISPATCH_EXPAND_(CB((z), r™r–z( %sCPU_DISPATCH_EXPAND_(CB(__VA_ARGS__))rr6aZ // cache_hash:{cache_hash} /** * AUTOGENERATED DON'T EDIT * Please make changes to the code generator (distutils/ccompiler_opt.py) */ #ifndef {pfx}CPU_DISPATCH_EXPAND_ #define {pfx}CPU_DISPATCH_EXPAND_(X) X #endif #undef {pfx}CPU_DISPATCH_BASELINE_CALL #undef {pfx}CPU_DISPATCH_CALL #define {pfx}CPU_DISPATCH_BASELINE_CALL(CB, ...) \ {baseline_calls} #define {pfx}CPU_DISPATCH_CALL(CHK, CB, ...) \ {dispatch_calls} )r�r¢r£r#F)rŠr‹rÑrÒr•r#r<ÚreadlinerbrÖÚintr€r9r–r¼r¦r¶rårôr›r=r>r?r@)rsr³rÔrTr)Ú config_pathr#rDÚ last_hashr£rfrÏÚ req_detectr¢rss ryr‹zCCompilerOpt._generate_config sD€Ý”g×&Ò& |Ñ4Ô4ˆ Ý”g×&Ò& {Ñ3Ô3°AÔ6¸Ñ=ˆ Ý”g—l’l :¨{Ñ;Ô;ˆ à—_’_ W¨lÑ;Ô;ˆ ð Ý�kÑ"Ô"ð  aØŸJšJ™LœL×.Ò.¨}Ñ=Ô=� Ý�y‘>”> QÒ&Ð&­3¨y¸¬|Ñ+<Ô+<À Ò+JÐ+JØð ð ð ñ ô ð ð ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõð ð ð Ø ˆDð øøøõ Œ •B”G—O’O KÑ0Ô0¸4Ð@Ñ@Ô@Ð@à � Š Ð6¸ ÑDÔDÐD؈Øð ð ˆCݘ#�sÑ#Ô#ð :Ø!� � à"ŸišiÐ(8Ð(8°CÐ(8Ñ(8Ô(8Ñ9Ô9� Ø×,Ò,¨SÑ1Ô1ˆJØŸšð$ð$Ø'1ð$ñ$ô$ñôˆJð × !Ò !Ð !àÔ#Ð#Ð# Z Z Z°°°ðñ ô ð ð ð!Ÿš nÑ5Ô5ˆà ð à;ØÔ#ñ$ˆNˆNð ˆNå �+˜sÑ #Ô #ð  rØ �HŠH•X”_ð&ñô÷’ØÔ'¸Ø-¸*ðñôñ ô ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð(ˆusPÁ?DÂAC<Ã# DÃ0 DÃ<DÄDÄDÄDÄ DÄDÈ+AI;É;I?ÊI?)rvr½N)NNr)r�r‘r’r“r�r~r€rƒr…r”rªr¾rŒr‹rcr{ryruru¤sÜ€€€€€ððð 4ð4ð4ð4ð44ð4ð4ð )ð)ð)ð )ð)ð)ð )ð)ð)ð UðUðUðUðnQðQðQðfkðkðkðkðZ$ð$ð$ð$ðL<ð<ð<ð<ð<ð<r{ruc ó°—t|fi|¤Ž}tj |¦«r| ¦«s| |¦«|S)aÏ Create a new instance of 'CCompilerOpt' and generate the dispatch header which contains the #definitions and headers of platform-specific instruction-sets for the enabled CPU baseline and dispatch-able features. Parameters ---------- compiler : CCompiler instance dispatch_hpath : str path of the dispatch header **kwargs: passed as-is to `CCompilerOpt(...)` Returns ------- new instance of CCompilerOpt )rurŠr‹r%r~rª)rÍÚdispatch_hpathr«r s ryÚnew_ccompiler_optrãW sW€õ" �xÐ *Ð * 6Ð *Ð *€CÝ Œ7�>Š>˜.Ñ )Ô )ð5°·²±´ð5Ø ×$Ò$ ^Ñ4Ô4Ð4Ø €Jr{)r“r‡rürŠr:rr r>rr r'rrSr›r rurãrcr{ryúräsØððEðEð€ € € Ø€€€Ø € € € Ø € € € Ø € € € ØÐÐÐØ€€€ðxðxðxðxðxñxôxðxðtx ðx ðx ðx ðx ñx ôx ðx ðt€ ðFðFðFðFðFñFôFðFðPwðwðwðwðwñwôwðwðr c ðc ðc ðc ðc ñc ôc ðc ðJt8ðt8ðt8ðt8ðt8ñt8ôt8ðt8ðlqðqðqðqðq�7˜J¨° ¸HÀfñqôqðqðf ððððr{