# HG changeset patch # User Frits van Bommel # Date 1239637356 -7200 # Node ID 08f87d8cd101f2d285ad791b93fef324883683c3 # Parent 7e5547d8e59fc18d82d61445bfd3cf444d2c3b55 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. diff -r 7e5547d8e59f -r 08f87d8cd101 tests/mini/asm1_1.d --- a/tests/mini/asm1_1.d Mon Apr 13 16:16:03 2009 +0200 +++ b/tests/mini/asm1_1.d Mon Apr 13 17:42:36 2009 +0200 @@ -9,25 +9,25 @@ 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); diff -r 7e5547d8e59f -r 08f87d8cd101 tests/mini/asm6.d --- a/tests/mini/asm6.d Mon Apr 13 16:16:03 2009 +0200 +++ b/tests/mini/asm6.d Mon Apr 13 17:42:36 2009 +0200 @@ -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);