There are only two cross paths in the C6000. This limits the C6000 to one source read from each data path's opposite register file per cycle. The compiler must select a side for each instruction; this is called partitioning.
It is recommended that you do not initially partition the linear assembly source code by hand. This allows the compiler more freedom to partition and optimize your code. If the compiler does not find an optimal partition in a software pipelined loop, then you can partition enough instructions by hand to force optimal partitioning by partitioning registers.
The assembly optimizer chooses a register for you such that its use agrees with the functional units chosen for the instructions that operate on the value.
Registers can be directly partitioned through two directives. The .rega directive is used to constrain a symbolic name to A-side registers. The .regb directive is used to constrain a symbolic name to B-side registers. See the .rega/.regb topic for further details on these directives. The .reg directive allows you to use descriptive names for values that are stored in registers. See the .reg topic for further details and examples of the .reg directive.
Example 1 is a hand-coded linear assembly program that computes a dot product; compare to Example 2, which illustrates C code.