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

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents a929acac9127
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 ushort[8] a = new ushort[8]; 19 ushort* a = (new ushort[8]).ptr;
20 a[0] = 0x1200; 20 a[0] = 0x1200;
21 a[1] = 0x0120; 21 a[1] = 0x0120;
22 a[2] = 0x0012; 22 a[2] = 0x0012;
23 a[3] = 0x2001; 23 a[3] = 0x2001;
24 a[4] = 0x0008; 24 a[4] = 0x0008;
25 a[5] = 0xFFFF; 25 a[5] = 0xFFFF;
26 a[6] = 0x0000; 26 a[6] = 0x0000;
27 a[7] = 0x1111; 27 a[7] = 0x1111;
28 28
29 ushort[] b = new ushort[8]; 29 ushort* b = (new ushort[8]).ptr;
30 b[0] = 0x2100; 30 b[0] = 0x2100;
31 b[1] = 0x2100; 31 b[1] = 0x2100;
32 b[2] = 0x2100; 32 b[2] = 0x2100;
33 b[3] = 0x2100; 33 b[3] = 0x2100;
34 b[4] = 0x2100; 34 b[4] = 0x2100;
35 b[5] = 0x0F00; 35 b[5] = 0x0F00;
36 b[6] = 0x0102; 36 b[6] = 0x0102;
37 b[7] = 0x2222; 37 b[7] = 0x2222;
38 38
39 ushort[] c = new ushort[8]; 39 ushort* c = (new ushort[8]).ptr;
40 c[0] = 0x3300; 40 c[0] = 0x3300;
41 c[1] = 0x2020; 41 c[1] = 0x2020;
42 c[2] = 0x2112; 42 c[2] = 0x2112;
43 c[3] = 0x0101; 43 c[3] = 0x0101;
44 c[4] = 0x2108; 44 c[4] = 0x2108;
45 c[5] = 0xF0FF; 45 c[5] = 0xF0FF;
46 c[6] = 0x0102; 46 c[6] = 0x0102;
47 c[7] = 0x3333; 47 c[7] = 0x3333;
48 48
49 ushort[] d = new ushort[8]; 49 ushort* d = (new ushort[8]).ptr;
50 ushort[] e = new ushort[8]; 50 ushort* e = (new ushort[8]).ptr;
51 51
52 asm{ 52 static if(size_t.sizeof == 4){
53 movdqu XMM0, a; 53 asm{
54 movdqu XMM1, b; 54 mov EAX, a;
55 pxor XMM1, XMM0; 55 movdqu XMM0, [EAX];
56 movdqu d, XMM0; 56 mov EAX, b;
57 movdqu e, XMM1; 57 movdqu XMM1, [EAX];
58 pxor XMM1, XMM0;
59 mov EAX, d;
60 movdqu [EAX], XMM0;
61 mov EAX, e;
62 movdqu [EAX], XMM1;
63 }
64 }else static if(size_t.sizeof == 8){
65 asm{
66 mov RAX, a;
67 movdqu XMM0, [RAX];
68 mov RAX, b;
69 movdqu XMM1, [RAX];
70 pxor XMM1, XMM0;
71 mov RAX, d;
72 movdqu [RAX], XMM0;
73 mov RAX, e;
74 movdqu [RAX], XMM1;
75 }
76 }else{
77 static assert(0, "unhandled pointer size");
58 } 78 }
59 79
60 80
61 foreach(size_t i, ushort s; a){ 81 foreach(size_t i, ushort s; a[0 .. 8]){
62 if(s != d[i]){ 82 if(s != d[i]){
63 assert(0); 83 assert(0);
64 } 84 }
65 } 85 }
66 foreach(size_t i, ushort s; c){ 86 foreach(size_t i, ushort s; c[0 .. 8]){
67 if(s != e[i]){ 87 if(s != e[i]){
68 assert(0); 88 assert(0);
69 } 89 }
70 } 90 }
71 91