Fix some unittests for 64-bit asm. They were operating on int variables as if

they were longs.
This was causing asm1_1 to fail when compiled with -O3 because it was
overwriting the spilled value of callee-saved register %rbx, which the runtime
was using as a pointer value at the time.
This commit is contained in:
Frits van Bommel
2009-04-13 17:42:36 +02:00
parent c44c52296f
commit 909c6dae18
2 changed files with 30 additions and 36 deletions

View File

@@ -9,25 +9,25 @@ int main()
printf("%d\n", i);
version (D_InlineAsm_X86)
{
asm
{
mov EBX, ip;
mov EAX, [EBX];
add EAX, 8;
mul EAX, EAX;
mov [EBX], EAX;
}
asm
{
mov ECX, ip;
mov EAX, [ECX];
add EAX, 8;
mul EAX, EAX;
mov [ECX], EAX;
}
}
else version (D_InlineAsm_X86_64)
{
asm
{
movq RCX, ip;
movq RAX, [RCX];
add RAX, 8;
imul RAX, RAX;
movq [RCX], RAX;
}
asm
{
movq RCX, ip;
mov EAX, [RCX];
add EAX, 8;
imul EAX, EAX;
mov [RCX], EAX;
}
}
printf("%d\n", i);
assert(i == 400);

View File

@@ -1,31 +1,25 @@
extern(C) int printf(char*, ...);
version (D_InlineAsm_X86)
version = InlineAsm_X86_Any;
version (D_InlineAsm_X86_64)
version = InlineAsm_X86_Any;
void main()
{
int a,b,c;
a = int.max-1;
b = 5;
version (D_InlineAsm_X86)
version (InlineAsm_X86_Any)
{
asm
{
mov EAX, a;
mov ECX, b;
add EAX, ECX;
jo Loverflow;
mov c, EAX;
}
}
else version (D_InlineAsm_X86_64)
{
asm
{
movq RDX, a;
movq RAX, b;
add RDX, RAX;
jo Loverflow;
movq c, RDX;
}
asm
{
mov EAX, a;
mov ECX, b;
add EAX, ECX;
jo Loverflow;
mov c, EAX;
}
}
printf("a == %d\n", a);
printf("b == %d\n", b);