comparison run/a/asm_pfsubr_01_A.d @ 1288:61d7e32e70a8

partial inline asm review
author thomask
date Wed, 27 Dec 2006 11:59:19 +0000
parents 7360e428ad73
children 7a397590d6e0
comparison
equal deleted inserted replaced
1287:8cd17283ece1 1288:61d7e32e70a8
14 import addon.cpuinfo; 14 import addon.cpuinfo;
15 15
16 int main(){ 16 int main(){
17 have3DNow!()(); 17 have3DNow!()();
18 18
19 float[] a = new float[2]; 19 float* a = (new float[2]).ptr;
20 a[0] = 6.0f; 20 a[0] = 6.0f;
21 a[1] = 2.0f; 21 a[1] = 2.0f;
22 22
23 float[] b = new float[2]; 23 float* b = (new float[2]).ptr;
24 b[0] = 2.0f; 24 b[0] = 2.0f;
25 b[1] = 1.0f; 25 b[1] = 1.0f;
26 26
27 float[] c = new float[2]; 27 float* c = (new float[2]).ptr;
28 28
29 asm{ 29 static if(size_t.sizeof == 4){
30 movq MM0, a; 30 asm{
31 movq MM1, b; 31 mov EAX, a;
32 pfsubr MM0, MM1; 32 movq MM0, [EAX];
33 movq c, MM0; 33 mov EAX, b;
34 emms; 34 movq MM1, [EAX];
35 pfsubr 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 pfsubr MM0, MM1;
47 mov RAX, c;
48 movq [RAX], MM0;
49 emms;
50 }
51 }else{
52 static assert(0, "unhandled pointer size");
35 } 53 }
36 54
37 if(c[0] != -4.0f){ 55 if(c[0] != -4.0f){
38 assert(0); 56 assert(0);
39 } 57 }
40 58
41 if(c[1] != -3.0f){ 59 if(c[1] != -1.0f){
42 assert(0); 60 assert(0);
43 } 61 }
44 62
45 return 0; 63 return 0;
46 } 64 }