When you have an expression like this (extreme example):
a[idx][idx*4 +: 4] <= #(idx) 4'ha;
where a is a reg array and idx is a reg or net array. The retrieval of idx was clobbering index register 3, which was set before evaluating the part offset expression, then used in the %set/av of the array value. (likewise for idx and idx])
To avoid this issue, this patch adds and uses a new instruction %ix/mov which simply copies one indexed register to another. When necessary, expressions are first evaluated into temporary registers to avoid clobbering, then moved in to place before the %*/av instruction.