[coldfire-gnu-discuss] trapf opcode
David Brown
david at westcontrol.com
Wed Nov 15 15:41:45 UTC 2006
Nathan Sidwell wrote:
> Paul McConkey wrote:
>
>> So the assembler supports trapf, which is fine, but are you likely to
>> support the CF syntax below in future? If so, will you deprecate or
>> remove the support for trapf?
>>
>> CFPRM rev.3 p 4-83
>>
>> Assembler syntax: TPF PC + 2 -> PC
>> TPF.W PC + 4 -> PC
>> TPF.L PC + 6 -> PC
>
> oh joy. trapf is the cpu32 instruction name, coldfire appears to have
> selected a different name for the same encoding.
>
> We won't remove trapf, but will probably accept 'tpf' as an alternative.
>
> nathan
>
The TRAPcc instruction in the cpu32 was a bit more general, and could
trap to vector 7 on a given condition code (the same as for branches).
The Coldfire does not really implement these instructions (vector 7 is
"reserved"). However, TRAPF, which never actually traps, is still there
as it is useful as a sort of "skip next instruction" instruction. I
guess they renamed it to stop people expecting TRAPZ and all the other
TRAPcc instructions.
The ColdFire manual gives an idea of how the TPF.W and TPF.L
instructions can be as "bra.b +2" and "bra.b +4" alternatives, taking 1
clock cycle instead of 2. This could perhaps be implemented as a
peephole optimisation after initial code generation. Of course, it
would work better if gcc generated better code for something like:
extern unsigned long int a, b, z;
void test(void) {
if (a == b) {
z = 3;
} else {
z = 1;
};
}
Today it generates:
37 test:
38 0000 4E56 0000 link.w %fp,#0
39 0004 2039 0000 move.l b,%d0 | b,
39 0000
40 000a B0B9 0000 cmp.l a.l,%d0 | a,
40 0000
41 0010 670A jbeq .L7 |
42 0012 7001 moveq #1,%d0 |,
43 0014 23C0 0000 move.l %d0,z |, z
43 0000
44 001a 6008 jbra .L5 |
45 .L7:
46 001c 7003 moveq #3,%d0 |,
47 001e 23C0 0000 move.l %d0,z |, z
47 0000
48 .L5:
49 0024 4E5E unlk %fp
50 0026 4E75 rts
If that were optimised to shorter code with the duplicate "move.l %d, z"
moved to after .L5:
test:
link.w %fp, #0
move.l b, %d0
cmp.l a.l, %d0
jbeq .L7
moveq #1, %d0
jbra .L5
.L7:
moveq #3, %d0
.L5:
move.l %d0, z
unlk %fp
rts
Then the TPF.W instruction could be used instead of the jbra
instruction, saving a clock cycle. On the more advanced Coldfire cores
with more pipelining, the TPF instruction may save even more than a branch.
mvh.,
David
More information about the coldfire-gnu-discuss
mailing list