Commit 8e50d449 authored by Alyssa Rosenzweig's avatar Alyssa Rosenzweig 💜 Committed by Marge Bot
Browse files

pan/bit: Add special op interpreting


Signed-off-by: Alyssa Rosenzweig's avatarAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <mesa/mesa!4470>
parent c37c7992
...@@ -249,6 +249,19 @@ bit_eval_cond(enum bi_cond cond, bit_t l, bit_t r, nir_alu_type T, unsigned c) ...@@ -249,6 +249,19 @@ bit_eval_cond(enum bi_cond cond, bit_t l, bit_t r, nir_alu_type T, unsigned c)
} }
} }
static float
biti_special(float Q, enum bi_special_op op)
{
switch (op) {
case BI_SPECIAL_FRCP: return 1.0 / Q;
case BI_SPECIAL_FRSQ: {
double Qf = 1.0 / sqrt(Q);
return Qf;
}
default: unreachable("Invalid special");
}
}
void void
bit_step(struct bit_state *s, bi_instruction *ins, bool FMA) bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
{ {
...@@ -310,9 +323,29 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA) ...@@ -310,9 +323,29 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
case BI_MOV: case BI_MOV:
bpoly(mov); bpoly(mov);
case BI_SPECIAL: {
assert(nir_alu_type_get_base_type(ins->dest_type) == nir_type_float);
assert(nir_alu_type_get_base_type(ins->dest_type) != nir_type_float64);
float Q = (ins->dest_type == nir_type_float16) ?
bf(srcs[0].u16[ins->swizzle[0][0]]) :
srcs[0].f32;
float R = biti_special(Q, ins->op.special);
if (ins->dest_type == nir_type_float16) {
dest.f16[0] = bh(R);
if (!ins->swizzle[0][0] && ins->op.special == BI_SPECIAL_FRSQ) {
/* Sorry. */
dest.f16[0]++;
}
} else {
dest.f32 = R;
}
break;
}
case BI_SHIFT: case BI_SHIFT:
case BI_STORE_VAR:
case BI_SPECIAL: /* _FAST, _TABLE on supported GPUs */
case BI_SWIZZLE: case BI_SWIZZLE:
case BI_ROUND: case BI_ROUND:
unreachable("Unsupported op"); unreachable("Unsupported op");
...@@ -330,6 +363,7 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA) ...@@ -330,6 +363,7 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
case BI_LOAD_VAR_ADDRESS: case BI_LOAD_VAR_ADDRESS:
case BI_LOAD: case BI_LOAD:
case BI_STORE: case BI_STORE:
case BI_STORE_VAR:
case BI_TEX: case BI_TEX:
unreachable("Unsupported I/O in interpreter"); unreachable("Unsupported I/O in interpreter");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment