@@ -207,10 +207,13 @@ staticmulincr(ptr, incr) = Expr(:call, lv(:staticmul), Expr(:call, :eltype, ptr)
207
207
# @inline cmpend(i::Int, r::AbstractRange) = i ≤ vsub_fast(last(r), step(r))
208
208
209
209
@inline vcmpend (i:: Int , r:: CloseOpen , :: StaticInt{W} ) where {W} = i ≤ vsub_fast (getfield (r,:upper ), W)
210
+ @inline vcmpendzs (i:: Int , r:: CloseOpen , :: StaticInt{W} ) where {W} = i ≠ (getfield (r,:upper ) & (- W))
210
211
@inline vcmpend (i:: Int , r:: AbstractUnitRange , :: StaticInt{W} ) where {W} = i ≤ vsub_fast (last (r), W- 1 )
212
+ @inline vcmpendzs (i:: Int , r:: AbstractUnitRange , :: StaticInt{W} ) where {W} = i ≠ (length (r) & (- W))
211
213
# i = 0
212
214
# i += 4*3 # i = 12
213
215
@inline vcmpend (i:: Int , r:: AbstractRange , :: StaticInt{W} ) where {W} = i ≤ vsub_fast (last (r), vsub_fast (W* step (r), 1 ))
216
+ @inline vcmpendzs (i:: Int , r:: AbstractRange , :: StaticInt{W} ) where {W} = i ≤ vsub_fast (last (r), vsub_fast (W* step (r), 1 ))
214
217
# @inline vcmpend(i::Int, r::AbstractRange, ::StaticInt{W}) where {W} = i ≤ vsub_fast(last(r), W*step(r))
215
218
# @inline vcmpend(i::Int, r::AbstractRange, ::StaticInt{W}) where {W} = i ≤ vsub_fast(last(r), W)
216
219
@@ -225,17 +228,19 @@ function staticloopexpr(loop::Loop)
225
228
end
226
229
end
227
230
function vec_looprange (loop:: Loop , UF:: Int , mangledname)
231
+ fast = ispow2 (UF) && iszero (first (loop))
228
232
if loop. rangesym === Symbol (" " ) # means loop is static
229
- vec_looprange (UF, mangledname, staticloopexpr (loop))
233
+ vec_looprange (UF, mangledname, staticloopexpr (loop), fast )
230
234
else
231
- vec_looprange (UF, mangledname, loop. rangesym)
235
+ vec_looprange (UF, mangledname, loop. rangesym, fast )
232
236
end
233
237
end
234
- function vec_looprange (UF:: Int , mangledname, r:: Union{Expr,Symbol} )
238
+ function vec_looprange (UF:: Int , mangledname, r:: Union{Expr,Symbol} , zerostart:: Bool )
239
+ cmp = zerostart ? lv (:vcmpendzs ) : lv (:vcmpend )
235
240
if isone (UF)
236
- Expr (:call , lv ( :vcmpend ) , mangledname, r, VECTORWIDTHSYMBOL)
241
+ Expr (:call , cmp , mangledname, r, VECTORWIDTHSYMBOL)
237
242
else
238
- Expr (:call , lv ( :vcmpend ) , mangledname, r, mulexpr (VECTORWIDTHSYMBOL, UF))
243
+ Expr (:call , cmp , mangledname, r, mulexpr (VECTORWIDTHSYMBOL, UF))
239
244
end
240
245
end
241
246
function looprange (loop:: Loop , UF:: Int , mangledname)
0 commit comments