1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
U
O±d&¯ã @s@ddlZddlZddlZddlZddlZddlmZmZmZddl    m
Z
d+dd„Z Gdd„dƒZ Gd    d
„d
e ƒZ Gd d „d e ƒZGd d„de ƒZGdd„de ƒZGdd„de ƒZGdd„de ƒZdZdZdZeeZee eeeededeeeiZe ¡D]@\ZZerejndZe d¡Zeeƒdkr>dd  e¡›dZnedZdZ!e"ƒZ#esdd e›d!Z!nFejszd e›d"Z!n0ej$s’d e›d#e#d$<ej%sªd e›d%e#d&<e ¡D]„\Z&Z'e&D]tZ(e# )e(e!¡Z*e'fZ+e"eee(ed'Z,e-d(e'j.›d)e›d)e›d)e(›e+e,ƒZ/e*r$ej0j!e*d*e/ƒe/e1ƒe/j.<q¾q²qødS),éN)ÚtargetsÚclear_floatstatusÚget_floatstatus)Ú__cpu_baseline__FcCsftƒ}|s|o|d@dk}||s$|o.|d@dkO}||s<|oF|d@dkO}||sT|o^|d@dkO}|S)Nérééé)r)Z    divbyzeroZoverflowZ    underflowÚinvalidÚallÚerrÚret©rúQd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\numpy/core/tests/test_simd.pyÚcheck_floatstatus    s rc@s’eZdZdZdZdZdd„Zd!dd„Zdd„Zd    d
„Z    d d „Z
d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „ZdS)"Ú _Test_UtilityNcCst|j|d|jƒS)zŽ
        To call NPV intrinsics without the attribute 'npyv' and
        auto suffixing intrinsics according to class attribute 'sfx'
        Ú_©ÚgetattrÚnpyvÚsfx)ÚselfÚattrrrrÚ __getattr__sz_Test_Utility.__getattr__FcCsR|dkr d}|dkr|j}t|||ƒ}|r4t|ƒ}| ¡rJdd„|DƒSt|ƒS)z[
        Create list of consecutive numbers according to number of vector's lanes.
        NrcSsg|] }|d‘qS)çð?r©Ú.0ÚxrrrÚ
<listcomp>2sz'_Test_Utility._data.<locals>.<listcomp>)ÚnlanesÚrangeÚreversedÚ_is_fpÚlist©rÚstartÚcountÚreverseÚrngrrrÚ_data&sz_Test_Utility._datacCs|jddkS)NrÚu©r©rrrrÚ _is_unsigned5sz_Test_Utility._is_unsignedcCs|jddkS)NrÚsr+r,rrrÚ
_is_signed8sz_Test_Utility._is_signedcCs|jddkS)NrÚfr+r,rrrr";sz_Test_Utility._is_fpcCst|jdd…ƒS)Nr)Úintrr,rrrÚ _scalar_size>sz_Test_Utility._scalar_sizecs0| ¡r |S| ¡‰| ¡‰‡‡fdd„|DƒS)Ncsg|]}tt|ˆƒˆƒ‘qSr)ÚminÚmax)rÚv©Zmax_intZmin_intrrrFsz+_Test_Utility._int_clip.<locals>.<listcomp>)r"Ú_int_maxÚ_int_min)rÚseqrr6rÚ    _int_clipAs
z_Test_Utility._int_clipcCs4| ¡r dS| | d¡¡d}| ¡r0|dS|S)Néÿÿÿÿrr)r"Ú _to_unsignedÚsetallr/)rZmax_urrrr7Hs z_Test_Utility._int_maxcCs&| ¡r dS| ¡rdS| ¡d S)Nrr)r"r-r7r,rrrr8Ps
z_Test_Utility._int_mincCs&t|jd|jdd…ƒdƒ}|dS)NÚsetall_urr;rr)rZ    max_unsigrrrÚ
_true_maskWsz_Test_Utility._true_maskcCstt|ttfƒr,t|jd|jdd…ƒ|ƒS|j dd¡}|ddkrLd}nd}t|j| |dd…|¡ƒ|ƒSdS)    NÚload_urÚnpyv_ÚrÚbz cvt_u{0}_b{0}zreinterpret_u{0}_{1})    Ú
isinstancer#ÚtuplerrrÚ__name__ÚreplaceÚformat)rÚvectorrZ
cvt_intrinrrrr<[s z_Test_Utility._to_unsignedcCstdƒS©NÚinf©Úfloatr,rrrÚ
_pinfinityfsz_Test_Utility._pinfinitycCs
tdƒ SrJrLr,rrrÚ
_ninfinityisz_Test_Utility._ninfinitycCstdƒS)NÚnanrLr,rrrÚ_nanlsz_Test_Utility._nancCs(|j}|dkrt}n
| d¡}d |¡S)NZbaselineÚ__ú )Ú target_namerÚsplitÚjoin)rÚtargetrrrÚ _cpu_featuresos
 
z_Test_Utility._cpu_features)NNF)rFÚ
__module__Ú __qualname__rrrTrr)r-r/r"r2r:r7r8r?r<rNrOrQrXrrrrrs$
 rc@s~eZdZdZdd„Zddd„Zdd    „Zd
d „Zd d „Zdd„Z    e
j   dddg¡e
j   dddgddgdgdgf¡dd„ƒƒZ dS)Ú
_SIMD_BOOLz2
    To test all boolean vector types at once
    cCst|jd|jdd…ƒS)NZnlanes_urrr,rrrÚ_nlanes{sz_SIMD_BOOL._nlanesNFcs2| ¡‰t| ¡ƒ}|r t|ƒ}‡fdd„|DƒS)Ncsg|]}|drˆnd‘qS)rrrr©Ú    true_maskrrrƒsz$_SIMD_BOOL._data.<locals>.<listcomp>)r?r r\r!r$rr]rr)~s
 z_SIMD_BOOL._datacCsB|jdd…}t|jd|ƒ}t|jd|›d|›ƒ}|||ƒƒS)Nrr@Zcvt_bZ_u)rrr)rÚdataÚlen_strÚloadÚcvtrrrÚ_load_b…sz_SIMD_BOOL._load_bcCsz| ¡}|jdd}| |¡}| |¡}dd„t||ƒDƒ}t|dƒ||ƒ}||ksXt‚dd„t||ƒDƒ}t|dƒ||ƒ}||ksˆt‚dd„t||ƒDƒ}    t|d    ƒ||ƒ}
|
|    ks¸t‚t|d
ƒ|ƒ} | |ksÒt‚|jd kràd Sd d„t||ƒDƒ} t|dƒ||ƒ} | | kst‚dd„t||ƒDƒ}t|dƒ||ƒ}||ksDt‚dd„t||ƒDƒ}t|dƒ||ƒ}||ksvt‚d S)zÏ
        Logical operations for boolean types.
        Test intrinsics:
            npyv_xor_##SFX, npyv_and_##SFX, npyv_or_##SFX, npyv_not_##SFX,
            npyv_andc_b8, npvy_orc_b8, nvpy_xnor_b8
        T©r'cSsg|]\}}||@‘qSrr©rÚarCrrrr—sz5_SIMD_BOOL.test_operators_logical.<locals>.<listcomp>ÚandcSsg|]\}}||B‘qSrrrerrrr›sÚorcSsg|]\}}||A‘qSrrrerrrrŸsÚxorÚnotÚb8NcSsg|]\}}||@d@‘qS©éÿrrerrrrªsÚandccSsg|]\}}||Bd@‘qSrlrrerrrr®sZorccSsg|]\}}||Ad@‘qSrlrrerrrr²sZxnor)r)rcÚziprÚAssertionErrorr)rÚdata_aÚdata_bÚvdata_aÚvdata_bÚdata_andÚvandÚdata_orÚvorÚdata_xorÚvxorÚvnotÚ    data_andcÚvandcZdata_orcZvorcZ    data_xnorZvxnorrrrÚtest_operators_logical‹s4 
 
 
z!_SIMD_BOOL.test_operators_logicalcCsZdd„}| ¡|jddfD]8}| |¡}||ƒ}| |¡}t|ƒ}|t|ƒkst‚qdS)NcSstdd„t|dƒDƒƒS)NcSs g|]\}}t|dkƒ|>‘qS)r©r1)rÚirrrrr·sz<_SIMD_BOOL.test_tobits.<locals>.<lambda>.<locals>.<listcomp>r)ÚsumÚ    enumerate)r_rrrÚ<lambda>·óz(_SIMD_BOOL.test_tobits.<locals>.<lambda>Trd)r)rcÚtobitsÚbinrp)rZ    data2bitsr_ÚvdataZ    data_bitsr…Z
bin_tobitsrrrÚ test_tobits¶s
 
z_SIMD_BOOL.test_tobitsc    Cs
|jdkrdS| ¡}|jdd}| |¡}| |¡}t|jd|j›ƒ}|jdkrzdd„t|ƒt|ƒDƒ}|||ƒ}n~|jd    kr¶d
d„d t|ƒd t|ƒDƒ}|||||ƒ}nB|jd krød d„dt|ƒdt|ƒDƒ}|||||||||ƒ}||kst‚dS)z 
        Pack multiple vectors into one
        Test intrinsics:
            npyv_pack_b8_b16
            npyv_pack_b8_b32
            npyv_pack_b8_b64
        )Úb16Úb32Úb64NTrdZpack_b8_r‰cSsg|] }|d@‘qSrlr©rr€rrrrÓsz(_SIMD_BOOL.test_pack.<locals>.<listcomp>rŠcSsg|] }|d@‘qSrlrrŒrrrrÖsrr‹cSsg|] }|d@‘qSrlrrŒrrrrÙsr)rr)rcrrr#rp)rr_Úrdatar‡ZvrdataZ    pack_simdZspackZvpackrrrÚ    test_pack¿s,
 
 
 
 
"
"
ÿz_SIMD_BOOL.test_packÚintrinÚanyr r_r;rcCsD| || ¡¡}t|ƒ}t||ƒ}||ƒ}||ƒ}||ks@t‚dS©zX
        Test intrinsics:
            npyv_any_##SFX
            npyv_all_##SFX
        N)rcr\Úevalrrp©rrr_rqÚfuncÚdesiredÚsimdrrrÚtest_operators_crosstestÞs 
z#_SIMD_BOOL.test_operators_crosstest)NNF)rFrYrZÚ__doc__r\r)rcr~rˆrŽÚpytestÚmarkÚ parametrizer—rrrrr[ws
+    ür[c@sHeZdZdZdd„Zdd„Zdd„Zej     dd    d
d d d g¡dd„ƒZ
dS)Ú    _SIMD_INTz2
    To test all integer vector types at once
    c s6|jdkrdS| | ¡|j¡}|j| ¡dd}| |¡| |¡}}t| ¡ƒD]d‰| ‡fdd„|Dƒ¡}| |ˆ¡}||ksŠt    ‚| ‡fdd„|Dƒ¡}| 
|ˆ¡}||ksVt    ‚qVtd| ¡ƒD]f‰| ‡fdd„|Dƒ¡}|  |ˆ¡}    |    |kst    ‚| ‡fd    d„|Dƒ¡}|  |ˆ¡}
|
|ksÊt    ‚qÊdS)
N)Úu8Ús8Trdcsg|] }|ˆ>‘qSrr©rrf©r&rrrsz2_SIMD_INT.test_operators_shift.<locals>.<listcomp>csg|] }|ˆ?‘qSrrrŸr rrrsrcsg|] }|ˆ>‘qSrrrŸr rrr scsg|] }|ˆ?‘qSrrrŸr rrrs) rr)r7rr8rar r2ÚshlrpÚshrÚshliÚshri) rrqrrrsrtZ
data_shl_ar¡Z
data_shr_ar¢r£r¤rr rÚtest_operators_shiftös&
     z_SIMD_INT.test_operators_shiftc    Cs²|jdkrdS| | ¡|j¡}|j| ¡dd}| |¡| |¡}}| dd„t||ƒDƒ¡}| ||¡}||ks|t    ‚| dd„t||ƒDƒ¡}| 
||¡}||ks®t    ‚dS)N)Úu32Ús32Úu64Ús64TrdcSsg|]\}}||‘qSrrrerrrrsz>_SIMD_INT.test_arithmetic_subadd_saturated.<locals>.<listcomp>cSsg|]\}}||‘qSrrrerrrr#s) rr)r7rr8rar:roÚaddsrpÚsubs)    rrqrrrsrtZ    data_addsrªZ    data_subsr«rrrÚ test_arithmetic_subadd_saturateds
   z*_SIMD_INT.test_arithmetic_subadd_saturatedc    Cs†| ¡}| |j¡}| |¡| |¡}}dd„t||ƒDƒ}| ||¡}||ksVt‚dd„t||ƒDƒ}| ||¡}||ks‚t‚dS)NcSsg|]\}}t||ƒ‘qSr)r4rerrrr,sz/_SIMD_INT.test_math_max_min.<locals>.<listcomp>cSsg|]\}}t||ƒ‘qSr)r3rerrrr0s)r)rraror4rpr3)    rrqrrrsrtZdata_maxZsimd_maxZdata_minZsimd_minrrrÚtest_math_max_min's    z_SIMD_INT.test_math_max_minr%iœÿÿÿiðØÿÿrédi'cCs@| | |¡¡}| |¡t|ƒks&t‚| |¡t|ƒks<t‚dS)zf
        Test intrinsics:
            npyv_reduce_max_##sfx
            npyv_reduce_min_##sfx
        N)rar)Z
reduce_maxr4rpZ
reduce_minr3)rr%rsrrrÚtest_reduce_max_min4sz_SIMD_INT.test_reduce_max_minN) rFrYrZr˜r¥r¬r­r™ršr›r¯rrrrrœòs ! rœc@seZdZdZdd„ZdS)Ú
_SIMD_FP32z'
    To only test single precision
    csv| ¡}|jjs&t d|¡r&dd„‰nt‰| | ¡¡}| ||     d¡¡}‡fdd„|Dƒ}| 
|¡}||ksrt ‚dS)úš
        Round to nearest even integer, assume CPU control register is set to rounding.
        Test intrinsics:
            npyv_round_s32_##SFX
        z.*(NEON|ASIMD)cSst||dkrdndƒS)Nrçà?çà¿r)r5rrrrƒNr„z-_SIMD_FP32.test_conversions.<locals>.<lambda>r²csg|] }ˆ|ƒ‘qSrrr©Ú_roundrrrSsz/_SIMD_FP32.test_conversions.<locals>.<listcomp>N) rXrÚsimd_f64ÚreÚmatchÚroundrar)Úsubr=Ú    round_s32rp)rÚfeaturesrsÚ
data_roundÚvroundrr´rÚtest_conversionsDs
 
z_SIMD_FP32.test_conversionsN©rFrYrZr˜r¿rrrrr°@sr°c@seZdZdZdd„ZdS)Ú
_SIMD_FP64z'
    To only test double precision
    cCsh| | ¡¡}| || d¡¡}| || d¡¡}dd„t|ƒt|ƒDƒ}| ||¡}||ksdt‚dS)r±r²gø¿cSsg|] }t|ƒ‘qSr)r¹rrrrrdsz/_SIMD_FP64.test_conversions.<locals>.<listcomp>N)rar)rºr=Úmulr#r»rp)rrsrtr½r¾rrrr¿[s  z_SIMD_FP64.test_conversionsNrÀrrrrrÁWsrÁc @sjeZdZdZdd„Zdd„Zdd„Zdd    „Zej     
d
d e j fd e j fd e jfdefg¡dd„ƒZej     
dddddddg¡dd„ƒZdd„Zdd„Zej     
ddd d d g¡dd „ƒZej     
d!ejd"fejd#fejd$fejd%fejd&fejd'fg¡d(d)„ƒZej     
dd*d+g¡ej     
d,ed-ƒd.gd.ed-ƒged-ƒd/gd/ed-ƒged-ƒed-ƒgd0d1gd1d0gd2d1gf¡d3d4„ƒƒZd5S)6Ú_SIMD_FPz0
    To test all float vector types at once
    c CsØ| | ¡¡gd\}}}| ||¡}| dd„t|||ƒDƒ¡}| |||¡}||ks\t‚| |||¡}| ||¡}||ks‚t‚| |||¡}    | ||¡}
|    |
ks¨t‚|     |||¡} | 
||  d¡¡} | | ksÔt‚dS)NécSsg|]\}}}|||‘qSrr)rrfrCÚcrrrrpsz2_SIMD_FP.test_arithmetic_fused.<locals>.<listcomp>r;) rar)ÚaddroZmuladdrpZmulsubrºZnmuladdZnmulsubrÂr=) rrsrtZvdata_cZ    vdata_cx2Zdata_fmaÚfmaZfmsZdata_fmsZnfmaZ    data_nfmaZnfmsZ    data_nfmsrrrÚtest_arithmetic_fusedls      z_SIMD_FP.test_arithmetic_fusedc Cs²| ¡| ¡| ¡}}}| ¡}| | ¡¡}d||f||f||ff}|D]:\}}|g|j}    | | |¡¡}
|
tj    |    ddksNt
‚qN| |  || d¡¡¡}
|
|ks®t
‚dS)N)rrT©Znan_okr;) rNrOrQr)rarÚabsr=r™ÚapproxrprÂ) rÚpinfÚninfrPr_r‡Z    abs_casesÚcaser•Zdata_absZvabsrrrÚtest_abs€s  z_SIMD_FP.test_absc Csº| ¡| ¡| ¡}}}| ¡}| | ¡¡}ddd|f||f||ff}|D]:\}}|g|j}    | | |¡¡}
|
tj    |    ddksPt
‚qP| dd„|Dƒ¡}    | |¡}
|
|    ks¶t
‚dS)N)ç€rÐ)çrÑgð¿TrÉcSsg|]}t |¡‘qSr)ÚmathÚsqrtrrrrr™sz&_SIMD_FP.test_sqrt.<locals>.<listcomp>) rNrOrQr)rarrÓr=r™rËrp) rrÌrÍrPr_r‡Z
sqrt_casesrÎr•Z    data_sqrtrÓrrrÚ    test_sqrtŽs  
z_SIMD_FP.test_sqrtc Cs°| ¡| ¡| ¡}}}| ¡}| | ¡¡}||f||f||ff}|D]:\}}|g|j}    | | |¡¡}
|
tj    |    ddksLt
‚qLdd„|Dƒ}    | |¡}
|
|    ks¬t
‚dS)NTrÉcSsg|] }||‘qSrrrrrrr¨sz(_SIMD_FP.test_square.<locals>.<listcomp>) rNrOrQr)rarÚsquarer=r™rËrp) rrÌrÍrPr_r‡Z square_casesrÎr•Z data_squarerÕrrrÚ test_squares  
z_SIMD_FP.test_squarez intrin, funcÚceilÚtruncÚfloorZrintcsp|}t||ƒ}| ¡| ¡| ¡}}}||f||f||ff}|D]8\}}    |    g|j}
|| |¡ƒ} | tj|
ddksDt‚qDt    dddƒD]T‰dD]J‰| 
‡‡fdd„t    |jƒDƒ¡} ‡fd    d„| Dƒ}
|| ƒ} | |
ks’t‚q’qŠd
D]4} | | ¡‰|ˆƒ}‡fd d„ˆDƒ}
||
ksät‚qä|d kr*d }nd}|D]8‰|  || ˆ¡ƒ¡} |  | d¡¡}
| |
ks2t‚q2dS)z“
        Test intrinsics:
            npyv_rint_##SFX
            npyv_ceil_##SFX
            npyv_trunc_##SFX
            npyv_floor##SFX
        TrÉrié)gÍÌÌÌÌÌð¿gš™™™™™ñ¿gffffffò¿gÍÌÌÌÌÌð?gš™™™™™ñ?gffffffò?csg|]}ˆ|ˆ‘qSrrrŸ)ÚwrrrrÂsz*_SIMD_FP.test_rounding.<locals>.<listcomp>csg|] }ˆ|ƒ‘qSrrr©r”rrrÃs)g/ ÿÿÿÿ¯Cg/ ÿÿÿÿÏCg ÿÿÿÿ?Dg ÿÿÿÿ_Dcsg|] }ˆ|ƒ‘qSrr)rÚnrÜrrrÎsrÙ)rÐ)rÐgпg333333Ó¿gÍÌÌÌÌÌÜ¿r³rÐN) rrNrOrQrr=r™rËrpr rar<)rrr”Ú intrin_namerÌrÍrPZ round_casesrÎr•r½rµr_r€ÚyZ
data_szeror)r”rÛrrÚ test_rounding¬s4
 
   
 
z_SIMD_FP.test_roundingrr4ZmaxpZmaxnr3ZminpZminncs
| ¡| ¡| ¡}}‰dddddœ |dd…d¡}t|dd…ƒ}t|d|ƒ}t||ƒ}|jd}d    d
gd
d    gfd d gd d gf|d gd |gfd |g|d gfd d gd d gfd d gd d gff}|D]b\}    }
| |    |¡} | |
|¡} || | ƒ} || | ƒ}|| kst‚|| ƒ} || ƒ}|| ksÈt‚qÈ|s6dS|dkrJd d„}n ‡fdd„}ˆd fd ˆfˆ|f|ˆfˆˆff}|D]ˆ\}    }
| |    |
g|¡}||    |
ƒ} ||ƒ}|t    j
| ddksÀt‚|  |    ¡} |  |
¡} | g|j} || | ƒ}|t    j
| ddks|t‚q|dS)a˜
        Test intrinsics:
            npyv_max_##sfx
            npyv_maxp_##sfx
            npyv_maxn_##sfx
            npyv_min_##sfx
            npyv_minp_##sfx
            npyv_minn_##sfx
            npyv_reduce_max_##sfx
            npyv_reduce_maxp_##sfx
            npyv_reduce_maxn_##sfx
            npyv_reduce_min_##sfx
            npyv_reduce_minp_##sfx
            npyv_reduce_minn_##sfx
        rr)ZxpÚnpÚnnZxnéþÿÿÿNrrÄZreduce_rÑrÐé
iöÿÿÿcSs t |¡r|St |¡r|S|S©N©rÒÚisnan©rfrCrrrrƒ sz'_SIMD_FP.test_max_min.<locals>.<lambda>cst |¡st |¡rˆS|Srårærè©rPrrrƒsTrÉ) rNrOrQÚgetr’rrrarpr™rËr=)rrrÌrÍZchk_nanr”Z reduce_intrinZ    hf_nlanesZcasesZop1Zop2rsrtr_r–Ztest_nanZvdata_abrrérÚ test_max_minÜsV
 
ú 
 
 
 
 û 
 
 
 
z_SIMD_FP.test_max_minc CsÂ| ¡| ¡| ¡}}}| ¡}| | ¡¡}||f|df|dfd|fd|ff}|D]:\}}|g|j}    | | |¡¡}
|
tj    |    ddksXt
‚qX| dd„|Dƒ¡}    | |¡}
|
|    ks¾t
‚dS)NrÑrÐTrÉcSsg|] }d|‘qS)rrrrrrr/sz,_SIMD_FP.test_reciprocal.<locals>.<listcomp>) rNrOrQr)rarÚrecipr=r™rËrp) rrÌrÍrPr_r‡Z recip_casesrÎr•Z
data_reciprìrrrÚtest_reciprocal$s"  
z_SIMD_FP.test_reciprocalcCs,| | | ¡¡¡}|dg|jks(t‚dS)zQ
        Compare Not NaN. Test intrinsics:
            npyv_notnan_##SFX
        rN)Znotnanr=rQrrp)rZnnanrrrÚtest_special_cases3sz_SIMD_FP.test_special_casesrÞcCsVt||ƒ}tdƒtdƒtdƒ fD].}| |¡}tƒ||ƒtdddks"t‚q"dS)NrPrKT)r
F)rrMr=rrrp)rrÞrÚdr5rrrÚtest_unary_invalid_fpexception;s 
 
z'_SIMD_FP.test_unary_invalid_fpexceptionzpy_comp,np_compÚcmpltÚcmpleÚcmpgtÚcmpgeÚcmpeqÚcmpneqcsÎ| ¡| ¡| ¡}}}| ¡‰‡fdd„}t||ƒ}d|f|df||f||f||fdf}|D]f\}    }
|    g|j} |
g|j} | |    ¡} | |
¡}||| |ƒƒ}‡fdd„t| | ƒDƒ}||ksbt‚qbdS)Ncs‡fdd„|DƒS)Ncsg|] }|ˆk‘qSrr©rZlane©Ú    mask_truerrrSszF_SIMD_FP.test_comparison_with_nan.<locals>.to_bool.<locals>.<listcomp>r©rIrørrÚto_boolRsz2_SIMD_FP.test_comparison_with_nan.<locals>.to_boolr)rÐrÑcsg|]\}}ˆ||ƒ‘qSrrre)Úpy_comprrr^sz5_SIMD_FP.test_comparison_with_nan.<locals>.<listcomp>)    rNrOrQr?rrr=rorp)rrüZnp_comprÌrÍrPrûrZ    cmp_casesZ case_operand1Z case_operand2rqrrrsrtZvcmpÚdata_cmpr)rùrürÚtest_comparison_with_nanFs      
ÿ   
 
z!_SIMD_FP.test_comparison_with_nanrr r_rPrrrÑrÐrcCsB| ||j¡}t|ƒ}t||ƒ}||ƒ}||ƒ}||ks>t‚dSr‘©rarr’rrpr“rrrr—as 
z!_SIMD_FP.test_operators_crosstestN)rFrYrZr˜rÈrÏrÔrÖr™ršr›rÒr×rØrÙr¹ràrërírîrðÚoperatorÚltÚleÚgtÚgeÚeqÚnerþrMr—rrrrrÃhsdÿ
.ÿ
Eÿ
ú
 
 
 
 
ø
rÃc @szeZdZdZdd„Zdd„Zdd„Zdd    „Zd
d „Zd d „Z    dd„Z
dd„Z e j  dddg¡dd„ƒZdd„Zdd„Zdd„Ze j  dejdfejdfejd fejd!fejd"fg¡d#d$„ƒZd%d&„Ze j  d'd(d)g¡e j  d*d+d,d-d.gd/d0d1d2gd3d+d,d-d.gd4d5d6d7gd3d/d0d1d.gd3gd+gd/gf¡d8d9„ƒƒZd:d;„Zd<d=„Zd>d?„Zd@dA„ZdBdC„Z dDdE„Z!dFdG„Z"dHdI„Z#dJdK„Z$dLS)MÚ    _SIMD_ALLz*
    To test all vector types at once
    cCs˜| ¡}| |¡}||kst‚| |¡}||ks4t‚| |¡}||ksJt‚| |¡}t|ƒd|jd…}|d|jd…}||ksˆt‚||ks”t‚dS)Nr)r)rarpZloadaÚloadsÚloadlr#r)rr_Z    load_dataZ
loada_dataZ
loads_datar    Z
loadl_halfZ    data_halfrrrÚtest_memory_load}s
 
 
 
 z_SIMD_ALL.test_memory_loadcCs| ¡}| |¡}dg|j}| ||¡||ks6t‚dg|j}| ||¡||ksZt‚dg|j}| ||¡||ks~t‚dg|j}| ||¡|d|jd…|d|jd…ks¾t‚||ksÊt‚dg|j}| ||¡|d|jd…||jdd…ks t‚||kst‚dS)Nrr)    r)rarÚstorerpZstoreaZstoresZstorelZstoreh)rr_r‡r Zstore_aZstore_sZstore_lZstore_hrrrÚtest_memory_stores&
           (   *z_SIMD_ALL.test_memory_storecCsº|jdkrdS| ¡}ttd|jdƒƒ}||jd|jdg7}|D]n}| ||d¡}|d|…dg|j|}||ks€t‚| ||¡}|d|…dg|j|}||ksFt‚qFdS)N©rržÚu16Ús16rrrér)rr)r#r rÚ    load_tillrpÚ
load_tillz)rr_ÚlanesrÝrÚ    data_tillrZ
data_tillzrrrÚtest_memory_partial_load©s
  z"_SIMD_ALL.test_memory_partial_loadcCs¨|jdkrdS| ¡}|jdd}| |¡}ttd|jdƒƒ}||jd|jdg7}|D]F}| ¡}|d|…|d|…<|jdd}| |||¡||ks\t‚q\dS)Nr Trdrrr)    rr)rar#r rÚcopyÚ
store_tillrp)rr_Zdata_revr‡rrÝrrrrrÚtest_memory_partial_store¸s
 
 z#_SIMD_ALL.test_memory_partial_storecCsª|jdkrdStddƒD]<}|j||jd}|dd|…}| ||¡}||kst‚qtddƒD]D}| || |j¡}| |dd|…¡}| ||¡}||ks`t‚q`dS)Nr ré@r éÀÿÿÿr)rr r)rÚloadnrpra)rÚstrider_Ú data_striderrrrÚtest_memory_noncont_loadÈs
  z"_SIMD_ALL.test_memory_noncont_loadc
Cs |jdkrdSttd|jdƒƒ}||jd|jdg7}tddƒD]œ}|j||jd}|dd|…}|D]r}|d|…dg|j|}| |||d¡}||ks¨t‚|d|…dg|j|}| |||¡}    |    |kslt‚qlqDtd    dƒD]®}| || |j¡}t| |dd|…¡ƒ}|D]x}|d|…dg|j|}| |||d¡}||ks^t‚|d|…dg|j|}| |||¡}    |    |ks t‚q qìdS)
Nr rrrrr rrr)    rr#r rr)Ú
loadn_tillrpÚ loadn_tillzra)
rrrr_rrÝZdata_stride_tillrZdata_stride_tillzr rrrÚ test_memory_noncont_partial_loadØs0
 z*_SIMD_ALL.test_memory_noncont_partial_loadcCs6|jdkrdS| | ¡¡}tddƒD]|}dg||j}||dd|…<dg||j}|dgd7}| |||¡|dd…|ksˆt‚|dd…dgdks&t‚q&tddƒD]‚}dg| |j}||dd|…<dgd}|dg| |j7}| |||¡|dd…|kst‚|dd…dgdks®t‚q®dS)Nr rrrérr)rrar)r rÚstorenrp)rr‡rr_r#rrrÚtest_memory_noncont_storeôs&
 
z#_SIMD_ALL.test_memory_noncont_storecCs´|jdkrdS| ¡}| |¡}ttd|jdƒƒ}||jd|jdg7}tddƒD] }|D]–}dg||j}|d|…dg|j||dd|…<dg||j}|dgd7}| ||||¡|dd…|ksÚt‚|dd…dgdks^t‚q^qVtdd    ƒD]¬}|D] }dg| |j}|d|…dg|j||dd|…<dgd}|dg| |j7}| ||||¡|dd…|ksŒt‚|dd…dgdks
t‚q
qdS)
Nr rrrrrr"rr)rr)rar#r rÚ storen_tillrp)rr_r‡rrrÝrr%rrrÚ!test_memory_noncont_partial_store s0
 
&&
z+_SIMD_ALL.test_memory_noncont_partial_storezintrin, table_size, elsize)z
self.lut32é r')z
self.lut16érc
Csj|| ¡krdSt|ƒ}t|jd|›ƒ}td|ƒ}|D],}| |¡}||ƒ}|||ƒ}    |    |ks8t‚q8dS)zi
        Test lookup table intrinsics:
            npyv_lut32_##sfx
            npyv_lut16_##sfx
        Nr>r)r2r’rrr r=rp)
rrZ
table_sizeZelsizeZ    idx_itrinÚtabler€ZbroadiÚidxZlutrrrÚtest_lut's
 
 
 
z_SIMD_ALL.test_lutcCsŠ| ¡}|dg|jkst‚tddƒD]"}| |¡}||g|jks&t‚q&| ¡|jdd}}| |¡| |¡}}|j|Ž}||ksŒt‚|jd|žŽ}    |    |ks¦t‚dddd    d
d d d g}
|j    j
rÌ|
  d¡|j    j rÞ|
  d¡|
D](} t |d| ƒ|ƒj} | d| ksât‚qâ| | | ¡| ¡¡||¡} | |ks8t‚| | | ¡| ¡¡||¡}||ksdt‚| |¡|dks|t‚|j     ¡dS)NrrräTrdrržrrr¦r§r¨r©Úf64Úf32Z reinterpret_rA)rä)Úzerorrpr r=r)raÚsetZsetfrr¶ÚappendÚsimd_f32rrFÚselectrõröZextract0Úcleanup)rZbroadcast_zeror€Z
broadcastirqrrrsrtZvsetZvsetfÚsfxesrZvec_nameZselect_aZselect_brrrÚ    test_misc<s2
 
 
 
z_SIMD_ALL.test_misccCs| ¡|jdd}}| |¡| |¡}}|d|jd…}|d|jd…}||jdd…}||jdd…}| ||¡}    |    ||kst‚| ||¡}
|
||ks¬t‚| ||¡} | ||||fksÐt‚dd„t||ƒDƒ} dd„t||ƒDƒ} | ||¡}|| | fkst‚dS)NTrdrcSsg|]}|D]}|‘q qSrr©rÚpr5rrrr|sz*_SIMD_ALL.test_reorder.<locals>.<listcomp>cSsg|]}|D]}|‘q qSrrr6rrrr}s)r)rarÚcombinelrpÚcombinehÚcombinero)rrqrrrsrtZ    data_a_loZ    data_b_loZ    data_a_hiZ    data_b_hir8r9r:Z    data_ziplZ    data_ziphZvziprrrÚ test_reorderis     z_SIMD_ALL.test_reordercsZ| ¡‰ˆdkrdS‡fdd„td|jdˆƒDƒ}| | t|jƒ¡¡}||ksVt‚dS)Nrcs,g|]$}tt||dˆƒƒD]}|‘qqS)r)r!r )rrrß©Zssizerrr†sÿz0_SIMD_ALL.test_reorder_rev64.<locals>.<listcomp>r)r2r rÚrev64rarp)rZ
data_rev64r=rr<rÚtest_reorder_rev64s
ÿz_SIMD_ALL.test_reorder_rev64z func, intrinrñròrórôrõc
s¢| ¡r| ¡}n| | ¡|j¡}|j| ¡dd}| |¡| |¡}}t||ƒ}| ¡‰‡fdd„}‡fdd„t||ƒDƒ}||||ƒƒ}    |    |ksžt    ‚dS)NTrdcs‡fdd„|DƒS)Ncsg|] }|ˆk‘qSrrr÷rørrrŸszH_SIMD_ALL.test_operators_comparison.<locals>.to_bool.<locals>.<listcomp>rrúrørrrûžsz4_SIMD_ALL.test_operators_comparison.<locals>.to_boolcsg|]\}}ˆ||ƒ‘qSrrrerÜrrr¡sz7_SIMD_ALL.test_operators_comparison.<locals>.<listcomp>)
r"r)r7rr8rarr?rorp)
rr”rrqrrrsrtrûrýÚcmpr)r”rùrÚtest_operators_comparisons
 
 z#_SIMD_ALL.test_operators_comparisoncCs¸| ¡r| ¡}n| | ¡|j¡}|j| ¡dd}| |¡| |¡}}| ¡rz| |¡}| |¡}|j|j}}n||}}dd„|j}}|dd„t||ƒDƒƒ}    || ||¡ƒ}
|
|    ksÈt    ‚|dd„t||ƒDƒƒ} |t
|dƒ||ƒƒ} | | kst    ‚|d    d„t||ƒDƒƒ} |t
|d
ƒ||ƒƒ}|| ks<t    ‚|d d„|Dƒƒ}|t
|d ƒ|ƒƒ}||ksnt    ‚|j d kr~dSdd„t||ƒDƒ}|t
|dƒ||ƒƒ}||ks´t    ‚dS)NTrdcSs|Srår)rfrrrrƒ³r„z2_SIMD_ALL.test_operators_logical.<locals>.<lambda>cSsg|]\}}||A‘qSrrrerrrrµsz4_SIMD_ALL.test_operators_logical.<locals>.<listcomp>cSsg|]\}}||B‘qSrrrerrrr¹srhcSsg|]\}}||@‘qSrrrerrrr½srgcSsg|]
}|‘qSrrrŸrrrrÁsrjrcSsg|]\}}||@‘qSrrrerrrrÇsrn) r"r)r7rr8rar<rorirprr)rrqrrrsrtZ data_cast_aZ data_cast_bÚcastZ    cast_dataryrzrwrxrurvZdata_notr{r|r}rrrr~¥s8
 
 
 
  z _SIMD_ALL.test_operators_logicalrrr r_rrrÄrr;rãéýÿÿÿéüÿÿÿrr"iÿiÿÿÿlÿÿÿÿcCsB| ||j¡}t|ƒ}t||ƒ}||ƒ}||ƒ}||ks>t‚dSr‘rÿr“rrrr—Ës 
z"_SIMD_ALL.test_operators_crosstestcCsd|jdd…}t|jd||jfƒ}t|jd|j|fƒ}|| d¡ƒ}| | d¡| d¡¡}||kspt‚||ƒ}||ƒ}||ksŒt‚dS)NrCrz    cvt_%s_%sr)rrrr=rõrp)rZbsfxZ
to_booleanZ from_booleanZfalse_vbZtrue_vbZ
false_vsfxZ    true_vsfxrrrÚtest_conversion_booleanãs z!_SIMD_ALL.test_conversion_booleancCsª|jdkrdS|jdtt|jdd…ƒdƒ}t|jd|›d|j›ƒ}| | ¡|j¡}| |¡}||ƒ}|d|jd…}||jdd…}|||fks¦t    ‚dS)zh
        Test expand intrinsics:
            npyv_expand_u16_u8
            npyv_expand_u32_u16
        ©rrNrrrZexpand_r)
rÚstrr1rrr)r7rrarp)rZtotypeÚexpandr_r‡ZedataZdata_loZdata_hirrrÚtest_conversion_expandðs
$
z _SIMD_ALL.test_conversion_expandc    Cs¶| ¡r| ¡}n| | ¡|j¡}|j| ¡dd}| |¡| |¡}}| dd„t||ƒDƒ¡}| ||¡}||ks€t‚| dd„t||ƒDƒ¡}|     ||¡}||ks²t‚dS)NTrdcSsg|]\}}||‘qSrrrerrrr sz4_SIMD_ALL.test_arithmetic_subadd.<locals>.<listcomp>cSsg|]\}}||‘qSrrrerrrrs)
r"r)r7rr8rarorÆrprº)    rrqrrrsrtÚdata_addrÆÚdata_subrºrrrÚtest_arithmetic_subadds
   z _SIMD_ALL.test_arithmetic_subaddcCs’|jdkrdS| ¡r | ¡}n| | ¡|j¡}|j| ¡dd}| |¡| |¡}}| dd„t||ƒDƒ¡}| ||¡}||ksŽt    ‚dS)N)r¨r©TrdcSsg|]\}}||‘qSrrrerrrrsz1_SIMD_ALL.test_arithmetic_mul.<locals>.<listcomp>)
rr"r)r7rr8rarorÂrp)rrqrrrsrtZdata_mulrÂrrrÚtest_arithmetic_muls
 
 z_SIMD_ALL.test_arithmetic_mulcCsn| ¡s dS| ¡|jdd}}| |¡| |¡}}| dd„t||ƒDƒ¡}| ||¡}||ksjt‚dS)NTrdcSsg|]\}}||‘qSrrrerrrr+sz1_SIMD_ALL.test_arithmetic_div.<locals>.<listcomp>)r"r)raroÚdivrp)rrqrrrsrtZdata_divrMrrrÚtest_arithmetic_div#s z_SIMD_ALL.test_arithmetic_divcsV| ¡r dS| ¡‰‡fdd„‰dˆ g}|tdddƒ7}|tdddƒ7}| ¡}|d    krz|tdd
d ƒ7}|tdd
d ƒ7}|d kr¢|td
ddƒ7}|td
ddƒ7}|dkrÊ|tdddƒ7}|tdddƒ7}|dd„|Dƒ7}t ||¡D]h\}‰| ˆ¡d‰ˆdkr
qè| | |¡¡}‡‡fdd„|Dƒ}|     ˆ¡}| 
||¡}||ksèt ‚qèdS)zn
        Test integer division intrinsics:
            npyv_divisor_##sfx
            npyv_divc_##sfx
        NcsR|dkr|ˆkr|S|dk|dk}}|dks6||kr>||S||||dS)zŒ
            Divide towards zero works with large integers > 2^53,
            and wrap around overflow similar to what C does.
            r;rrr)rfrïZsign_aZsign_d)Úint_minrrÚ    trunc_div9s z3_SIMD_ALL.test_arithmetic_intdiv.<locals>.trunc_divrrér'ér    rÚi iÿr(li iÿÿÿlllÿÿÿÿcSsg|]
}| ‘qSrrrrrrrSsz4_SIMD_ALL.test_arithmetic_intdiv.<locals>.<listcomp>csg|]}ˆ|ˆƒ‘qSrrrŸ)ÚdivisorrPrrrYs) r"r8r r2Ú    itertoolsÚproductr=rar)rSÚdivcrp)rr_ZbsizeZdividendZ    data_divcZ divisor_parmsrVr)rSrOrPrÚtest_arithmetic_intdiv/s6
 
 
 z _SIMD_ALL.test_arithmetic_intdivcCsB|jdkrdS| ¡}| |¡}t|ƒ}| |¡}||ks>t‚dS)zH
        Test reduce sum intrinsics:
            npyv_sum_##sfx
        )r¦r¨r-r,N)rr)rarrp)rr_r‡Údata_sumÚvsumrrrÚtest_arithmetic_reduce_sum^s
 
 
z$_SIMD_ALL.test_arithmetic_reduce_sumcCsj|jdkrdSd|j| ¡| ¡|jf}|D]6}| |¡}| |¡}t|ƒ}| |¡}||ks.t‚q.dS)zQ
        Test extend reduce sum intrinsics:
            npyv_sumup_##sfx
        rENr)    rrr8r7r)rarZsumuprp)rrÚrr_r‡rXrYrrrÚtest_arithmetic_reduce_sumupms
 
 
 
z&_SIMD_ALL.test_arithmetic_reduce_sumupc    CsÔ| | ¡¡}| |jdd¡}| | ¡| ¡¡}| | ¡| ¡¡}| ||¡}| ||||¡}||kspt‚| ||||¡}||ksŒt‚| ||¡}|     ||||¡}||ks´t‚|     ||||¡}||ksÐt‚dS)zœ
        Conditional addition and subtraction for all supported data types.
        Test intrinsics:
            npyv_ifadd_##SFX, npyv_ifsub_##SFX
        TrdN)
rar)rõr.rörºÚifsubrprÆÚifadd)    rrsrtr^Z
false_maskrJr]rIr^rrrÚtest_mask_conditional|s     z_SIMD_ALL.test_mask_conditionalN)%rFrYrZr˜r
r rrrr!r$r&r™ršr›r+r5r;r>rrrrrrr@r~r—rDrHrKrLrNrWrZr\r_rrrrrys^þ
- û
&
 
 
 ø
  /r)rkr‰rŠr‹)rržrrr¦r§r¨r©)r-r,)r-)r,rBrRrú(rSú)ztarget 'z$' isn't supported by current machinez' isn't supported by NPYVz"' doesn't support single-precisionr-z!' doesn'tsupport double-precisionr,)rrrTZTestr)Úreason)FFFFF)2r™rÒr·rTrZnumpy.core._simdrrrZnumpy.core._multiarray_umathrrrr[rœr°rÁrÃrZbool_sfxZint_sfxZfp_sfxZall_sfxZtests_registryÚitemsrTrr–Z
simd_widthrUZ pretty_nameÚlenrVÚskipÚdictZskip_sfxr1r¶r4ÚclsrrêZskip_mZinhrrÚtyperFÚtclsršÚglobalsrrrrÚ<module>s€ þ
`{Nú
 &