cvt{E,T,v} → widen{T,to_el{E,v}}

This commit is contained in:
dzaima 2022-12-15 20:26:41 +02:00
parent 223bd0627a
commit 2b7291dbfb
7 changed files with 26 additions and 30 deletions

View File

@ -101,8 +101,11 @@ def half{x:T, i==0 & w256{T}} = [vcount{T}/2](eltype{T}) ~~ emit{[8]i16,
def pair{a:T,b:T & width{T}==128} = [vcount{T}*2](eltype{T}) ~~ emit{[8]i32, '_mm256_setr_m128i', a, b}
def pair{x} = pair{tupsel{0,x},tupsel{1,x}}
def cvt{F==i32, T==[4]f64, a:A & w128i{A}} = emit{T, '_mm256_cvtepi32_pd', a}
def cvt{F, T, a:A & w256{A} & width{F}<elwidth{T}} = cvt{F, T, half{a, 0}}
def widen{T==[4]f64, x:X & X==[4]i32} = emit{T, '_mm256_cvtepi32_pd', x}
def widen{T==[4]f64, x:X & X==[4]f32} = emit{T, '_mm256_cvtps_pd', x}
def widen{T==[4]f64, x:X & w128i{X} & elwidth{X}<32} = widen{T, widen{[4]i32, x}}
def widen{T, x:X & w256{X} & vcount{X}>vcount{T}} = widen{T, half{x,0}}
# structural operations
def extract{x:T, i & w256i{T,32} & knum{i}} = emit{eltype{T}, '_mm256_extract_epi32', x, i}

View File

@ -149,27 +149,12 @@ def topAll{x:T & w256i{T,16}} = homAll{[16]i16~~x < [16]i16**0}
# conversion
# convert packed elements of type F to a result T
# TODO F param is unnecessary if correct element type of A is enforced
def cvt{F==u8, T==[16]u16, a:A & w128i{A}} = emit{T, '_mm256_cvtepu8_epi16', a}
def cvt{F==u8, T==[8]u32, a:A & w128i{A}} = emit{T, '_mm256_cvtepu8_epi32', a}
def cvt{F==u8, T==[4]u64, a:A & w128i{A}} = emit{T, '_mm256_cvtepu8_epi64', a}
def cvt{F==u16, T==[8]u32, a:A & w128i{A}} = emit{T, '_mm256_cvtepu16_epi32', a}
def cvt{F==u16, T==[4]u64, a:A & w128i{A}} = emit{T, '_mm256_cvtepu16_epi64', a}
def cvt{F==u32, T==[4]u64, a:A & w128i{A}} = emit{T, '_mm256_cvtepu32_epi64', a}
def cvt{F==i8, T==[16]i16, a:A & w128i{A}} = emit{T, '_mm256_cvtepi8_epi16', a}
def cvt{F==i8, T==[8]i32, a:A & w128i{A}} = emit{T, '_mm256_cvtepi8_epi32', a}
def cvt{F==i8, T==[4]i64, a:A & w128i{A}} = emit{T, '_mm256_cvtepi8_epi64', a}
def cvt{F==i16, T==[8]i32, a:A & w128i{A}} = emit{T, '_mm256_cvtepi16_epi32', a}
def cvt{F==i16, T==[4]i64, a:A & w128i{A}} = emit{T, '_mm256_cvtepi16_epi64', a}
def cvt{F==i32, T==[4]i64, a:A & w128i{A}} = emit{T, '_mm256_cvtepi32_epi64', a}
def cvt{F , T==[4]f64, a:A & w128i{A} & F!=i32} = cvt{i32, T, cvt{F, [4]i32, a}}
# def cvt0{F, T, a} = { show{'cvt invocation', F, T, a}; 0 }
# def cvt{F, T, a & cvt0{F, T, a}} = 123
def widen{T==[16]u16, x:X & X==[16]u8} = emit{T, '_mm256_cvtepu8_epi16', x}; def widen{T==[16]i16, x:X & X==[16]i8} = emit{T, '_mm256_cvtepi8_epi16', x}
def widen{T==[ 8]u32, x:X & X==[16]u8} = emit{T, '_mm256_cvtepu8_epi32', x}; def widen{T==[ 8]i32, x:X & X==[16]i8} = emit{T, '_mm256_cvtepi8_epi32', x}
def widen{T==[ 8]u32, x:X & X==[8]u16} = emit{T, '_mm256_cvtepu16_epi32', x}; def widen{T==[ 8]i32, x:X & X==[8]i16} = emit{T, '_mm256_cvtepi16_epi32', x}
def widen{T==[ 4]u64, x:X & X==[16]u8} = emit{T, '_mm256_cvtepu8_epi64', x}; def widen{T==[ 4]i64, x:X & X==[16]i8} = emit{T, '_mm256_cvtepi8_epi64', x}
def widen{T==[ 4]u64, x:X & X==[8]u16} = emit{T, '_mm256_cvtepu16_epi64', x}; def widen{T==[ 4]i64, x:X & X==[8]i16} = emit{T, '_mm256_cvtepi16_epi64', x}
def widen{T==[ 4]u64, x:X & X==[4]u32} = emit{T, '_mm256_cvtepu32_epi64', x}; def widen{T==[ 4]i64, x:X & X==[4]i32} = emit{T, '_mm256_cvtepi32_epi64', x}
# undo cvt; assumes elements of X fit in T, otherwise may be saturated or otherwise corrupted; but keeps the width of x, with trailing elements undefined
def ucvt{T, x:X & w256i{X,32} & width{T}==8} = {

View File

@ -84,6 +84,9 @@ def ty_half{T & isprim{T}} = to_w{T, width{T}/2}
def ty_dbl {T & isvec{T}} = to_el{ty_dbl {eltype{T}}, T}
def ty_half{T & isvec{T}} = to_el{ty_half{eltype{T}}, T}
# base vector utility definitions
def widen{T, x:X & T==X} = x
def unroll{vars,begin,end,block & knum{begin} & knum{end}} = {
def f{i,l & i==l} = 0
def f{i,l & i!=l} = {

View File

@ -58,7 +58,7 @@ equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = {
# TODO update this to modern mask stuff
cw:= load{*ww{tern{fac==1, 256, 128}, W} ~~ (w + i*32/fac)}
cx:= load{*ww{256, X} ~~ x, i}
cwc:= cvt{W, ww{256, X}, cw}
cwc:= widen{ww{256, X}, to_el{W, cw}}
if (anynePositive{cwc,cx,M}) return{0}
}}
}

View File

@ -55,7 +55,7 @@ def loadBatch{ptr:P, n, T} = {
def rpos = ptr + n*vcount{T}
def E0 = eltype{P}
cvt{E0, T, loadLow{*to_el{E0, T} ~~ rpos, vcount{T}*width{E0}}}
widen{T, loadLow{*to_el{E0, T} ~~ rpos, vcount{T}*width{E0}}}
}

View File

@ -61,7 +61,7 @@ def perm_select{ri, rd, TI, w, r, wl, xl, selx} = {
maskedLoop{ri, wl, {i, M} => {
cw:= wrapChk{loadBatch{w, i, VI}, VI,xlf, M}
is:= (if (ext>1) i<<lb{ext}; else i)
def part{o} = cvt{i8, [8]i32, shuf{[4]u64, cw, 4b3210+o}}
def part{o} = widen{[8]i32, to_el{i8, shuf{[4]u64, cw, 4b3210+o}}}
def se{o} = storeExp{r, is+o, selx{part{o}}, M, ext, rd, wl}
each{se, iota{ext}}
}}

View File

@ -152,10 +152,15 @@ def extract{x:T, i & w128i{T,32} & knum{i}} = emit{eltype{T}, '_mm_extract_epi32
def extract{x:T, i & w128i{T,64} & knum{i}} = emit{eltype{T}, '_mm_extract_epi64', x, i}
# conversion
def cvt{F, T, a:A & eltype{T}==F} = T~~a
def cvt{F==i8, T==[8]i16, a:A & w128i{A}} = emit{T, '_mm_cvtepi8_epi16', a}
def cvt{F==i8, T==[4]i32, a:A & w128i{A}} = emit{T, '_mm_cvtepi8_epi32', a}
def cvt{F==i16, T==[4]i32, a:A & w128i{A}} = emit{T, '_mm_cvtepi16_epi32', a}
def widen{T==[8]u16, x:X & X==[16]u8} = emit{T, '_mm_cvtepu8_epi16', x}; def widen{T==[8]i16, x:X & X==[16]i8} = emit{T, '_mm_cvtepi8_epi16', x}
def widen{T==[4]u32, x:X & X==[16]u8} = emit{T, '_mm_cvtepu8_epi32', x}; def widen{T==[4]i32, x:X & X==[16]i8} = emit{T, '_mm_cvtepi8_epi32', x}
def widen{T==[4]u32, x:X & X==[8]u16} = emit{T, '_mm_cvtepu16_epi32', x}; def widen{T==[4]i32, x:X & X==[8]i16} = emit{T, '_mm_cvtepi16_epi32', x}
def widen{T==[2]u64, x:X & X==[16]u8} = emit{T, '_mm_cvtepu8_epi64', x}; def widen{T==[2]i64, x:X & X==[16]i8} = emit{T, '_mm_cvtepi8_epi64', x}
def widen{T==[2]u64, x:X & X==[8]u16} = emit{T, '_mm_cvtepu16_epi64', x}; def widen{T==[2]i64, x:X & X==[8]i16} = emit{T, '_mm_cvtepi16_epi64', x}
def widen{T==[2]u64, x:X & X==[4]u32} = emit{T, '_mm_cvtepu32_epi64', x}; def widen{T==[2]i64, x:X & X==[4]i32} = emit{T, '_mm_cvtepi32_epi64', x}
def widen{T==[2]f64, x:X & X==[4]i32} = emit{T, '_mm_cvtepi32_pd', x}
def widen{T==[2]f64, x:X & X==[4]f32} = emit{T, '_mm_cvtps_pd', x}
def widen{T==[2]f64, x:X & w128i{X} & elwidth{X}<32} = widen{T, widen{[4]i32, x}}
# blend by sign bit; no 16-bit case
def blend{f:T, t:T, m:M & w128{T} & w128i{M,32}} = T ~~ emit{[4]f32, '_mm_blendv_ps', v2f{f}, v2f{t}, v2f{m}}