comparison run/a/asm_pshufd_01_A.d @ 1329:1c8652b3795a

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents 6e5d377573e1
children
comparison
equal deleted inserted replaced
1328:288d15cd3b95 1329:1c8652b3795a
14 import addon.cpuinfo; 14 import addon.cpuinfo;
15 15
16 int main(){ 16 int main(){
17 haveSSE2!()(); 17 haveSSE2!()();
18 18
19 float* a = [1.0f, 2.0f, 3.0f, 4.0f]; 19 float[] A = [1.0f, 2.0f, 3.0f, 4.0f];
20 float* b = [5.0f, 6.0f, 7.0f, 8.0f]; 20 float* a = A.ptr;
21 21
22 float* c = new float[4]; 22 float[] B = [5.0f, 6.0f, 7.0f, 8.0f];
23 float* b = B.ptr;
23 24
24 asm{ 25 float* c = (new float[4]).ptr;
25 mov EAX, a; 26
26 movups XMM0, [EAX]; 27 static if(size_t.sizeof == 4){
27 mov EAX, b; 28 asm{
28 movups XMM1, [EAX]; 29 mov EAX, a;
29 pshufd XMM0, XMM1, 0b01_01_00_10; 30 movups XMM0, [EAX];
30 mov EAX, c; 31 mov EAX, b;
31 movups [EAX], XMM0; 32 movups XMM1, [EAX];
33 pshufd XMM0, XMM1, 0b01_01_00_10;
34 mov EAX, c;
35 movups [EAX], XMM0;
36 }
37 }else static if(size_t.sizeof == 8){
38 asm{
39 mov RAX, a;
40 movups XMM0, [RAX];
41 mov RAX, b;
42 movups XMM1, [RAX];
43 pshufd XMM0, XMM1, 0b01_01_00_10;
44 mov RAX, c;
45 movups [RAX], XMM0;
46 }
47 }else{
48 static assert(0, "unhandled pointer size");
32 } 49 }
33 50
34 if(c[0] != 7.0f){ 51 if(c[0] != 7.0f){
35 assert(0); 52 assert(0);
36 } 53 }