comparison 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
comparison
equal deleted inserted replaced
1284:96e7be832c35 1285:229e630d4b1a
2 // $Date$ 2 // $Date$
3 // $Author$ 3 // $Author$
4 4
5 module dstress.run.a.asm_pfacc_01_A; 5 module dstress.run.a.asm_pfacc_01_A;
6 6
7 int main(){ 7 version(D_InlineAsm_X86){
8 version(D_InlineAsm_X86){ 8 version = runTest;
9 float[] a = new float[2]; 9 }else version(D_InlineAsm_X86_64){
10 version = runTest;
11 }
12
13 version(runTest){
14 import addon.cpuinfo;
15
16 int main(){
17 have3DNow!()();
18
19 float* a = (new float[2]).ptr;
10 a[0] = 123.0f; 20 a[0] = 123.0f;
11 a[1] = -456.0f; 21 a[1] = -456.0f;
12 22
13 float[] b = new float[2]; 23 float* b = (new float[2]).ptr;
14 b[0] = 12.0f; 24 b[0] = 12.0f;
15 b[1] = 17.0f; 25 b[1] = 17.0f;
16 26
17 float[] c = new float[2]; 27 float* c = (new float[2]).ptr;
18 28
19 asm{ 29 static if(size_t.sizeof == 4){
20 movq MM0, a; 30 asm{
21 pfacc MM0, b; 31 mov EAX, a;
22 movq c, MM0; 32 movq MM0, [EAX];
23 emms; 33 mov EAX, b;
34 pfacc MM0, [EAX];
35 mov EAX, c;
36 movq [EAX], MM0;
37 emms;
38 }
39 }else static if(size_t.sizeof == 8){
40 asm{
41 mov RAX, a;
42 movq MM0, [RAX];
43 mov RAX, b;
44 pfacc MM0, [RAX];
45 mov RAX, c;
46 movq [RAX], MM0;
47 emms;
48 }
49 }else{
50 static assert(0, "unhandled pointer size");
24 } 51 }
25 52
26 if(c[0] != -333.0f){ 53 if(c[0] != -333.0f){
27 assert(0); 54 assert(0);
28 } 55 }
29 if(c[1] != 29.0f){ 56 if(c[1] != 29.0f){
30 assert(0); 57 assert(0);
31 } 58 }
32 59
33 return 0; 60 return 0;
34 }else{
35 pragma(msg, "no Inline asm support");
36 static assert(0);
37 } 61 }
62 }else{
63 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
64 static assert(0);
38 } 65 }