# HG changeset patch # User thomask # Date 1167220759 0 # Node ID 61d7e32e70a8b6f60ff32aee96d7eedcfae8fb72 # Parent 8cd17283ece1f511b4ea8fd9ce9075ff055c6aab partial inline asm review diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpeq_01_A.d --- a/run/a/asm_pfcmpeq_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpeq_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,21 +16,38 @@ int main(){ haveMMX!()(); - 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] = 123.0f; b[1] = 456.0f; - uint[] c = new uint[2]; + uint* c = (new uint[2]).ptr; - asm{ - movq MM0, a; - pfcmpeq MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfcmpeq 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; + pfcmpeq MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != uint.max){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpeq_01_B.d --- a/run/a/asm_pfcmpeq_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpeq_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -14,11 +14,17 @@ import addon.cpuinfo; int main(){ - have3DNow!()(); + haveMMX!()(); + + float* a = (new float[2]).ptr; + a[0] = 123.0f; + a[1] = -456.0f; - float* a = [123.0f, -456.0f]; - float* b = [123.0f, 456.0f]; - uint* c = new uint[2]; + float* b = (new float[2]).ptr; + b[0] = 123.0f; + b[1] = 456.0f; + + uint* c = (new uint[2]).ptr; static if(size_t.sizeof == 4){ asm{ @@ -56,6 +62,6 @@ return 0; } }else{ - pragma(msg, "DSTRESS{XPASS}: no inline ASM support"); + pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); static assert(0); } diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpge_01_A.d --- a/run/a/asm_pfcmpge_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpge_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,9 +16,13 @@ int main(){ have3DNow!()(); - float* a = [123.0f, 457.0f]; - float* b = [124.0f, 456.0f]; - uint* c = new uint[2]; + float[] A = [123.0f, 457.0f]; + float* a = A.ptr; + + float[] B = [124.0f, 456.0f]; + float* b = B.ptr; + + uint* c = (new uint[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpge_01_B.d --- a/run/a/asm_pfcmpge_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpge_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,9 +16,13 @@ int main(){ have3DNow!()(); - float* a = [123.0f, 458.0f]; - float* b = [124.0f, 456.0f]; - uint* c = new uint[2]; + float[] A = [123.0f, 458.0f]; + float* a = A.ptr; + + float[] B = [124.0f, 456.0f]; + float* b = B.ptr; + + uint* c = (new uint[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpgt_01_A.d --- a/run/a/asm_pfcmpgt_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpgt_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -17,9 +17,13 @@ haveMMX!()(); have3DNow!()(); - float* a = [123.0f, 457.0f]; - float* b = [124.0f, 456.0f]; - uint* c = new uint[2]; + float[] A = [123.0f, 457.0f]; + float* a = A.ptr; + + float[] B = [124.0f, 456.0f]; + float* b = B.ptr; + + uint* c = (new uint[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfcmpgt_01_B.d --- a/run/a/asm_pfcmpgt_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfcmpgt_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -17,9 +17,13 @@ haveMMX!()(); have3DNow!()(); - float* a = [123.0f, 457.0f]; - float* b = [124.0f, 456.0f]; - uint* c = new uint[2]; + float[] A = [123.0f, 457.0f]; + float* a = A.ptr; + + float[] B = [124.0f, 456.0f]; + float* b = B.ptr; + + uint* c = (new uint[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmax_01_A.d --- a/run/a/asm_pfmax_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmax_01_A.d Wed Dec 27 11:59:19 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] = 457.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 123.0f; b[1] = 456.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - pfmax MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfmax 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; + pfmax MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != b[0]){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmax_01_B.d --- a/run/a/asm_pfmax_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmax_01_B.d Wed Dec 27 11:59:19 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] = 457.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 123.0f; b[1] = 456.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfmax 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]; + pfmax 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]; + pfmax MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != b[0]){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmin_01_A.d --- a/run/a/asm_pfmin_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmin_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,22 +16,38 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = -123.0f; a[1] = 789.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 123.0f; b[1] = 456.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - emms; - movq MM0, a; - pfmin MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfmin 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; + pfmin MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != a[0]){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmin_01_B.d --- a/run/a/asm_pfmin_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmin_01_B.d Wed Dec 27 11:59:19 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] = 789.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 123.0f; b[1] = 456.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfmin 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]; + pfmin 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]; + pfmin MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != a[0]){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmul_01_A.d --- a/run/a/asm_pfmul_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmul_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,21 +16,38 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = -3.0f; a[1] = 7.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = 8.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - pfmul MM0, b; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + pfmul 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; + pfmul MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -6.0f){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfmul_01_B.d --- a/run/a/asm_pfmul_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfmul_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,22 +16,40 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = -3.0f; a[1] = 7.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = 8.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfmul 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]; + pfmul 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]; + pfmul MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -6.0f){ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcp_01_A.d --- a/run/a/asm_pfrcp_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcp_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -4,16 +4,43 @@ module dstress.run.a.asm_pfrcp_01_A; -int main(){ - version(D_InlineAsm_X86){ - const float[2] A = [2.0f, 3.3f]; - float[2] c; +version(D_InlineAsm_X86){ + version = runTest; +}else version(D_InlineAsm_X86_64){ + version = runTest; +} + +version(runTest){ + import addon.cpuinfo; + + int main(){ + haveMMX!()(); + + float[] A = [2.0f, 3.3f]; + float* a = A.ptr; + + float* c = (new float[2]).ptr; - asm{ - pfrcp MM0, A; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + pfrcp MM0, [EAX]; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + pfrcp MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } + c[0] -= 0.5f; if(c[0] < 0.0f){ c[0] = -c[0]; @@ -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 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcp_01_B.d --- a/run/a/asm_pfrcp_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcp_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -4,16 +4,43 @@ module dstress.run.a.asm_pfrcp_01_B; -int main(){ - version(D_InlineAsm_X86){ - const float[2] A = [2.0f, 3.3f]; - float[2] c; +version(D_InlineAsm_X86){ + version = runTest; +}else version(D_InlineAsm_X86_64){ + version = runTest; +} + +version(runTest){ + import addon.cpuinfo; + + int main(){ + haveMMX!()(); + + float[] A = [2.0f, 3.3f]; + float* a = A.ptr; + + float* c = (new float[2]).ptr; - asm{ - movq MM1, A; - pfrcp MM0, MM1; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM1, [EAX]; + pfrcp MM0, MM1; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM1, [RAX]; + pfrcp MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } c[0] -= 0.5f; @@ -33,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 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcpit1_01_A.d --- a/run/a/asm_pfrcpit1_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcpit1_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -17,14 +17,32 @@ haveMMX!()(); have3DNow!()(); - const float[2] A = [2.0f, -0.5f]; - float[2] c; + float* a = (new float[2]).ptr; + a[0] = 2.0f; + a[1] = -0.5f; + + float* c = (new float[2]).ptr; - asm{ - pfrcp MM0, A; - pfrcpit1 MM0, A; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + pfrcp MM0, [EAX]; + pfrcpit1 MM0, [EAX]; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + pfrcp MM0, [RAX]; + pfrcpit1 MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } c[0] -= 1.007812f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcpit1_01_B.d --- a/run/a/asm_pfrcpit1_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcpit1_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -17,30 +17,49 @@ haveMMX!()(); have3DNow!()(); - const float[2] A = [2.0f, -0.5f]; - float[2] c; + float* a = (new float[2]).ptr; + a[0] = 2.0f; + a[1] = -0.5f; + + float* c = (new float[2]).ptr; - asm{ - movq MM1, A; - pfrcp MM0, MM1; - pfrcpit1 MM0, MM1; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM1, [EAX]; + pfrcp MM0, MM1; + pfrcpit1 MM0, MM1; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM1, [RAX]; + pfrcp MM0, MM1; + pfrcpit1 MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } c[0] -= 1.007812f; if(c[0] < 0.0f){ c[0] = -c[0]; } - if(c[0] > float.epsilon * (1 << 11)){ + if(c[0] > float.epsilon * (1 << 8)){ assert(0); } - c[1] += 1.007812f; - if(c[0] < 0.0f){ - c[0] = -c[0]; + c[1] -= 1.007812; + if(c[1] < 0.0f){ + c[1] = -c[1]; } - if(c[0] > float.epsilon * (1 << 11)){ + if(c[1] > float.epsilon * (1 << 8)){ assert(0); } diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcpit2_01_A.d --- a/run/a/asm_pfrcpit2_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcpit2_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,15 +16,34 @@ int main(){ have3DNow!()(); - const float[2] A = [2.0f, -0.5f]; - float[2] c; + float* a = (new float[2]).ptr; + a[0] = 2.0f; + a[1] = -0.5f; + + float* c = (new float[2]).ptr; - asm{ - pfrcp MM0, A; - pfrcpit1 MM0, A; - pfrcpit2 MM0, A; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + pfrcp MM0, [EAX]; + pfrcpit1 MM0, [EAX]; + pfrcpit2 MM0, [EAX]; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + pfrcp MM0, [RAX]; + pfrcpit1 MM0, [RAX]; + pfrcpit2 MM0, [RAX]; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } c[0] -= 2.000061f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrcpit2_01_B.d --- a/run/a/asm_pfrcpit2_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrcpit2_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,23 +16,43 @@ int main(){ have3DNow!()(); - const float[2] A = [2.0f, -0.5f]; - float[2] c; + float* a = (new float[2]).ptr; + a[0] = 2.0f; + a[1] = -0.5f; + + float* c = (new float[2]).ptr; - asm{ - movq MM1, A; - pfrcp MM0, MM1; - pfrcpit1 MM0, MM1; - pfrcpit2 MM0, MM1; - movq c, MM0; - emms; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM1, [EAX]; + pfrcp MM0, MM1; + pfrcpit1 MM0, MM1; + pfrcpit2 MM0, MM1; + mov EAX, c; + movq [EAX], MM0; + emms; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM1, [RAX]; + pfrcp MM0, MM1; + pfrcpit1 MM0, MM1; + pfrcpit2 MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } c[0] -= 2.000061f; if(c[0] < 0.0f){ c[0] = -c[0]; } - if(c[0] > float.epsilon * (1 << 8)){ + if(c[0] > float.epsilon * (1 << 3)){ assert(0); } @@ -40,7 +60,7 @@ if(c[1] < 0.0f){ c[1] = -c[1]; } - if(c[1] > float.epsilon * (1 << 8)){ + if(c[1] > float.epsilon * (1 << 3)){ assert(0); } diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrsqrt_01_A.d --- a/run/a/asm_pfrsqrt_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrsqrt_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,7 +16,7 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 4.0f; a[1] = 3.3f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrsqrt_01_B.d --- a/run/a/asm_pfrsqrt_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrsqrt_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,7 +16,7 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 4.0f; a[1] = 0.5f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrsqrtit1_01_A.d --- a/run/a/asm_pfrsqrtit1_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrsqrtit1_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,7 +16,7 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 4.0f; a[1] = 0.5f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfrsqrtit1_01_B.d --- a/run/a/asm_pfrsqrtit1_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfrsqrtit1_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,7 +16,7 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 4.0f; a[1] = 0.5f; diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfsub_01_A.d --- a/run/a/asm_pfsub_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfsub_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,15 +16,15 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 6.0f; a[1] = 2.0f; - float* b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = -1.0f; - float* c = new float[2]; + float* c = (new float[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfsub_01_B.d --- a/run/a/asm_pfsub_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfsub_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,15 +16,15 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 6.0f; a[1] = 2.0f; - float* b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = -1.0f; - float* c = new float[2]; + float* c = (new float[2]).ptr; static if(size_t.sizeof == 4){ asm{ diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfsubr_01_A.d --- a/run/a/asm_pfsubr_01_A.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfsubr_01_A.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,29 +16,47 @@ int main(){ have3DNow!()(); - float[] a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 6.0f; a[1] = 2.0f; - float[] b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = 1.0f; - float[] c = new float[2]; + float* c = (new float[2]).ptr; - asm{ - movq MM0, a; - movq MM1, b; - pfsubr 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]; + pfsubr 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]; + pfsubr MM0, MM1; + mov RAX, c; + movq [RAX], MM0; + emms; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != -4.0f){ assert(0); } - if(c[1] != -3.0f){ + if(c[1] != -1.0f){ assert(0); } diff -r 8cd17283ece1 -r 61d7e32e70a8 run/a/asm_pfsubr_01_B.d --- a/run/a/asm_pfsubr_01_B.d Wed Dec 27 11:59:05 2006 +0000 +++ b/run/a/asm_pfsubr_01_B.d Wed Dec 27 11:59:19 2006 +0000 @@ -16,15 +16,15 @@ int main(){ have3DNow!()(); - float* a = new float[2]; + float* a = (new float[2]).ptr; a[0] = 6.0f; a[1] = 2.0f; - float* b = new float[2]; + float* b = (new float[2]).ptr; b[0] = 2.0f; b[1] = -1.0f; - float* c = new float[2]; + float* c = (new float[2]).ptr; static if(size_t.sizeof == 4){ asm{