comparison run/a/asm_pfacc_01_B.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_B; 5 module dstress.run.a.asm_pfacc_01_B;
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 movq MM1, b; 31 mov EAX, a;
22 pfacc MM0, MM1; 32 movq MM0, [EAX];
23 movq c, MM0; 33 mov EAX, b;
24 emms; 34 movq MM1, [EAX];
35 pfacc MM0, MM1;
36 mov EAX, c;
37 movq [EAX], MM0;
38 emms;
39 }
40 }else static if(size_t.sizeof == 8){
41 asm{
42 mov RAX, a;
43 movq MM0, [RAX];
44 mov RAX, b;
45 movq MM1, [RAX];
46 pfacc MM0, MM1;
47 mov RAX, c;
48 movq [RAX], MM0;
49 emms;
50 }
51 }else{
52 static assert(0, "unhandled pointer size");
25 } 53 }
26 54
27 if(c[0] != -333.0f){ 55 if(c[0] != -333.0f){
28 assert(0); 56 assert(0);
29 } 57 }
30 if(c[1] != 29.0f){ 58 if(c[1] != 29.0f){
31 assert(0); 59 assert(0);
32 } 60 }
33 61
34 return 0; 62 return 0;
35 }else{
36 pragma(msg, "no Inline asm support");
37 static assert(0);
38 } 63 }
64 }else{
65 pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
66 static assert(0);
39 } 67 }