-- BFI seems available on Gfx9, need to fix the emission code for that. check_verx10(110, 120, 125, 200) function BFI_simulation(a, b, c, d) local width = a & 0x1F local offset = b & 0x1F local mask = ((1 << width) - 1) << offset return ((c << offset) & mask) | (d & ~mask) end function BFI(a, b, c, d) local r = execute { data = { [0] = a, b, c, d }, src = [[ @id g9 @mov g11 0 @mov g12 1 @mov g13 2 @mov g14 3 @read g1 g11 @read g2 g12 @read g3 g13 @read g4 g14 bfi1(8) g5<1>UD g1<8,8,1>UD g2<8,8,1>UD { align1 @1 1Q }; bfi2(8) g6<1>UD g5<8,8,1>UD g3<8,8,1>UD g4<8,8,1>UD { align1 @1 1Q }; @write g9 g6 @eot ]], } return r[0] end function Hex(v) return string.format("0x%08x", v) end local a, b, c, d = 12, 12, 0xAAAAAAAA, 0xBBBBBBBB print("calculated", Hex(BFI(a, b, c, d))) print("expected", Hex(BFI_simulation(a, b, c, d)))