Mercurial > projects > dstress
diff run/a/asm_pavgw_01_A.d @ 1285:229e630d4b1a
partuial inline asm review
author | thomask |
---|---|
date | Tue, 26 Dec 2006 14:21:37 +0000 |
parents | f9084d3862e8 |
children |
line wrap: on
line diff
--- a/run/a/asm_pavgw_01_A.d Tue Dec 26 14:21:29 2006 +0000 +++ b/run/a/asm_pavgw_01_A.d Tue Dec 26 14:21:37 2006 +0000 @@ -16,9 +16,9 @@ int main(){ haveSSE!()(); - short[] a = new short[8]; + short* a = (new short[8]).ptr; a[0] = 1; - a[1] = -2; + a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5; @@ -26,33 +26,50 @@ a[6] = 7; a[7] = 8; - short[] b = new short[8]; + ushort* b = (new ushort[8]).ptr; b[0] = 5; b[1] = 2; - b[2] = -1; - b[3] = -8; + b[2] = 1; + b[3] = 8; b[4] = 15; b[5] = 4; b[6] = 1; b[7] = 4; - short[] c = new short[8]; + ushort[] c = new ushort[8]; c[0] = 3; - c[1] = 0; - c[2] = 1; - c[3] = -2; + c[1] = 2; + c[2] = 2; + c[3] = 6; c[4] = 10; c[5] = 5; c[6] = 4; c[7] = 6; - byte[] d = new byte[8]; + ushort* d = (new ushort[8]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - pavgw XMM0, XMM1; - movdqu d, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + pavgw XMM0, XMM1; + mov EAX, d; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + pavgw XMM0, XMM1; + mov RAX, d; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } for(size_t i = 0; i < c.length; i++){