+ case QOP_PACK_COLORS: {
+ /* We have to be careful not to start writing over one
+ * of our source values when incrementally writing the
+ * destination. So, if the dst is one of the srcs, we
+ * pack that one first (and we pack 4 channels at once
+ * for the first pack).
+ */
+ struct qpu_reg first_pack = src[0];
+ for (int i = 0; i < 4; i++) {
+ if (src[i].mux == dst.mux &&
+ src[i].addr == dst.addr) {
+ first_pack = dst;
+ break;
+ }
+ }
+ queue(c, qpu_m_MOV(dst, first_pack));
+ *last_inst(c) |= QPU_PM;
+ *last_inst(c) |= QPU_SET_FIELD(QPU_PACK_MUL_8888,
+ QPU_PACK);
+