title: What is the function of the additional coprocessor register of the MRC command?
body: <p>Quoting from the ARM <code>MRC</code> documentation,</p>
  
  <blockquote>
  <pre><code>MRC{2}&lt;c&gt;&lt;q&gt; &lt;coproc&gt;, #&lt;opc1&gt;, &lt;Rt&gt;, &lt;CRn&gt;, &lt;CRm&gt;{, #&lt;opc2&gt;}
  </code></pre>
    
    <p>where:</p>
    
    <p><code>2</code>     If specified, selects encoding T2 / A2. If omitted, selects encoding T1 / A1.</p>
    
    <p><code>&lt;c&gt;&lt;q&gt;</code> See Standard assembler syntax fields on page A8-7. An ARM MRC2 instruction must be unconditional.</p>
    
    <p><code>&lt;coproc&gt;</code> The name of the coprocessor. The standard generic coprocessor names are p0, p1, …, p15.</p>
    
    <p><code>&lt;opc1&gt;</code> Is a coprocessor-specific opcode in the range 0 to 7.</p>
    
    <p><code>&lt;Rt&gt;</code> Is the destination ARM core register. This register can be R0-R14 or APSR_nzcv. The last form writes bits [31:28] of the transferred value to the N, Z, C and V condition flags and is specified by setting the Rt field of the encoding to 0b1111. In pre-UAL assembler syntax, PC was written instead of APSR_nzcv to select this form.</p>
    
    <p><code>&lt;CRn&gt;</code> Is the coprocessor register that contains the first operand.</p>
    
    <p><code>&lt;CRm&gt;</code> Is an additional source or destination coprocessor register.</p>
    
    <p><code>&lt;opc2&gt;</code> Is a coprocessor-specific opcode in the range 0 to 7. If omitted, <code>&lt;opc2&gt;</code> is assumed to be 0.</p>
  </blockquote>
  
  <p>If <code>MRC</code> is meant to copy contents of a single coprocessor register into a single ARM register, what is the reason for <code>CRm</code>? Also, I'm not quite sure what the reason for an <code>opcode</code> is either, but that's of lesser relevance.</p>