--- Comment #2 from tmartsum at gmail dot com 2010-09-12 15:01 ---
With Subtraction the situation is very similar:
struct Skew1 // Even
{
unsigned long long data;
unsigned long unused;
};
struct Skew2 // Odd
{
unsigned long unused;
unsigned long long data;
};
struct ULongLongLong
{
union
{
unsigned long m_data[3];
Skew1 m_rep1;
Skew2 m_rep2;
};
ULongLongLong()
{
m_data[0]=0;
m_data[1]=0;
m_data[2]=0;
}
void print() { std::cout << m_data[0] << "," << m_data[1] << "," <<
m_data[2] << "\n";}
// void addtest(const ULongLongLong &b); // operator +=
void subtest(const ULongLongLong &b); // operator -=
};
It gives the following code:
.globl _ZN13ULongLongLong7subtestERKS_
.type _ZN13ULongLongLong7subtestERKS_, @function
_ZN13ULongLongLong7subtestERKS_:
.LFB965:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl%esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
movl12(%ebp), %edx
movl8(%ebp), %eax
pushl %ebx
xorl%ebx, %ebx
.cfi_offset 3, -12
movl(%edx), %ecx
subl%ecx, (%eax)
sbbl%ebx, 4(%eax)
xorl%ebx, %ebx
movl4(%edx), %ecx
subl%ecx, 4(%eax)
sbbl%ebx, 8(%eax)
movl8(%edx), %edx
subl%edx, 8(%eax)
popl%ebx
popl%ebp
ret
.cfi_endproc
This could be optimized (just like the addition).
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45548