Thread overview
unoptimised assembly code when compiling one code?
Jun 10, 2010
veb
Jun 11, 2010
Walter Bright
Jun 11, 2010
veb
Jun 12, 2010
Walter Bright
June 10, 2010
Hello,

When I compile this C code:(in a 16 bits system, so sizeof(int) = 2)
long i;
....
TValue *rb = (cast(int, ((i)>>23) & 0x1F));
float nb = rb->value.n;

The asm code (obj2asm) is:
                mov	DI,-070h[BP]
		mov	DX,-072h[BP]
		mov	AX,-074h[BP]
		mov	CL,017h
L1251:		shr	DX,1
		rcr	AX,1
		loop	L1251
		and	AH,1
		imul	BX,AX,6
		add	BX,-07Ah[BP]
		mov	DX,2[BX]
		mov	AX,[BX]

This code is often read in my programm, and I know the loop L1251 isn't very
optimised.
I think this should be faster:
instead of :
                mov	CL,017h
L1251:		shr	DX,1
		rcr	AX,1
		loop	L1251
having:
                mov AX,DX
                shr AX, 7

Could you help me, please, to improve my C code to obtain a better assembly code when compiling this code(like the faster assembly code I wrote)

Thanks!

veb
June 11, 2010
veb wrote:
> Could you help me, please, to improve my C code to obtain a better assembly
> code when compiling this code(like the faster assembly code I wrote)

You can try using the inline assembler.
June 11, 2010
Hello,

I changed the code to:

struct f16
 {
         unsigned int word1;
         unsigned int word2;
 };

TValue *rb = cast(int, ((((struct f16 *)&i)-> word2)>>(23-16) & 0x1F)));
float nb = rb->value.n;

My new code is globally two time more faster, because I have exactly what I wanted to have in the asm code.

I post for those who would have te same problem on a 16 bits system.
June 12, 2010
veb wrote:
> I post for those who would have te same problem on a 16 bits system.

Thanks!