diff --git a/src/singeli/README.md b/src/singeli/README.md index 1e3a4aee..fae42648 100644 --- a/src/singeli/README.md +++ b/src/singeli/README.md @@ -100,7 +100,7 @@ Some may also support one scalar argument or arguments with different widths. - `__sub{a:VI, b:VI} : VI` - `a - b` - `__div{a:V, b:V} : V` - `a / b` - `__mul{a:V, b:V} : V` - `a * b` -- `mulHi{a:VI, b:VI} : VI` - high half of multiplication +- `mulh{a:VI, b:VI} : VI` - high half of multiplication - `__eq`, `__ne`, `__ge`, `__gt`, `__le`, `__lt` - comparison; `{a:V, b:V} : mt{V}` diff --git a/src/singeli/src/avx2.singeli b/src/singeli/src/avx2.singeli index 6b157ad9..c9cd8633 100644 --- a/src/singeli/src/avx2.singeli +++ b/src/singeli/src/avx2.singeli @@ -14,10 +14,10 @@ def packQQ{{a, b}} = packQQ{a, b} # arith -def mulHi{a:T,b:T & [16]i16==T } = emit{T, '_mm256_mulhi_epi16', a, b} -def mulHi{a:T,b:T & [16]u16==T } = emit{T, '_mm256_mulhi_epu16', a, b} -def mul32{a:T,b:T & [ 4]i64==T } = emit{T, '_mm256_mul_epi32', a, b} # reads only low 32 bits of arguments -def mul32{a:T,b:T & [ 4]u64==T } = emit{T, '_mm256_mul_epu32', a, b} # reads only low 32 bits of arguments +def mulh {a:T,b:T & [16]i16==T} = emit{T, '_mm256_mulhi_epi16', a, b} +def mulh {a:T,b:T & [16]u16==T} = emit{T, '_mm256_mulhi_epu16', a, b} +def mul32{a:T,b:T & [ 4]i64==T} = emit{T, '_mm256_mul_epi32', a, b} # reads only low 32 bits of arguments +def mul32{a:T,b:T & [ 4]u64==T} = emit{T, '_mm256_mul_epu32', a, b} # reads only low 32 bits of arguments # structural operations diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 17eaf98e..5bca04f2 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -166,7 +166,7 @@ def lvec{T, n, w & isvec{T} & vcount{T}==n & elwidth{T}==w} = 1 def { absu,andAllZero,andnz,b_getBatch,clmul,cvt,extract,fold_addw,half, homAll,homAny,homBlend,homMask,homMaskStore,homMaskStoreF,loadBatchBit, - loadLow,make,mulw,mulHi,narrow,narrowPair,packHi,packLo,packQ,pair,pdep, + loadLow,make,mulw,mulh,narrow,narrowPair,packHi,packLo,packQ,pair,pdep, pext,popcRand,sel,shl,shr,shuf,shuf16Hi,shuf16Lo,shufHalves,storeLow, topBlend,topMask,topMaskStore,topMaskStoreF,unord,unpackQ,vfold,widen, zip,zipHi,zipLo diff --git a/src/singeli/src/dyarith.singeli b/src/singeli/src/dyarith.singeli index eea7d28e..8c628f44 100644 --- a/src/singeli/src/dyarith.singeli +++ b/src/singeli/src/dyarith.singeli @@ -48,7 +48,7 @@ def arithChk2{F, M, w:T, x:T & same{F,__mul} & isvec{T} & i8==eltype{T} & hasarc } def arithChk2{F, M, w:T, x:T & same{F,__mul} & isvec{T} & i16==eltype{T} & hasarch{'X86_64'}} = { rl:= __mul{w,x} - rh:= mulHi{w,x} + rh:= mulh{w,x} tup{rl, tup{'anyne', rh, rl>>15}} } def arithChk2{F, M, w:T, x:T & same{F,__mul} & isvec{T} & i32==eltype{T} & hasarch{'X86_64'}} = { diff --git a/src/singeli/src/sse2.singeli b/src/singeli/src/sse2.singeli index 7924b840..0961ffa7 100644 --- a/src/singeli/src/sse2.singeli +++ b/src/singeli/src/sse2.singeli @@ -28,8 +28,8 @@ def shl{S==[16]u8, x:T, n & w128{T}} = T ~~ emit{T, '_mm_bslli_si128', x, n} def shr{S==[16]u8, x:T, n & w128{T}} = T ~~ emit{T, '_mm_bsrli_si128', x, n} # integer arith -def mulHi{a:T,b:T & [8]i16==T} = emit{T, '_mm_mulhi_epi16', a, b} -def mulHi{a:T,b:T & [8]u16==T} = emit{T, '_mm_mulhi_epu16', a, b} +def mulh{a:T,b:T & [8]i16==T} = emit{T, '_mm_mulhi_epi16', a, b} +def mulh{a:T,b:T & [8]u16==T} = emit{T, '_mm_mulhi_epu16', a, b} def mul32{a:T,b:T & [2]u64==T} = emit{T, '_mm_mul_epu32', a, b} # reads only low 32 bits of arguments def __mul{a:T,b:T & [4]i32==T} = { def mu{x, y} = [4]i32 ~~ mul32{[2]u64~~x, [2]u64~~y}