| -- 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))) |