unsigned op : 20;
} __attribute__((packed));
+#define BIFROST_FMA_IADD_32 (0x4ff98 >> 3)
+#define BIFROST_FMA_ISUB_32 (0x4ffd8 >> 3)
+#define BIFROST_FMA_IMUL_32 ((BIFROST_FMA_EXT | 0x7818) >> 3)
+
struct bifrost_fma_2src {
unsigned src0 : 3;
unsigned src1 : 3;
#define BIFROST_ADD_OP_FRSQ_FAST_F16_X (0x0ce50)
#define BIFROST_ADD_OP_FRSQ_FAST_F16_Y (0x0ce70)
#define BIFROST_ADD_OP_LOG2_HELP (0x0cc68)
-#define BIFROST_ADD_OP_FEXP2_FAST (0x0cd58)
+#define BIFROST_ADD_OP_IABS_32 (0x07bd4)
struct bifrost_add_inst {
unsigned src0 : 3;
unsigned op : 17;
} __attribute__((packed));
+#define BIFROST_ADD_OP_DISCARD (0x19100 >> 8)
+
+enum bifrost_discard_cond {
+ BIFROST_DISCARD_FEQ = 0,
+ BIFROST_DISCARD_FNE = 1,
+ BIFROST_DISCARD_FLE = 2,
+ BIFROST_DISCARD_FLT = 3,
+};
+
+struct bifrost_add_discard {
+ unsigned src0 : 3;
+ unsigned src1 : 3;
+ enum bifrost_discard_cond cond : 2;
+ /* Zero for fp32 */
+ unsigned src0_select : 1;
+ unsigned src1_select : 1;
+ unsigned fp32 : 1;
+ unsigned op : 9;
+} __attribute__((packed));
+
#define BIFROST_ADD_OP_LD_UBO_1 (0x0c1a0 >> 3)
#define BIFROST_ADD_OP_LD_UBO_2 (0x0c1e0 >> 3)
#define BIFROST_ADD_OP_LD_UBO_3 (0x0caa0 >> 3)
#define BIFROST_ADD_OP_LD_UBO_4 (0x0c220 >> 3)
#define BIFROST_ADD_SEL_16(swiz) ((0xea60 >> 3) | (swiz))
+#define BIFROST_ADD_IADD_8 (0x17880 >> 3)
+#define BIFROST_ADD_IADD_16 (0x17900 >> 3)
+#define BIFROST_ADD_IADD_32 (0x178c0 >> 3)
+#define BIFROST_ADD_ISUB_8 (0x17a80 >> 3)
+#define BIFROST_ADD_ISUB_16 (0x17b00 >> 3)
+#define BIFROST_ADD_ISUB_32 (0x17ac0 >> 3)
+#define BIFROST_ADD_OP_FEXP2_FAST (0x0cd58 >> 3)
+
struct bifrost_add_2src {
unsigned src0 : 3;
unsigned src1 : 3;
BIFROST_OLE = 5,
};
+/* "gl" version produces 0/1. "d3d" version produces 0/~0 */
#define BIFROST_FMA_OP_FCMP_GL (0x48000 >> 13)
#define BIFROST_FMA_OP_FCMP_D3D (0x4c000 >> 13)
unsigned op : 6;
} __attribute__((packed));
+/* "gl" version produces 0/1. "d3d" version produces 0/~0 */
#define BIFROST_FMA_OP_FCMP_GL_16 (0xc8000 >> 13)
#define BIFROST_FMA_OP_FCMP_D3D_16 (0xcc000 >> 13)
enum bifrost_icmp_cond {
BIFROST_ICMP_IGT = 0,
- BIFROST_ICMP_IGE = 1,
- BIFROST_ICMP_UGT = 2,
+ BIFROST_ICMP_IGE = 1, /* swapped for 16-bit */
+ BIFROST_ICMP_UGT = 2, /* swapped for 16-bit */
BIFROST_ICMP_UGE = 3,
BIFROST_ICMP_EQ = 4,
BIFROST_ICMP_NEQ = 5,
+ BIFROST_ICMP_32_OR_8 = 6, /* nested */
+ BIFROST_ICMP_64 = 7, /* nested */
};
struct bifrost_fma_icmp32 {
unsigned src1 : 3;
enum bifrost_icmp_cond cond : 3;
unsigned unk1 : 1; /* set */
- unsigned d3d : 1;
+ unsigned d3d : 1; /* if set, true is ~0. otherwise, true is 1 */
unsigned op : 12;
} __attribute__((packed));
unsigned op : 9;
} __attribute__((packed));
+#define BIFROST_ADD_OP_ICMP_32 (0x0f600 >> 8)
+#define BIFROST_ADD_OP_ICMP_16 (0x0f000 >> 11)
+
struct bifrost_add_icmp {
unsigned src0 : 3;
unsigned src1 : 3;
enum bifrost_icmp_cond cond : 3;
unsigned sz : 1; /* 1 for 32, 0 for 8 */
- unsigned d3d : 1;
+ unsigned d3d : 1; /* if set, true is ~0. otherwise, true is 1 */
unsigned op : 9;
} __attribute__((packed));
+struct bifrost_add_icmp16 {
+ unsigned src0 : 3;
+ unsigned src1 : 3;
+ unsigned src0_swizzle : 2;
+ unsigned src1_swizzle : 2;
+ unsigned d3d : 1; /* if set, true is ~0. otherwise, true is 1 */
+ enum bifrost_icmp_cond cond : 3;
+ unsigned op : 6;
+} __attribute__((packed));
+
/* Two sources for vectorization */
#define BIFROST_FMA_FLOAT32_TO_16 (0xdd000 >> 3)
#define BIFROST_ADD_FLOAT32_TO_16 (0x0EC00 >> 3)
unsigned unk1 : 22;
} __attribute__((packed));
-#define BIFROST_ADD_OP_TEX_COMPACT_F32 (0x0b000 >> 10)
-#define BIFROST_ADD_OP_TEX_COMPACT_F16 (0x1b000 >> 10)
+#define BIFROST_ADD_OP_TEX_COMPACT_F32(vtx) ((0x0b000 | ((vtx) ? (0x400) : (0))) >> 10)
+#define BIFROST_ADD_OP_TEX_COMPACT_F16(vtx) ((0x1b000 | ((vtx) ? (0x400) : (0))) >> 10)
struct bifrost_tex_compact {
unsigned src0 : 3;
unsigned src1 : 3;
unsigned tex_index : 3;
- unsigned unknown : 1;
+ unsigned compute_lod : 1;
unsigned sampler_index : 3;
unsigned op : 7;
} __attribute__((packed));
BR_ALWAYS = 63,
};
+#define BIFROST_ADD_OP_BRANCH (0x0d000 >> 12)
+
struct bifrost_branch {
unsigned src0 : 3;