1-- BFI seems available on Gfx9, need to fix the emission code for that. 2check_verx10(110, 120, 125, 200) 3 4function BFI_simulation(a, b, c, d) 5 local width = a & 0x1F 6 local offset = b & 0x1F 7 local mask = ((1 << width) - 1) << offset 8 return ((c << offset) & mask) | (d & ~mask) 9end 10 11function BFI(a, b, c, d) 12 local r = execute { 13 data = { [0] = a, b, c, d }, 14 src = [[ 15 @id g9 16 @mov g11 0 17 @mov g12 1 18 @mov g13 2 19 @mov g14 3 20 21 @read g1 g11 22 @read g2 g12 23 @read g3 g13 24 @read g4 g14 25 26 bfi1(8) g5<1>UD g1<8,8,1>UD g2<8,8,1>UD { align1 @1 1Q }; 27 bfi2(8) g6<1>UD g5<8,8,1>UD g3<8,8,1>UD g4<8,8,1>UD { align1 @1 1Q }; 28 29 @write g9 g6 30 @eot 31 ]], 32 } 33 return r[0] 34end 35 36function Hex(v) return string.format("0x%08x", v) end 37 38local a, b, c, d = 12, 12, 0xAAAAAAAA, 0xBBBBBBBB 39 40print("calculated", Hex(BFI(a, b, c, d))) 41print("expected", Hex(BFI_simulation(a, b, c, d))) 42