Mercurial > projects > dstress
diff run/a/asm_pfacc_01_A.d @ 1285:229e630d4b1a
partuial inline asm review
author | thomask |
---|---|
date | Tue, 26 Dec 2006 14:21:37 +0000 |
parents | 9dcac8d4e97f |
children |
line wrap: on
line diff
--- 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); }