On Nov 8, 2005, at 11:39, Eduardo wrote:
At 04:42 08/11/2005, you wrote:
May be having case statement problem.
App has case statement with 146 sequential labels.
They are in order, from a defined type.
The assembler output is scanning each label, where it seems a jump
would be more efficient.
I don't understand well what you have:
Not this
case L3o3.Formtype of
1,2,3,....,146 : begin <somecode>
end;
or
This :)
case L3o3.FormType of
1 : begin <somecode1>
end
2 : begin <somecode2>
end
and so on.....
For the second case the assemmbler code seems ok to me, also L1051
L1052 L1053 looks like are different destinations. For the first,
well, it can be optimized "a bit" by hand, but note that it's
difficult to do in "automatic mode" by a compiler.
lwz r2,160(r1) // Load in r2 the value to compare
subi r3,r2,145 // Change 145 with the top value. Don't need
to record in cr0, so subi is used instead of subi. (with point)
cmplwi cr3,r3,0 // Change 0 with the low value. So if 145-r2
is greater or equal 0, it's between them or is one of them
bge cr3,L1051 // branch to L1051. Use bge+ cr3,L1051 if you
are sure that branch will be taken often
Note that cr3, is a condition register field and can be used by the
compiler for other pourposes. This code only works with integer values
0 < r2 < 65535, perhaps also works with chars. If you know that the
condition is true (r2 is between 0 and 145 often), you can use the '+'
format of the branch.
The code may not work, i'm writing it by memory.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Was under the impression that doing a jump, offset by label number,
would be faster. Specially for such long case statements.
P Davidson
http://CoraxNetworks.com
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal