mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 00:20:11 +01:00
pan/midgard: Document branch combination LUT
This took way longer to figure out than it should have.. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
parent
2037478702
commit
13ee87c8b9
3 changed files with 25 additions and 5 deletions
|
|
@ -740,15 +740,18 @@ print_extended_branch_writeout_field(uint8_t *words)
|
|||
|
||||
print_branch_op(br.op);
|
||||
|
||||
/* Condition repeated 8 times in all known cases. Check this. */
|
||||
/* Condition codes are a LUT in the general case, but simply repeated 8 times for single-channel conditions.. Check this. */
|
||||
|
||||
unsigned cond = br.cond & 0x3;
|
||||
bool single_channel = true;
|
||||
|
||||
for (unsigned i = 0; i < 16; i += 2) {
|
||||
assert(((br.cond >> i) & 0x3) == cond);
|
||||
single_channel &= (((br.cond >> i) & 0x3) == (br.cond & 0x3));
|
||||
}
|
||||
|
||||
print_branch_cond(cond);
|
||||
if (single_channel)
|
||||
print_branch_cond(br.cond & 0x3);
|
||||
else
|
||||
printf("lut%X", br.cond);
|
||||
|
||||
if (br.unknown)
|
||||
printf(".unknown%d", br.unknown);
|
||||
|
|
|
|||
|
|
@ -359,6 +359,19 @@ __attribute__((__packed__))
|
|||
unsigned dest_tag : 4; /* tag of branch destination */
|
||||
unsigned unknown : 2;
|
||||
signed offset : 23;
|
||||
|
||||
/* Extended branches permit inputting up to 4 conditions loaded into
|
||||
* r31 (two in r31.w and two in r31.x). In the most general case, we
|
||||
* specify a function f(A, B, C, D) mapping 4 1-bit conditions to a
|
||||
* single 1-bit branch criteria. Note that the domain of f has 2^(2^4)
|
||||
* elements, each mapping to 1-bit of output, so we can trivially
|
||||
* construct a Godel numbering of f as a (2^4)=16-bit integer. This
|
||||
* 16-bit integer serves as a lookup table to compute f, subject to
|
||||
* some swaps for ordering.
|
||||
*
|
||||
* Interesting, the standard 2-bit condition codes are also a LUT with
|
||||
* the same format (2^1-bit), but it's usually easier to use enums. */
|
||||
|
||||
unsigned cond : 16;
|
||||
}
|
||||
midgard_branch_extended;
|
||||
|
|
|
|||
|
|
@ -224,7 +224,11 @@ midgard_create_branch_extended( midgard_condition cond,
|
|||
unsigned dest_tag,
|
||||
signed quadword_offset)
|
||||
{
|
||||
/* For unclear reasons, the condition code is repeated 8 times */
|
||||
/* The condition code is actually a LUT describing a function to
|
||||
* combine multiple condition codes. However, we only support a single
|
||||
* condition code at the moment, so we just duplicate over a bunch of
|
||||
* times. */
|
||||
|
||||
uint16_t duplicated_cond =
|
||||
(cond << 14) |
|
||||
(cond << 12) |
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue