bugGNU Development Chain for 68HC11/68HC12 - Bugs: bug #30609, long long is not 64-bit as...

 
 

You are not allowed to post comments on this tracker with your current authentication level.

bug #30609: long long is not 64-bit as advertised, __uint64_t not 64-bit too

Submitted by:  None
Submitted on:  Sat 31 Jul 2010 12:44:27 AM UTC  
 
Category:  gcc Severity:  3 - Normal
Item Group:  None Status:  None
Privacy:  Public Assigned to:  None
Open/Closed:  Open

Wed 11 Aug 2010 12:26:35 AM UTC, comment #1: 

According to my investigation, there may not be a problem.  With the IAR Embedded Compiler, the integer constants work as shown.  However, with this Gnu compiler I need to put "ll" at the end of the 64-bit constants.  I guess this is acceptable for C, I haven't taken the time to look that up.

Also, for the multiplication, 64-bit multiplication results if I cast x to an unsigned long long in the line of code where the multiplication is invoked.

Craig Scratchley <scratchley>
Sat 31 Jul 2010 12:44:27 AM UTC, original submission:  

Hi.  Information on the compiler states:

************************
long long
unsigned long long
Long long are 64-bit entities. They are never allocated in a hard register. They are passed on the stack for operations. They are returned like a struct (in memory). Logical operations (and, or, xor) are generated inline. Other operations are made by a library call. Some shift operations are generated inline.

63      55     47     39     31      23     15     7    0
+------+------+------+------+------+------+------+------+
|  7   |  6   |  5   |  4   |  3   |  2   |  1   |  0   |
+------+------+------+------+------+------+------+------+
************************

However, I get the errors:

4 main.c
 warning: integer constant is too large for "long" type
9 main.c
 warning: integer constant is too large for "long" type

For the following program:

                  • begin main.c ***************

#include <sys/types.h>
//#include <machine/types.h>

__uint64_t b =   0x11111111876;
//u_int64_t a =   0x1111111187;

unsigned long int x =  0xffffffff;
unsigned long int y =  0xeeeeeeee;
unsigned long long z = 0x111111118;

int main ()
{
 z = x * y;
 return 0;
}

                  • end main.c ***************

Also, looking at the assembly generated (optimization turned off), the multiplication result doesn't seem to be 64 bit.

Anonymous

 

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by scratchley (Posted a comment)
  •  

    Do you think this task is very important?
    If so, you can add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

     

     

    No changes have been made to this item

    Back to the top


    Powered by Savane 3.5