IDE Netbeans 7.2
GDB: 7.3.50.20111026-cvs (cygwin-special)
GCC: 4.5.3 (for cygwin)
Assembly language and register values included as an attachment. Each section is
separated by '========'. There are are five section; {1} operator new() source
code, given below, {2} disassembly of code when a virtual base class destructor
is used; (3) register values immediately before the failure; (4) disassembly of
code when a virtual base class destructor is not used; (5) register values
before the final call.
I have a direct call to a concrete destructor (delete header) in a derived
class. The code generated when the base class constructor is virtual is
different then when the base class destructor is not virtual. The code generated
fails when the base class destructor is virtual and works correctly when the
base class destructor is not virtual.
Without going into too much detail, I am reimplementing Weizenbaum's SLIP in
C++. I use my own memory allocator. When memory is deleted it is put at the end
of a list of available space. Allocation is from the front of the available
space list. A sublist contains a pointer to the header of a list. During
allocation when the allocated space refers to a sublist then the associated
header contained in the sublist is deleted. The failure occurs in the inline
code associated with 'delete header'. Assembly language 'call' statement used
register eax which contains a zero, generating a fault on the call.
It is quite possible that I haven't implemented or understood the care and
feeding of virtual destructors. But a single line change causing this type of
damage is baffling, and all the non-sublist deletes seem to work correctly.
Sigh.
If I haven't said things correctly or if the things said are muddled and lack
reason, please correct me, don't punish me.
The base class destructor is ~SlipCell() { } in the base class header file.
The allocation code in the file SlipCell.cpp is; "operator new(size_t size);
void * SlipCellBase::operator new(size_t size) { // Create a new SLIP
cell
SlipCellBase* link;
do {
if (avsl.top == NULL) {
SlipCellBase::getAVSLSpace();
}
link = (SlipCellBase*)avsl.top;
avsl.top = avsl.top->rightLink;
avsl.avail--;
} while((long)link == TEMPORARY );
SlipOp* op = *(SlipOp**)link->getOperator();
if (op->isSublist()) {
SlipHeader* header = *(SlipHeader**)getSublistHeader(*link);
cout << link->dump() << endl
<< header->dump() << endl << flush;
delete header; // <== point of failure
}
/* Zero Cell */
link->setOperator((void*)undefinedOP);
link->rightLink = link->leftLink = (SlipCellBase*)UNDEFDATA;
link->resetData();
return link;
}; // void * SlipCellBase::operator new(size_t size)
The inline delete method in the file SlipHeader.h is:
~SlipHeader() { deleteHeader(); }; // ~SlipHeader()
void deleteHeader() {
if (*(getHeadRefCnt()) <= 1) {
addAVSLCells( this // pointer to first cell
, getLeftLink()); // pointer to last cell
} else
*(getHeadRefCnt()) -= 1;
}; // void deleteHeader()
virtual ~SlipCell() { } // virtual base class destructor
SlipCellBase::operator new(size_t size);
Source Code in SlipCell.cpp
void * SlipCellBase::operator new(size_t size) { // Create a new SLIP cell
SlipCellBase* link;
do {
if (avsl.top == NULL) {
SlipCellBase::getAVSLSpace();
}
link = (SlipCellBase*)avsl.top;
avsl.top = avsl.top->rightLink;
avsl.avail--;
} while((long)link == TEMPORARY );
SlipOp* op = *(SlipOp**)link->getOperator();
if (op->isSublist()) {
SlipHeader* header = *(SlipHeader**)getSublistHeader(*link);
cout << link->dump() << endl
<< header->dump() << endl << flush;
delete header; // <== point of failure. Code generated
// is different for virtual vs.
// non-virtual base class destructor
}
===================================================
Disassembly of a portion of the operator new() code witha virtual base class
! cout << link->dump() << endl
_fu31___ZSt4cout+72: lea -0x18(%ebp),%eax
_fu31___ZSt4cout+75: mov %eax,(%esp)
_fu31___ZSt4cout+78: call 0x45d8e0 <_ZNSsD1Ev>
_fu31___ZSt4cout+181: lea -0x18(%ebp),%eax
_fu31___ZSt4cout+184: mov %eax,(%esp)
_fu31___ZSt4cout+187: call 0x45d8e0 <_ZNSsD1Ev>
_fu31___ZSt4cout+192: jmp 0x43dfa4 <_fu31___ZSt4cout+196>
_fu31___ZSt4cout+194: mov %eax,%ebx
! << header->dump() << endl << flush;
_fu31___ZSt4cout+25: lea -0x1c(%ebp),%edx
_fu31___ZSt4cout+28: mov %edx,0x4(%esp)
_fu31___ZSt4cout+32: mov %eax,(%esp)
_fu31___ZSt4cout+35: call 0x45d900 <_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E>
_fu31___ZSt4cout+40: movl $0x45d8e8,0x4(%esp)
_fu31___ZSt4cout+48: mov %eax,(%esp)
_fu31___ZSt4cout+51: call 0x45d908 <_ZNSolsEPFRSoS_E>
_fu31___ZSt4cout+56: movl $0x45d8f0,0x4(%esp)
_fu31___ZSt4cout+64: mov %eax,(%esp)
_fu31___ZSt4cout+67: call 0x45d908 <_ZNSolsEPFRSoS_E>
_fu31___ZSt4cout+83: lea -0x1c(%ebp),%eax
_fu31___ZSt4cout+86: mov %eax,(%esp)
_fu31___ZSt4cout+89: call 0x45d8e0 <_ZNSsD1Ev>
_fu31___ZSt4cout+196: lea -0x1c(%ebp),%eax
_fu31___ZSt4cout+199: mov %eax,(%esp)
_fu31___ZSt4cout+202: call 0x45d8e0 <_ZNSsD1Ev>
_fu31___ZSt4cout+207: mov %ebx,%eax
_fu31___ZSt4cout+209: mov %eax,(%esp)
_fu31___ZSt4cout+212: call 0x45da90 <_Unwind_Resume>
_fu31___ZSt4cout+217: nop
! delete header;
_fu31___ZSt4cout()
_fu31___ZSt4cout+94: cmpl $0x0,-0x14(%ebp)
_fu31___ZSt4cout+98: je 0x43df56 <_fu31___ZSt4cout+118>
_fu31___ZSt4cout+100: mov -0x14(%ebp),%eax
_fu31___ZSt4cout+103: mov (%eax),%eax
_fu31___ZSt4cout+105: add $0x10,%eax
_fu31___ZSt4cout+108: mov (%eax),%edx
_fu31___ZSt4cout+110: mov -0x14(%ebp),%eax
_fu31___ZSt4cout+113: mov %eax,(%esp)
_fu31___ZSt4cout+116: call *%edx ; <== point of failure w/ edx == 0
! }
!
! /* Zero Cell */
! link->setOperator((void*)undefinedOP);
_fu31___ZSt4cout+118: mov 0x48a390,%eax
_fu31___ZSt4cout+123: mov %eax,0x4(%esp)
_fu31___ZSt4cout+127: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+130: mov %eax,(%esp)
_fu31___ZSt4cout+133: call 0x43dfd4 <slip::SlipCellBase::setOperator(void*)>
! link->rightLink = link->leftLink = (SlipCellBase*)UNDEFDATA;
_fu31___ZSt4cout+138: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+141: movl $0xdeadbeef,0x8(%eax)
_fu31___ZSt4cout+148: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+151: mov 0x8(%eax),%edx
_fu31___ZSt4cout+154: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+157: mov %edx,0xc(%eax)
! link->resetData();
_fu31___ZSt4cout+160: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+163: mov %eax,(%esp)
_fu31___ZSt4cout+166: call 0x45ee8c <slip::SlipCellBase::resetData()>
! return link;
_fu31___ZSt4cout+171: mov -0xc(%ebp),%eax
! }; // void * SlipCellBase::operator new(size_t size)
_fu31___ZSt4cout+174: mov -0x4(%ebp),%ebx
_fu31___ZSt4cout+177: leave
_fu31___ZSt4cout+178: ret
_fu31___ZSt4cout+179: mov %eax,%ebx
==============================================================
register values immediately before the point of failure
eax 0x8006bdd0
ecx 0x0
edx 0x0
ebx 0x8006bdb8
esp 0x28ab20
ebp 0x28ab58
esi 0x28abb4
edi 0x28ab98
eip 0x43df54
eflags 0x206
cs 0x23
ss 0x2b
ds 0x2b
es 0x2b
fs 0x53
gs 0x2b
st0 0x0
st1 0x0
st2 0x0
st3 0x0
st4 0x0
st5 0x0
st6 0x2
st7 0x0
fctrl 0x37f
fstat 0x20
ftag 0xffff
fiseg 0x23
fioff 0x61160d94
foseg 0x2b
fooff 0x28a574
fop 0x0
xmm0 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm2 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm3 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm4 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm5 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm6 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm7 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
mxcsr 0x1f80
al 0xd0
cl 0x0
dl 0x0
bl 0xb8
ah 0xbd
ch 0x0
dh 0x0
bh 0xbd
ax 0xbdd0
cx 0x0
dx 0x0
bx 0xbdb8
bp 0xab58
si 0xabb4
di 0xab98
mm0 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm1 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm2 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm3 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm4 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm5 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm6 {uint64 = 0x8000000000000000, v2_int32 = {0x0, 0x80000000}, v4_int16 = {0x0, 0x0, 0x0, 0x8000}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80}}
mm7 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
========================================================================================
~SlipCell() { } // non-virtual base class destructor
A portion of the generated code
! cout << link->dump() << endl
_fu31___ZSt4cout+72: lea -0x18(%ebp),%eax
_fu31___ZSt4cout+75: mov %eax,(%esp)
_fu31___ZSt4cout+78: call 0x45d8c0 <_ZNSsD1Ev>
_fu31___ZSt4cout+180: lea -0x18(%ebp),%eax
_fu31___ZSt4cout+183: mov %eax,(%esp)
_fu31___ZSt4cout+186: call 0x45d8c0 <_ZNSsD1Ev>
_fu31___ZSt4cout+191: jmp 0x43df7b <_fu31___ZSt4cout+195>
_fu31___ZSt4cout+193: mov %eax,%ebx
! << header->dump() << endl << flush;
_fu31___ZSt4cout+25: lea -0x1c(%ebp),%edx
_fu31___ZSt4cout+28: mov %edx,0x4(%esp)
_fu31___ZSt4cout+32: mov %eax,(%esp)
_fu31___ZSt4cout+35: call 0x45d8e0 <_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E>
_fu31___ZSt4cout+40: movl $0x45d8c8,0x4(%esp)
_fu31___ZSt4cout+48: mov %eax,(%esp)
_fu31___ZSt4cout+51: call 0x45d8e8 <_ZNSolsEPFRSoS_E>
_fu31___ZSt4cout+56: movl $0x45d8d0,0x4(%esp)
_fu31___ZSt4cout+64: mov %eax,(%esp)
_fu31___ZSt4cout+67: call 0x45d8e8 <_ZNSolsEPFRSoS_E>
_fu31___ZSt4cout+83: lea -0x1c(%ebp),%eax
_fu31___ZSt4cout+86: mov %eax,(%esp)
_fu31___ZSt4cout+89: call 0x45d8c0 <_ZNSsD1Ev>
_fu31___ZSt4cout+195: lea -0x1c(%ebp),%eax
_fu31___ZSt4cout+198: mov %eax,(%esp)
_fu31___ZSt4cout+201: call 0x45d8c0 <_ZNSsD1Ev>
_fu31___ZSt4cout+206: mov %ebx,%eax
_fu31___ZSt4cout+208: mov %eax,(%esp)
_fu31___ZSt4cout+211: call 0x45da70 <_Unwind_Resume>
! delete header; // <== no failure, the generated code is different
_fu31___ZSt4cout()
_fu31___ZSt4cout+94: mov -0x14(%ebp),%ebx
_fu31___ZSt4cout+97: test %ebx,%ebx
_fu31___ZSt4cout+99: je 0x43df2d <_fu31___ZSt4cout+117>
_fu31___ZSt4cout+101: mov %ebx,(%esp)
_fu31___ZSt4cout+104: call 0x45e7cc <slip::SlipHeader::~SlipHeader()>
_fu31___ZSt4cout+109: mov %ebx,(%esp)
_fu31___ZSt4cout+112: call 0x45eefc <slip::SlipCellBase::operator delete(void*)>
! }
!
! /* Zero Cell */
! link->setOperator((void*)undefinedOP);
_fu31___ZSt4cout+117: mov 0x48a390,%eax
_fu31___ZSt4cout+122: mov %eax,0x4(%esp)
_fu31___ZSt4cout+126: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+129: mov %eax,(%esp)
_fu31___ZSt4cout+132: call 0x43dfaa <slip::SlipCellBase::setOperator(void*)>
! link->rightLink = link->leftLink = (SlipCellBase*)UNDEFDATA;
_fu31___ZSt4cout+137: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+140: movl $0xdeadbeef,0x8(%eax)
_fu31___ZSt4cout+147: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+150: mov 0x8(%eax),%edx
_fu31___ZSt4cout+153: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+156: mov %edx,0xc(%eax)
! link->resetData();
_fu31___ZSt4cout+159: mov -0xc(%ebp),%eax
_fu31___ZSt4cout+162: mov %eax,(%esp)
_fu31___ZSt4cout+165: call 0x45ee34 <slip::SlipCellBase::resetData()>
! return link;
_fu31___ZSt4cout+170: mov -0xc(%ebp),%eax
! }; // void * SlipCellBase::operator new(size_t size)
_fu31___ZSt4cout+173: mov -0x4(%ebp),%ebx
_fu31___ZSt4cout+176: leave
_fu31___ZSt4cout+177: ret
_fu31___ZSt4cout+178: mov %eax,%ebx
============================================================
Register values before the second call statement above
_fu31___ZSt4cout+112: call 0x45eefc <slip::SlipCellBase::operator delete(void*)>
eax 0x1
ecx 0x0
edx 0x6118c480
ebx 0x8006bdd0
esp 0x28ab20
ebp 0x28ab58
esi 0x28abb4
edi 0x28ab98
eip 0x43df20
eflags 0x282
cs 0x23
ss 0x2b
ds 0x2b
es 0x2b
fs 0x53
gs 0x2b
st0 0x0
st1 0x0
st2 0x0
st3 0x0
st4 0x0
st5 0x0
st6 0x2
st7 0x0
fctrl 0x37f
fstat 0x20
ftag 0xffff
fiseg 0x23
fioff 0x61160d94
foseg 0x2b
fooff 0x28a574
fop 0x0
xmm0 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm2 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm3 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm4 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm5 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm6 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm7 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
mxcsr 0x1f80
al 0x1
cl 0x0
dl 0x80
bl 0xd0
ah 0x0
ch 0x0
dh 0xc4
bh 0xbd
ax 0x1
cx 0x0
dx 0xc480
bx 0xbdd0
bp 0xab58
si 0xabb4
di 0xab98
mm0 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm1 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm2 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm3 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm4 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm5 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
mm6 {uint64 = 0x8000000000000000, v2_int32 = {0x0, 0x80000000}, v4_int16 = {0x0, 0x0, 0x0, 0x8000}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80}}
mm7 {uint64 = 0x0, v2_int32 = {0x0, 0x0}, v4_int16 = {0x0, 0x0, 0x0, 0x0}, v8_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}