Some questions

Guillermo Adrián Molina guille at losmolina.com.ar
Sun May 6 08:42:59 UTC 2007


> Guillermo Adrián Molina writes:
>  > > In Exupery the SmallInteger addtion sequence is
>  > >    bitTest arg1
>  > >    jumpIfSet failureBlock
>  > >    bitTest arg2
>  > >    jumpIfSet failureBlock
>  > >    clearTagBit arg1
>  > >    add arg1 arg2
>  > >    jumpOverflow failureBlock
>  > >
>  > > The failure case is a full message send.
>  > >
>  > The problem with the above code is that you have 3 branches.
>  > That is why I need jump tables, there are cases where cmov really
> dosn't help
>
> There is only 3 branches and I'm hoping that they will never be
> taken so they should be easy to predict. That said the branches do
> use branch predictor resources which could cause other branches not
> to be predicted as well.
>
Yes, I agree. I am really not an expert int this matters, but I think It
is not so uncommon to send #+ with other objects than smallints, in that
case, may be one of the first 2 branches would be misspredicted. May be
you could test that both of them are smallints with just one branch. (I am
doing that right now). But may be I will try to do it without branching at
all

>  > Before I started using exupery, I called special methods in C that
>  > implemented faster code. Every special method (and primitives) returned
> 1
>  > in case of an error, and if success, returned the result object.
>  > One of this special methods was +. This is part of the code:
>  >
>  > if(areIntegers(rcvr,arg)) {
>  > 	int result;
>  > 	asm(	"movl $1,%%edx\n\t"
>  > 		"movl %[rcvr],%[result]\n\t"
>  > 		"addl %[arg],%[result]\n\t"
>  > 		"cmovol %%edx,%[result]"
>  > 		: [result] "=r" (result)
>  > 		: [rcvr] "r" (rcvr), [arg] "r" (arg)
>  > 		: "edx" );
>  > 	return result;
>  > }
>  >
>  > with this code, I've got up to 10% faster code in + intensive tests.
>
> Do you have conditionals inside areIntegers and to check if the result
> is 1 indicating an error?
>
As I dont use this code so often as before, (because I inline that with
exupery at compile time) I dont't worry about it any more. But
areIntegers() is just an "or" and an "and", the branch is represented in
the C "if" statement. I wrote the addition that way because I wanted to
test if cmov was really that fast. It was better, but not THAT better.

Guille



More information about the Exupery mailing list