Source-Changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src/sys/arch/arm/arm32
> On Wednesday 15 October 2003 2:56 pm, Richard Earnshaw wrote:
>
> > This is wrong. ldrd and strd are available on any v5E processor, so
> > it shouldn't be wrapped in '#ifdef XSCALE'.
>
> Ok, my 'fix' commit also jumped the gun, and hasn't actually solved the
> problem.
>
> What's the easiest/quickest way to determine if strd/ldrd are available?
Note that there's no such thing as strSh (storing a halfword is a
truncation not an extension operation).
The bit patterns are:
LDR (insn & 0x0c500000) == 0x04100000
LDRB (insn & 0x0c500000) == 0x04500000
LDRSB (insn & 0x0e1000f0) == 0x001000d0
LDRH (insn & 0x0e1000f0) == 0x001000b0
LDRSH (insn & 0x0e1000f0) == 0x001000f0
LDRD (insn & 0x0e1000f0) == 0x000000d0
(note the above will match ldrt and ldrbt, you will need to do further
tests if you want to exclude those).
STR (insn & 0x0c500000) == 0x04000000
STRB (insn & 0x0c500000) == 0x04400000
STRH (insn & 0x0e1000f0) == 0x000000b0
STRD (insn & 0x0e1000f0) == 0x000000f0
(similar note re STRT & STRBT)
So we see from this that LDRD/STRD are squeezed into the meaningless
STRSH/STRSB space.
So probably the best way to code this is
if ((insn & 0x0c100000) == 0x0c000000) /* STR, STRB */
|| (insn & 0x0e1000b0) == 0x000000b0) /* STR[HD] */
R.
Home |
Main Index |
Thread Index |
Old Index