+ /* (-a)(-b) = ab, so we only need one negate bit */
+ bool negate_mul = ins->src_neg[0] ^ ins->src_neg[1];
+
+ struct bifrost_fma_fma pack = {
+ .src0 = bi_get_fma_src(ins, regs, 0),
+ .src1 = bi_get_fma_src(ins, regs, 1),
+ .src2 = bi_get_fma_src(ins, regs, 2),
+ .src0_abs = ins->src_abs[0],
+ .src1_abs = ins->src_abs[1],
+ .src2_abs = ins->src_abs[2],
+ .src0_neg = negate_mul,
+ .src2_neg = ins->src_neg[2],
+ .op = BIFROST_FMA_OP_FMA
+ };
+
+ RETURN_PACKED(pack);
+}
+
+static unsigned
+bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
+{
+ if (!bundle.fma)
+ return BIFROST_FMA_NOP;
+
+ switch (bundle.fma->type) {
+ case BI_ADD:
+ case BI_CMP:
+ case BI_BITWISE:
+ case BI_CONVERT:
+ case BI_CSEL:
+ return BIFROST_FMA_NOP;
+ case BI_FMA:
+ return bi_pack_fma_fma(bundle.fma, regs);
+ case BI_FREXP:
+ case BI_ISUB:
+ case BI_MINMAX:
+ case BI_MOV:
+ case BI_SHIFT:
+ case BI_SWIZZLE:
+ case BI_ROUND:
+ return BIFROST_FMA_NOP;
+ default:
+ unreachable("Cannot encode class as FMA");
+ }