# HG changeset patch # User thomask # Date 1167142897 0 # Node ID 229e630d4b1a67c1c82c1cce12a28dd5f627663b # Parent 96e7be832c351b0e3137148416f80ba347db22f9 partuial inline asm review diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_packssdw_01_A.d --- a/run/a/asm_packssdw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_packssdw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -17,26 +17,44 @@ haveSSE2!()(); haveMMX!()(); - int[] a = new int[4]; + int* a = (new int[4]).ptr; a[0] = 1; a[1] = -2; a[2] = 3; a[3] = -4; - int[] b = new int[4]; + int* b = (new int[4]).ptr; b[0] = 5; b[1] = -6; b[2] = 7; b[3] = -8; - short[] c = new short[8]; + short* c = (new short[8]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - packssdw XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + packssdw XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + packssdw XMM0, XMM1; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } + if(c[0] != 1){ assert(0); } diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_packsswb_01_A.d --- a/run/a/asm_packsswb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_packsswb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - short* a = [cast(short)1, -2, 3, -4, 5, -6, 7, -8]; - short* b = [cast(short)9, 8, -7, 6, -5, 4, -3, 2]; - byte* c = new byte[16]; + short[] A = [1, -2, 3, -4, 5, -6, 7, -8]; + short* a = A.ptr; + + short[] B = [9, 8, -7, 6, -5, 4, -3, 2]; + short* b = B.ptr; + + byte* c = (new byte[16]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_packuswb_01_A.d --- a/run/a/asm_packuswb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_packuswb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -15,10 +15,14 @@ int main(){ haveSSE2!()(); + + short[] A = [1, -2, 3, -4, 5, -6, 7, -8]; + short* a = A.ptr; - short* a = [cast(short)1, -2, 3, -4, 5, -6, 7, -8]; - short* b = [cast(short)9, 8, -7, 6, -5, 4, -3, 2]; - byte* c = new byte[16]; + short[] B = [9, 8, -7, 6, -5, 4, -3, 2]; + short* b = B.ptr; + + byte* c = (new byte[16]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddb_01_A.d --- a/run/a/asm_paddb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,7 +16,7 @@ int main(){ haveSSE2!()(); - byte[] a = new byte[16]; + byte* a = (new byte[16]).ptr; a[0] = 1; a[1] = 2; a[2] = 3; @@ -30,10 +30,11 @@ a[10] = 11; a[11] = 12; a[12] = 13; + a[13] = 14; a[14] = 15; a[15] = 16; - byte[] b = new byte[16]; + byte* b = (new byte[16]).ptr; b[0] = -8; b[1] = -7; b[2] = -6; @@ -51,13 +52,30 @@ b[14] = 6; b[15] = 7; - byte[] c = new byte[16]; + byte* c = (new byte[16]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - paddb XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + paddb XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + paddb XMM0, XMM1; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -7){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddd_01_A.d --- a/run/a/asm_paddd_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddd_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,25 +16,42 @@ int main(){ haveSSE2!()(); - int[] a = new int[4]; + int* a = (new int[4]).ptr; a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; - int[] b = new int[4]; + int* b = (new int[4]).ptr; b[0] = int.max-2; b[1] = int.min; b[2] = 0; b[3] = -6; - int[] c = new int[4]; + int* c = (new int[4]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - paddd XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + paddd XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + paddd XMM0, XMM1; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != int.max - 1){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddq_01_A.d --- a/run/a/asm_paddq_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddq_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,21 +16,38 @@ int main(){ haveSSE2!()(); - long[] a = new long[2]; + long* a = (new long[2]).ptr; a[0] = -1; a[1] = -2; - long[] b = new long[2]; + long* b = (new long[2]).ptr; b[0] = 2; b[1] = long.max; - long[] c = new long[2]; + long* c = (new long[2]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - paddq XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + paddq XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + paddq XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != 1){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddsb_01_A.d --- a/run/a/asm_paddsb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddsb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,7 +16,7 @@ int main(){ haveSSE2!()(); - byte[] a = new byte[16]; + byte* a = (new byte[16]).ptr; a[0] = 1; a[1] = byte.min; a[2] = 3; @@ -34,7 +34,7 @@ a[14] = 15; a[15] = 16; - byte[] b = new byte[16]; + byte* b = (new byte[16]).ptr; b[0] = byte.max; b[1] = -7; b[2] = -6; @@ -52,13 +52,30 @@ b[14] = 6; b[15] = 7; - byte[] c = new byte[16]; + byte* c = (new byte[16]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - paddsb XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + paddsb XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + paddsb XMM0, XMM1; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != byte.max){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddsw_01_A.d --- a/run/a/asm_paddsw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddsw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - short* a = [cast(short)1, short.min, 3, 4, 5, 6, 7, 8]; - short* b = [cast(short)short.max, -8, -7, -6, -5, -4, -3, -2]; - short* c = new short[8]; + short[] A = [1, short.min, 3, 4, 5, 6, 7, 8]; + short* a = A.ptr; + + short[] B = [short.max, -8, -7, -6, -5, -4, -3, -2]; + short* b = B.ptr; + + short* c = (new short[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddusb_01_A.d --- a/run/a/asm_paddusb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddusb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - ubyte* a = [cast(ubyte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; - ubyte* b = [cast(ubyte)ubyte.max, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7]; - ubyte* c = new ubyte[16]; + ubyte[] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + ubyte* a = A.ptr; + + ubyte[] B = [ubyte.max, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7]; + ubyte* b = B.ptr; + + ubyte* c = (new ubyte[16]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddusw_01_A.d --- a/run/a/asm_paddusw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddusw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - ushort* a = [cast(ushort)1, 0, 3, 4, 5, 6, 7, 8]; - ushort* b = [cast(ushort)ushort.max, 8, 7, 6, 5, 4, 3, 2]; - ushort* c = new ushort[8]; + ushort[] A = [1, 0, 3, 4, 5, 6, 7, 8]; + ushort* a = A.ptr; + + ushort[] B = [ushort.max, 8, 7, 6, 5, 4, 3, 2]; + ushort* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_paddw_01_A.d --- a/run/a/asm_paddw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_paddw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8]; - short* b = [cast(short)-9, -8, -7, -6, -5, -4, -3, -2]; - short* c = new short[8]; + short[] A = [1, 2, 3, 4, 5, 6, 7, 8]; + short* a = A.ptr; + + short[] B = [-9, -8, -7, -6, -5, -4, -3, -2]; + short* b = B.ptr; + + short* c = (new short[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pand_01_A.d --- a/run/a/asm_pand_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pand_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,15 +16,19 @@ int main(){ haveSSE2!()(); - ushort* a = [cast(ushort) + ushort[] A = [ 0b01101100_01101110, 0b01101001_01101101, 0b01100011_01101011, 0b11100111_01100111, 0b11000110_11100110, 0b10001101_10011011, 0b00011011_10011011, 0b01100110_00000000 ]; - ushort* b = [cast(ushort) + ushort* a = A.ptr; + + ushort[] B = [ 0b10000000_11000000, 0b01000000_01100000, 0b00100000_00110000, 0b00010000_00011000, 0b00001000_00001100, 0b00000100_00000110, 0b00000010_00000011, 0b11111111_10101010 ]; - ushort* c = new ushort[8]; + ushort* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pandn_01_A.d --- a/run/a/asm_pandn_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pandn_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,15 +16,19 @@ int main(){ haveSSE2!()(); - ushort* a = [cast(ushort) + ushort[] A = [ 0b01101100_01101110, 0b01101001_01101101, 0b01100011_01101011, 0b11100111_01100111, 0b11000110_11100110, 0b10001101_10011011, 0b00011011_10011011, 0b01100110_00000000 ]; - ushort* b = [cast(ushort) + ushort* a = A.ptr; + + ushort[] B = [ 0b10000000_11000000, 0b01000000_01100000, 0b00100000_00110000, 0b00010000_00011000, 0b00001000_00001100, 0b00000100_00000110, 0b00000010_00000011, 0b11111111_10101010 ]; - ushort* c = new ushort[8]; + ushort* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pavgb_01_A.d --- a/run/a/asm_pavgb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pavgb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,7 +16,7 @@ int main(){ haveSSE!()(); - byte[] a = new byte[8]; + byte* a = (new byte[8]).ptr; a[0] = 1; a[1] = 2; a[2] = 3; @@ -26,7 +26,7 @@ a[6] = 7; a[7] = 8; - byte[] b = new byte[8]; + byte* b = (new byte[8]).ptr; b[0] = 5; b[1] = 2; b[2] = 1; @@ -46,14 +46,32 @@ c[6] = 4; c[7] = 6; - byte[] d = new byte[8]; + byte* d = (new byte[8]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pavgb MM0, MM1; - movq d, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + movq MM1, [EAX]; + pavgb MM0, MM1; + mov EAX, d; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + movq MM1, [RAX]; + pavgb MM0, MM1; + mov RAX, d; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } for(size_t i = 0; i < c.length; i++){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pavgb_01_B.d --- a/run/a/asm_pavgb_01_B.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pavgb_01_B.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,46 +16,63 @@ int main(){ haveSSE!()(); - byte[] a = new byte[16]; + ubyte* a = (new ubyte[16]).ptr; a[0] = 1; - a[1] = -2; + a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5; a[5] = 6; a[6] = 7; a[7] = 8; - a[8] = -12; + a[8] = 12; - byte[] b = new byte[16]; + ubyte* b = (new ubyte[16]).ptr; b[0] = 5; b[1] = 2; - b[2] = -1; - b[3] = -8; + b[2] = 11; + b[3] = 8; b[4] = 15; b[5] = 4; b[6] = 1; b[7] = 4; - b[8] = -6; + b[8] = 6; - byte[] c = new byte[16]; + ubyte[] c = new ubyte[16]; c[0] = 3; - c[1] = 0; - c[2] = 1; - c[3] = -2; + c[1] = 2; + c[2] = 7; + c[3] = 6; c[4] = 10; c[5] = 5; c[6] = 4; c[7] = 6; - c[8] = -8; + c[8] = 9; - byte[] d = new byte[16]; + ubyte* d = (new ubyte[16]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - pavgb XMM0, XMM1; - movdqu d, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + pavgb XMM0, XMM1; + mov EAX, d; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + pavgb XMM0, XMM1; + mov RAX, d; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } for(size_t i = 0; i < c.length; i++){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pavgusb_01_A.d --- a/run/a/asm_pavgusb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -// $HeadURL$ -// $Date$ -// $Author$ - -module dstress.run.a.asm_pavgusb_01_A; - -version(D_InlineAsm_X86){ - version = runTest; -}else version(D_InlineAsm_X86_64){ - version = runTest; -} - -version(runTest){ - import addon.cpuinfo; - - int main(){ - haveSSE!()(); - - ubyte[] a = new ubyte[8]; - a[0] = 1; - a[1] = 2; - a[2] = 3; - a[3] = 4; - a[4] = 5; - a[5] = 6; - a[6] = 7; - a[7] = 8; - - ubyte[] b = new ubyte[8]; - b[0] = 5; - b[1] = 2; - b[2] = 1; - b[3] = 8; - b[4] = 15; - b[5] = 4; - b[6] = 1; - b[7] = 4; - - ubyte[] c = new ubyte[8]; - c[0] = 3; - c[1] = 2; - c[2] = 2; - c[3] = 6; - c[4] = 10; - c[5] = 5; - c[6] = 4; - c[7] = 6; - - ubyte[] d = new ubyte[8]; - - asm{ - movq MM0, a; - pavgusb MM0, b; - movq d, MM0; - emms; - } - - for(size_t i = 0; i < c.length; i++){ - if(d[i] != c[i]){ - assert(0); - } - } - - return 0; - } -}else{ - pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); - static assert(0); -} diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pavgusb_01_B.d --- a/run/a/asm_pavgusb_01_B.d Tue Dec 26 14:21:29 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -// $HeadURL$ -// $Date$ -// $Author$ - -module dstress.run.a.asm_pavgusb_01_B; - -version(D_InlineAsm_X86){ - version = runTest; -}else version(D_InlineAsm_X86_64){ - version = runTest; -} - -version(runTest){ - import addon.cpuinfo; - - int main(){ - have3DNow!()(); - - ubyte[] a = new ubyte[8]; - a[0] = 1; - a[1] = 2; - a[2] = 3; - a[3] = 4; - a[4] = 5; - a[5] = 6; - a[6] = 7; - a[7] = 8; - - ubyte[] b = new ubyte[8]; - b[0] = 5; - b[1] = 2; - b[2] = 1; - b[3] = 8; - b[4] = 15; - b[5] = 4; - b[6] = 1; - b[7] = 4; - - ubyte[] c = new ubyte[8]; - c[0] = 3; - c[1] = 2; - c[2] = 2; - c[3] = 6; - c[4] = 10; - c[5] = 5; - c[6] = 4; - c[7] = 6; - - ubyte[] d = new ubyte[8]; - - asm{ - emms; - movq MM0, a; - movq MM1, b; - pavgusb MM0, MM1; - movq d, MM0; - emms; - } - - for(size_t i = 0; i < c.length; i++){ - if(d[i] != c[i]){ - assert(0); - } - } - - return 0; - } -}else{ - pragma(msg, "DSTRESS{XPASS}: no inline ASM support"); - static assert(0); -} diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pavgw_01_A.d --- a/run/a/asm_pavgw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pavgw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,9 @@ int main(){ haveSSE!()(); - short[] a = new short[8]; + short* a = (new short[8]).ptr; a[0] = 1; - a[1] = -2; + a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5; @@ -26,33 +26,50 @@ a[6] = 7; a[7] = 8; - short[] b = new short[8]; + ushort* b = (new ushort[8]).ptr; b[0] = 5; b[1] = 2; - b[2] = -1; - b[3] = -8; + b[2] = 1; + b[3] = 8; b[4] = 15; b[5] = 4; b[6] = 1; b[7] = 4; - short[] c = new short[8]; + ushort[] c = new ushort[8]; c[0] = 3; - c[1] = 0; - c[2] = 1; - c[3] = -2; + c[1] = 2; + c[2] = 2; + c[3] = 6; c[4] = 10; c[5] = 5; c[6] = 4; c[7] = 6; - byte[] d = new byte[8]; + ushort* d = (new ushort[8]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - pavgw XMM0, XMM1; - movdqu d, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + pavgw XMM0, XMM1; + mov EAX, d; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + pavgw XMM0, XMM1; + mov RAX, d; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } for(size_t i = 0; i < c.length; i++){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpeqb_01_A.d --- a/run/a/asm_pcmpeqb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpeqb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - byte* a = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; - byte* b = [cast(byte)1, 0, byte.min, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 16]; - ubyte* c = new ubyte[16]; + byte[] A = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + byte* a = A.ptr; + + byte[] B = [cast(byte)1, 0, byte.min, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 16]; + byte* b = B.ptr; + + ubyte* c = (new ubyte[16]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpeqd_01_A.d --- a/run/a/asm_pcmpeqd_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpeqd_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - int* a = [cast(int)0, 1, 0, 4]; - int* b = [cast(int)0, 3, 1, 4]; - uint* c = new uint[4]; + int[] A = [cast(int)0, 1, 0, 4]; + int* a = A.ptr; + + int[] B = [cast(int)0, 3, 1, 4]; + int* b = B.ptr; + + uint* c = (new uint[4]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpeqw_01_A.d --- a/run/a/asm_pcmpeqw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpeqw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8]; - short* b = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8]; - ushort* c = new ushort[8]; + short[] A = [cast(short)1, 2, 3, 4, 5, 6, 7, 8]; + short* a = A.ptr; + + short[] B = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8]; + short* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpgtb_01_A.d --- a/run/a/asm_pcmpgtb_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpgtb_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - byte* a = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; - byte* b = [cast(byte)1, 3, 2, 4, 6, 5, 7, 9, 8, 10, 12, 11, 13, 16, 15, 14]; - ubyte* c = new ubyte[16]; + byte[] A = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + byte* a = A.ptr; + + byte[] B = [cast(byte)1, 3, 2, 4, 6, 5, 7, 9, 8, 10, 12, 11, 13, 16, 15, 14]; + byte* b = B.ptr; + + ubyte* c = (new ubyte[16]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpgtd_01_A.d --- a/run/a/asm_pcmpgtd_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpgtd_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - int* a = [cast(int)0, 3, 0, 4]; - int* b = [cast(int)0, 1, 1, 4]; - uint* c = new uint[4]; + int[] A = [cast(int)0, 3, 0, 4]; + int* a = A.ptr; + + int[] B = [cast(int)0, 1, 1, 4]; + int* b = B.ptr; + + uint* c = (new uint[4]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pcmpgtw_01_A.d --- a/run/a/asm_pcmpgtw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pcmpgtw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,13 @@ int main(){ haveSSE2!()(); - short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8]; - short* b = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8]; - ushort* c = new ushort[8]; + short[] A = [cast(short)1, 2, 3, 4, 5, 6, 7, 8]; + short* a = A.ptr; + + short[] B = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8]; + short* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pextrw_01_A.d --- a/run/a/asm_pextrw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pextrw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,7 +16,9 @@ int main(){ haveSSE!()(); - ushort* x = [cast(ushort)1, 2, 3, 4, 5, 0xFFFF, 7, 0]; + ushort[] X = [cast(ushort)1, 2, 3, 4, 5, 0xFFFF, 7, 0]; + ushort* x = X.ptr; + uint a; uint b; diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pf2id_01_A.d --- a/run/a/asm_pf2id_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pf2id_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,16 +16,30 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - int[] b = new int[2]; + int* b = (new int[2]).ptr; - asm{ - pf2id MM0, a; - movq b, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + pf2id MM0, [EAX]; + mov EAX, b; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + pf2id MM0, [RAX]; + mov RAX, b; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(b[0] != a[0]){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pf2id_01_B.d --- a/run/a/asm_pf2id_01_B.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pf2id_01_B.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,17 +16,32 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - int[] b = new int[2]; + int* b = (new int[2]).ptr; - asm{ - movq MM1, a; - pf2id MM0, MM1; - movq b, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM1, [EAX]; + pf2id MM0, MM1; + mov EAX, b; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM1, [RAX]; + pf2id MM0, MM1; + mov RAX, b; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(b[0] != a[0]){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pfacc_01_A.d --- a/run/a/asm_pfacc_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pfacc_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -4,23 +4,50 @@ module dstress.run.a.asm_pfacc_01_A; -int main(){ - version(D_InlineAsm_X86){ - float[] a = new float[2]; +version(D_InlineAsm_X86){ + version = runTest; +}else version(D_InlineAsm_X86_64){ + version = runTest; +} + +version(runTest){ + import addon.cpuinfo; + + int main(){ + have3DNow!()(); + + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 12.0f; b[1] = 17.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - pfacc MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfacc MM0, [EAX]; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + pfacc MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -333.0f){ @@ -31,8 +58,8 @@ } return 0; - }else{ - pragma(msg, "no Inline asm support"); - static assert(0); } +}else{ + pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); + static assert(0); } diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pfacc_01_B.d --- a/run/a/asm_pfacc_01_B.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pfacc_01_B.d Tue Dec 26 14:21:37 2006 +0000 @@ -4,24 +4,52 @@ module dstress.run.a.asm_pfacc_01_B; -int main(){ - version(D_InlineAsm_X86){ - float[] a = new float[2]; +version(D_InlineAsm_X86){ + version = runTest; +}else version(D_InlineAsm_X86_64){ + version = runTest; +} + +version(runTest){ + import addon.cpuinfo; + + int main(){ + have3DNow!()(); + + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 12.0f; b[1] = 17.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfacc MM0, MM1; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + movq MM1, [EAX]; + pfacc MM0, MM1; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + movq MM1, [RAX]; + pfacc MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -333.0f){ @@ -32,8 +60,8 @@ } return 0; - }else{ - pragma(msg, "no Inline asm support"); - static assert(0); } +}else{ + pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); + static assert(0); } diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pfadd_01_A.d --- a/run/a/asm_pfadd_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pfadd_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,21 +16,38 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 12.0f; b[1] = 17.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - pfadd MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfadd MM0, [EAX]; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + pfadd MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != 135.0f){ diff -r 96e7be832c35 -r 229e630d4b1a run/a/asm_pfadd_01_B.d --- a/run/a/asm_pfadd_01_B.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pfadd_01_B.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,22 +16,40 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 123.0f; a[1] = -456.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 12.0f; b[1] = 17.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfadd MM0, MM1; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + movq MM1, [EAX]; + pfadd MM0, MM1; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + movq MM1, [RAX]; + pfadd MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != 135.0f){