www.digitalmars.com         C & C++   DMDScript  

c++ - unoptimised assembly code when compiling one code?

reply veb <vebveb hotmail.fr> writes:
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
Jun 10 2010
parent reply Walter Bright <newshound1 digitalmars.com> writes:
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.
Jun 10 2010
parent reply veb <vebveb hotmail.fr> writes:
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.
Jun 11 2010
parent Walter Bright <newshound1 digitalmars.com> writes:
veb wrote:
 I post for those who would have te same problem on a 16 bits system.

Thanks!
Jun 12 2010