bi_pack_add_special(bi_instruction *ins, struct bi_registers *regs)
{
unsigned op = 0;
+ bool fp16 = ins->dest_type == nir_type_float16;
+ bool Y = ins->swizzle[0][0];
if (ins->op.special == BI_SPECIAL_FRCP) {
- op = BIFROST_ADD_OP_FRCP_FAST_F32;
+ op = fp16 ?
+ (Y ? BIFROST_ADD_OP_FRCP_FAST_F16_Y :
+ BIFROST_ADD_OP_FRCP_FAST_F16_X) :
+ BIFROST_ADD_OP_FRCP_FAST_F32;
} else {
- op = BIFROST_ADD_OP_FRSQ_FAST_F32;
+ op = fp16 ?
+ (Y ? BIFROST_ADD_OP_FRSQ_FAST_F16_Y :
+ BIFROST_ADD_OP_FRSQ_FAST_F16_X) :
+ BIFROST_ADD_OP_FRSQ_FAST_F32;
+
}
return bi_pack_add_1src(ins, regs, op);
#define BIFROST_ADD_OP_BLEND (0x1952c)
#define BIFROST_ADD_OP_FRCP_FAST_F32 (0x0cc00)
+#define BIFROST_ADD_OP_FRCP_FAST_F16_X (0x0ce10)
+#define BIFROST_ADD_OP_FRCP_FAST_F16_Y (0x0ce30)
#define BIFROST_ADD_OP_FRSQ_FAST_F32 (0x0cc20)
+#define BIFROST_ADD_OP_FRSQ_FAST_F16_X (0x0ce50)
+#define BIFROST_ADD_OP_FRSQ_FAST_F16_Y (0x0ce70)
struct bifrost_add_inst {
unsigned src0 : 3;