uasm_build_label(pl, *pp, lbl);
 
        /* Generate the cache ops */
-       for (i = 0; i < unroll_lines; i++)
-               uasm_i_cache(pp, op, i * cache->linesz, t0);
+       for (i = 0; i < unroll_lines; i++) {
+               if (cpu_has_mips_r6) {
+                       uasm_i_cache(pp, op, 0, t0);
+                       uasm_i_addiu(pp, t0, t0, cache->linesz);
+               } else {
+                       uasm_i_cache(pp, op, i * cache->linesz, t0);
+               }
+       }
 
-       /* Update the base address */
-       uasm_i_addiu(pp, t0, t0, unroll_lines * cache->linesz);
+       if (!cpu_has_mips_r6)
+               /* Update the base address */
+               uasm_i_addiu(pp, t0, t0, unroll_lines * cache->linesz);
 
        /* Loop if we haven't reached the end address yet */
        uasm_il_bne(pp, pr, t0, t1, lbl);