expansion
&
compaction
in
by Niles Salter
https://validark.dev
~We have several general-purpose expansion instructions: ::orange:{pdep} :cyan:[rax]:white:[,] :cyan:[rbx]:white:[,] :cyan:[rcx] :spreads bits of :cyan:[rbx] according to :cyan:[rcx] ::orange:[vpexpand{b,w,d,q}] :cyan:[zmm0] :white:[{] :green:[k1] :white:[}] :white:[{] :green:[z] :white:[},] :cyan:[zmm1] :spreads {8,16,32,64} bit values in :cyan:[zmm1] according to :green:[k1]
#:orange:[vpexpandb] :cyan:[zmm0] :white:[{] :green:[k1] :white:[}] :white:[{] :green:[z] :white:[},] :cyan:[zmm0]@:orange:[knotq] :green:[k1]:white:[,] :green:[k1] @:orange:[vpexpandb] :cyan:[zmm0] :white:[{] :green:[k1] :white:[},] :cyan:[zmm1]
~#:orange:[vpexpandb] :cyan:[zmm0] :white:[{] :green:[k1] :white:[},] :cyan:[zmm1]
We also have several special-purpose expansion instructions: ::orange:[vpmovm2{b,w,d,q}] :cyan:[zmm0], :green:[k1] :spreads each bit of :green:[k1] to {8,16,32,64} bit values.@Each result element will be all 1's or all 0's, matching@the corresponding bit of :green:[k1]. ::white:{:AT:select(u8, }:green:{k1}:white:{, :AT:splat(0xFF), :AT:splat(0))} ::orange:[vmovdqu{8,16,32,64}] :cyan:[zmm0] :white:[{] :green:[k1] :white:[}] :white:[{] :green:[z] :white:[},] :cyan:[zmm1] ::white:{:AT:select(u32, }:green:{k1}:white:{,} :cyan:{y}:white:{, :AT:splat(0))} ::orange:[vmovdqu{8,16,32,64}] :cyan:[zmm0] :white:[{] :green:[k1] :white:[},] :cyan:[zmm1] ::white:{:AT:select(u16, }:green:{k1}:white:{,} :cyan:{y}:white:{,} :cyan:{z}:white:{)} ::orange:[vpblendm{b,w,d,q}] :cyan:[zmm2] :white:[{] :green:[k1] :white:[},] :cyan:[zmm1]:white:[,] :cyan:[zmm0] ::white:{:AT:select(u64, }:green:{k1}:white:{,} :cyan:{y}:white:{,} :cyan:{z}:white:{)}
~We have several general-purpose compaction instructions: ::orange:{pext} :cyan:[rax]:white:[,] :cyan:[rbx]:white:[,] :cyan:[rcx] :compacts bits of :cyan:[rbx] according to :cyan:[rcx] ::orange:[vpcompress{b,w,d,q}] :cyan:[zmm0] :white:[{] :green:[k1] :white:[}] :white:[{] :green:[z] :white:[},] :cyan:[zmm1] :compacts elements in :cyan:[zmm1] according to :green:[k1]
fn vgf2p8affineqb(a: [8]u8, b: [8]u8, comptime c: @Vector(8, u1)) [8]u8 { var r: [8]@Vector(8, u1) = undefined; for (0..8) |i| { for (0..8) |j| { r[i][j] = @truncate(@popCount(a[i] & b[7 - j])); } r[i] ^= c; } return @bitCast(r); }
a
b
fin
<
>