Re: GCC has problems with 64-bit multiplication

2007-02-26 Thread Hans Petter Selasky
On Thursday 08 February 2007 16:02, Graham Stott wrote:
 All,

 Not a bug in GCC the result is correct as you've only asked for a 32-bit
 multiply.

Hi again,

The problem was not that mull is used, but that gcc 3.4.6 generates highly 
un-optimized code when I for example multiply a 16-bit integer by a 64-bit 
integer.

It actually generates code where three multiplications are used instead of 
two. That has a speed impact.

Code:

#include stdio.h
#include sys/types.h

int main() {

int64_t temp;
int16_t x;

temp *= x;

printf(%lld\n, temp);

return 0;
}

objdump -D ./a.out

 8048507:   89 4d e8mov%ecx,0xffe8(%ebp)
 804850a:   31 c0   xor%eax,%eax
 804850c:   89 55 ecmov%edx,0xffec(%ebp)
 804850f:   f7 65 e8mull   0xffe8(%ebp)
 8048512:   6b 7d ec 00 imul   $0x0,0xffec(%ebp),%edi
 8048516:   89 d6   mov%edx,%esi
 8048518:   89 c1   mov%eax,%ecx
 804851a:   01 fe   add%edi,%esi
 804851c:   6b 45 e8 00 imul   $0x0,0xffe8(%ebp),%eax
 8048520:   83 e4 f0and$0xfff0,%esp
 8048523:   83 ec 14sub$0x14,%esp
 8048526:   8d 1c 06lea(%esi,%eax,1),%ebx

--HPS


GCC has problems with 64-bit multiplication

2007-02-08 Thread Hans Petter Selasky
Test program:

#include stdio.h
#include sys/types.h  

int main() {

int32_t a = 0x4000;
int16_t b = 0x4000;
int64_t c = a * b;

printf(0x%016llx\n, c);

return 0;
}

%cc test.c
%./a.out
0x

%gcc --version
gcc (GCC) 3.4.6 [FreeBSD] 20060305
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Generated assembly code:

 8048514:   c7 45 fc 00 00 00 40movl   $0x4000,0xfffc(%ebp)
 804851b:   66 c7 45 fa 00 40   movw   $0x4000,0xfffa(%ebp)
 8048521:   0f bf 45 fa movswl 0xfffa(%ebp),%eax
 8048525:   0f af 45 fc imul   0xfffc(%ebp),%eax
XXX this instruction is probably the bug:
 8048529:   99  cltd   
 804852a:   89 45 f0mov%eax,0xfff0(%ebp)
 804852d:   89 55 f4mov%edx,0xfff4(%ebp)
 8048530:   83 ec 04sub$0x4,%esp
 8048533:   ff 75 f4pushl  0xfff4(%ebp)
 8048536:   ff 75 f0pushl  0xfff0(%ebp)
 8048539:   68 cb 85 04 08  push   $0x80485cb
 804853e:   e8 49 fe ff ff  call   804838c _init+0x24
 8048543:   83 c4 10add$0x10,%esp

--HPS


Re: GCC has problems with 64-bit multiplication

2007-02-08 Thread Graham Stott
All,

Not a bug in GCC the result is correct as you've only asked for a 32-bit
multiply.

--- Hans Petter Selasky [EMAIL PROTECTED] wrote:

 Test program:
 
 #include stdio.h
 #include sys/types.h  
 
 int main() {
 
 int32_t a = 0x4000;
 int16_t b = 0x4000;
 int64_t c = a * b;
  ^ this is a 32-bit multiply with the result widened
to 64-bit,
 printf(0x%016llx\n, c);
 
 return 0;
 }
 



Re: GCC has problems with 64-bit multiplication

2007-02-08 Thread Hans Petter Selasky
On Thursday 08 February 2007 16:02, Graham Stott wrote:
 All,

 Not a bug in GCC the result is correct as you've only asked for a 32-bit
 multiply.

Ok, thanks. But really I don't want to do ((int64_t)a) * b, which I know 
works, hence that is very much slower than a * b on intel processors, hence 
the mull instruction will be used instead of imul.

I found the following option by googling:
-mwide-multiply multiplies of 32 bits are 64

Is there an __attribute__() that I can use that will enable this for one 
multiplication, and not all ? Or something similar ?


 --- Hans Petter Selasky [EMAIL PROTECTED] wrote:
  Test program:
 
  #include stdio.h
  #include sys/types.h
 
  int main() {
 
  int32_t a = 0x4000;
  int16_t b = 0x4000;
  int64_t c = a * b;

   ^ this is a 32-bit multiply with the result
 widened to 64-bit,

  printf(0x%016llx\n, c);
 
  return 0;
  }

--HPS