This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Coprocessor instruction differencies?

Are there differences between coprocessor instructions and instruction2:s?

I mean:

MCRR vs. MCRR2

MRRC vs. MRRC2

MCR vs. MCR2

MRC vs. MRC2

LDC vs. LDC2

STC vs STC2

I didn't find any differences in the encoding except the condition code, and no differences in the description of the functionality.

If there are no differences, are there any explanations why they are "condition-code-doubled"?

Parents
  • In my manual (ARMv7-A/R ARM, Issue C) it says:

    Coprocessor 15 (CP15) provides system control functionality.

    Coprocessor 14 (CP14) supports:

    — debug, see Chapter C6 Debug Register Interfaces

    — the Thumb Execution Environment, see Thumb Execution Environment on page A2-95

    — direct Java bytecode execution, see Jazelle direct bytecode execution support on page A2-97.


    Coprocessors 10 and 11 (CP10 and CP11) together support floating-point and vector operations, and the

    control and configuration of the Floating-point and Advanced SIMD architecture extensions.

    Coprocessors 8, 9, 12, and 13 are reserved for future use by ARM. Any coprocessor access instruction

    attempting to access one of these coprocessors is UNDEFINED

    Coprocessors 0 to 7 can provide vendor-specific features.

    LDC:

    cond 1 1 0 P U D W 1 Rn CRd coproc imm8

    if Rn == ‘1111’ then SEE LDC (literal);

    if P == ‘0’ && U == ‘0’ && D == ‘0’ && W == ‘0’ then UNDEFINED;

    if P == ‘0’ && U == ‘0’ && D == ‘1’ && W == ‘0’ then SEE MRRC, MRRC2;

    if coproc IN “101x” then SEE “Advanced SIMD and Floating-point”;

    LDC2:

    1 1 1 1 1 1 0 P U D W 1 Rn CRd coproc imm8

    if Rn == ‘1111’ then SEE LDC (literal);

    if P == ‘0’ && U == ‘0’ && D == ‘0’ && W == ‘0’ then UNDEFINED;

    if P == ‘0’ && U == ‘0’ && D == ‘1’ && W == ‘0’ then SEE MRRC, MRRC2;

    if coproc IN “101x” then UNDEFINED;

    To my understanding the same CRd and coproc goes to either encodings except cp10 and cp11.

    0xfd910a01    ldc2

    10, cr0, [r1, #4]

    1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 = 0xfd910a01

    1 1 1 1 1 1 0 P U D W 1   Rn      CRd    coproc imm8

    P=1, U=1, D=0, W=0, Rn= r1, CRd= cr0, coproc=10, imm=1

    Looks like the disassembler doesn't disassemble the ldc2 into vldrs0, [r1, #4],

    [EDIT] And it shouldn't, but should it mark it UNDEFINED or something... [/EDIT]

    I guess they are the same, but it's hard to tell - there seems to be no info about coproc 10 registers,

    except system registers (accessed via CP15).

    I looked into these:

    DDI0406C_C_arm_architecture_reference_manual.pdf,

    DDI0462F_cortex_a7_neon_mpe_r0p5_trm.pdf

    DDI0463F_cortex_a7_fpu_r0p5_trm.pdf

    Any idea/hunch/good guess/not-so-good guess where to look next?

Reply
  • In my manual (ARMv7-A/R ARM, Issue C) it says:

    Coprocessor 15 (CP15) provides system control functionality.

    Coprocessor 14 (CP14) supports:

    — debug, see Chapter C6 Debug Register Interfaces

    — the Thumb Execution Environment, see Thumb Execution Environment on page A2-95

    — direct Java bytecode execution, see Jazelle direct bytecode execution support on page A2-97.


    Coprocessors 10 and 11 (CP10 and CP11) together support floating-point and vector operations, and the

    control and configuration of the Floating-point and Advanced SIMD architecture extensions.

    Coprocessors 8, 9, 12, and 13 are reserved for future use by ARM. Any coprocessor access instruction

    attempting to access one of these coprocessors is UNDEFINED

    Coprocessors 0 to 7 can provide vendor-specific features.

    LDC:

    cond 1 1 0 P U D W 1 Rn CRd coproc imm8

    if Rn == ‘1111’ then SEE LDC (literal);

    if P == ‘0’ && U == ‘0’ && D == ‘0’ && W == ‘0’ then UNDEFINED;

    if P == ‘0’ && U == ‘0’ && D == ‘1’ && W == ‘0’ then SEE MRRC, MRRC2;

    if coproc IN “101x” then SEE “Advanced SIMD and Floating-point”;

    LDC2:

    1 1 1 1 1 1 0 P U D W 1 Rn CRd coproc imm8

    if Rn == ‘1111’ then SEE LDC (literal);

    if P == ‘0’ && U == ‘0’ && D == ‘0’ && W == ‘0’ then UNDEFINED;

    if P == ‘0’ && U == ‘0’ && D == ‘1’ && W == ‘0’ then SEE MRRC, MRRC2;

    if coproc IN “101x” then UNDEFINED;

    To my understanding the same CRd and coproc goes to either encodings except cp10 and cp11.

    0xfd910a01    ldc2

    10, cr0, [r1, #4]

    1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 = 0xfd910a01

    1 1 1 1 1 1 0 P U D W 1   Rn      CRd    coproc imm8

    P=1, U=1, D=0, W=0, Rn= r1, CRd= cr0, coproc=10, imm=1

    Looks like the disassembler doesn't disassemble the ldc2 into vldrs0, [r1, #4],

    [EDIT] And it shouldn't, but should it mark it UNDEFINED or something... [/EDIT]

    I guess they are the same, but it's hard to tell - there seems to be no info about coproc 10 registers,

    except system registers (accessed via CP15).

    I looked into these:

    DDI0406C_C_arm_architecture_reference_manual.pdf,

    DDI0462F_cortex_a7_neon_mpe_r0p5_trm.pdf

    DDI0463F_cortex_a7_fpu_r0p5_trm.pdf

    Any idea/hunch/good guess/not-so-good guess where to look next?

Children
No data