comparison run/a/asm_paddb_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
14 import addon.cpuinfo; 14 import addon.cpuinfo;
15 15
16 int main(){ 16 int main(){
17 haveSSE2!()(); 17 haveSSE2!()();
18 18
19 byte[] a = new byte[16]; 19 byte* a = (new byte[16]).ptr;
20 a[0] = 1; 20 a[0] = 1;
21 a[1] = 2; 21 a[1] = 2;
22 a[2] = 3; 22 a[2] = 3;
23 a[3] = 4; 23 a[3] = 4;
24 a[4] = 5; 24 a[4] = 5;
28 a[8] = 9; 28 a[8] = 9;
29 a[9] = 10; 29 a[9] = 10;
30 a[10] = 11; 30 a[10] = 11;
31 a[11] = 12; 31 a[11] = 12;
32 a[12] = 13; 32 a[12] = 13;
33 a[13] = 14;
33 a[14] = 15; 34 a[14] = 15;
34 a[15] = 16; 35 a[15] = 16;
35 36
36 byte[] b = new byte[16]; 37 byte* b = (new byte[16]).ptr;
37 b[0] = -8; 38 b[0] = -8;
38 b[1] = -7; 39 b[1] = -7;
39 b[2] = -6; 40 b[2] = -6;
40 b[3] = -5; 41 b[3] = -5;
41 b[4] = -4; 42 b[4] = -4;
49 b[12] = 4; 50 b[12] = 4;
50 b[13] = 5; 51 b[13] = 5;
51 b[14] = 6; 52 b[14] = 6;
52 b[15] = 7; 53 b[15] = 7;
53 54
54 byte[] c = new byte[16]; 55 byte* c = (new byte[16]).ptr;
55 56
56 asm{ 57 static if(size_t.sizeof == 4){
57 movdqu XMM0, a; 58 asm{
58 movdqu XMM1, b; 59 mov EAX, a;
59 paddb XMM0, XMM1; 60 movdqu XMM0, [EAX];
60 movdqu c, XMM0; 61 mov EAX, b;
62 movdqu XMM1, [EAX];
63 paddb XMM0, XMM1;
64 mov EAX, c;
65 movdqu [EAX], XMM0;
66 }
67 }else static if(size_t.sizeof == 8){
68 asm{
69 mov RAX, a;
70 movdqu XMM0, [RAX];
71 mov RAX, b;
72 movdqu XMM1, [RAX];
73 paddb XMM0, XMM1;
74 mov RAX, c;
75 movdqu [RAX], XMM0;
76 }
77 }else{
78 static assert(0, "unhandled pointer size");
61 } 79 }
62 80
63 if(c[0] != -7){ 81 if(c[0] != -7){
64 assert(0); 82 assert(0);
65 } 83 }