# HG changeset patch # User thomask # Date 1168643237 0 # Node ID 1c8652b3795ab44c1053aaeba2b944db2ecb6603 # Parent 288d15cd3b95ad0ab28d7a1753b5b955dfc48467 inline asm review diff -r 288d15cd3b95 -r 1c8652b3795a compile/a/asm_invlpg_01_B.d --- a/compile/a/asm_invlpg_01_B.d Fri Jan 12 23:06:49 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// $HeadURL$ -// $Date$ -// $Author$ - -// @author@ Frits van Bommel -// @date@ 2006-05-31 -// @uri@ http://d.puremagic.com/issues/show_bug.cgi?id=171 -// @desc@ [Issue 171] 'wrong number of operands' for invlpg inline asm instruction - -module dstress.compile.a.asm_invlpg_01_B; - -version(D_InlineAsm_X86){ - version = runTest; -}else version(D_InlineAsm_X86_64){ - version = runTest; -} - -version(runTest){ - int main(char[][] arg){ - void* p = arg.ptr; - - asm{ - mov EAX, [p]; - invlpg EAX; - } - - return 0; - } -}else{ - pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); - static assert(0); -} - diff -r 288d15cd3b95 -r 1c8652b3795a compile/a/asm_invlpg_01_C.d --- a/compile/a/asm_invlpg_01_C.d Fri Jan 12 23:06:49 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// $HeadURL$ -// $Date$ -// $Author$ - -// @author@ Frits van Bommel -// @date@ 2006-05-31 -// @uri@ http://d.puremagic.com/issues/show_bug.cgi?id=171 -// @desc@ [Issue 171] 'wrong number of operands' for invlpg inline asm instruction - -module dstress.compile.a.asm_invlpg_01_C; - -version(D_InlineAsm_X86){ - version = runTest; -}else version(D_InlineAsm_X86_64){ - version = runTest; -} - -version(runTest){ - int main(char[][] arg){ - void* p = arg.ptr; - - asm{ - mov EAX, p; - invlpg EAX; - } - - return 0; - } -}else{ - pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); - static assert(0); -} - diff -r 288d15cd3b95 -r 1c8652b3795a nocompile/a/asm_fst_02_F.d --- a/nocompile/a/asm_fst_02_F.d Fri Jan 12 23:06:49 2007 +0000 +++ b/nocompile/a/asm_fst_02_F.d Fri Jan 12 23:07:17 2007 +0000 @@ -6,12 +6,15 @@ module dstress.nocompile.a.asm_fst_02_F; -void main(){ - version(D_InlineAsm){ +version(D_InlineAsm){ + void main(){ real x; asm{ fst x; } } -} \ No newline at end of file +}else{ + pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); + static assert(0); +} diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_cmpiss_01_A.d --- a/run/a/asm_cmpiss_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -// $HeadURL$ -// $Date$ -// $Author$ - -module dstress.run.a.asm_cmpiss_01_A; - -version(D_InlineAsm_X86){ - version = runTest; -}else version(D_InlineAsm_X86_64){ - version = runTest; -} - -version(runTest){ - int main(){ - float* a = (new float[4]).ptr; - a[0] = 1.0f; - a[1] = 2.0f; - a[2] = 3.0f; - a[3] = -8.0f; - - float* b = (new float[4]).ptr; - b[0] = 0.0f; - b[1] = 4.0f; - b[2] = 3.0f; - b[3] = -4.0f; - - uint i; - - asm{ - mov EAX, a; - movdqu XMM0, [EAX]; - mov EAX, b; - movdqu XMM1, [EAX]; - comiss XMM0, XMM1; - mov EAX, 0; - jnc done_1; - jz done_1; - jp done_1; - inc EAX; - done_1: - mov i, EAX; - } - - if(i != 1){ - assert(0); - } - - asm{ - mov EAX, b; - movdqu XMM0, [EAX]; - mov EAX, a; - movdqu XMM1, [EAX]; - comiss XMM0, XMM1; - mov EAX, 0; - jnc done_2; - jz done_2; - jp done_2; - inc EAX; - done_2: - mov i, EAX; - } - - if(i != 1){ - assert(0); - } - return 0; - } -}else{ - pragma(msg, "DSTRESS{XFAIL}: no inline ASM support"); - static assert(0); -} diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_comisd_01_A.d --- a/run/a/asm_comisd_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_comisd_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -17,12 +17,13 @@ haveSSE2!()(); double* a = (new double[2]).ptr; - a[0] = 1.0; - a[1] = 3.0; + a[0] = 3.0; + a[1] = 4.0; + double* b = (new double[2]).ptr; - b[0] = 4.0; - b[1] = 3.0; + b[0] = 3.0; + b[1] = 5.0; static if(size_t.sizeof == 4){ asm{ @@ -31,7 +32,7 @@ mov EAX, b; movupd XMM1, [EAX]; comisd XMM0, XMM1; - jz error; + jnz error; jp error; jc error; } @@ -42,7 +43,7 @@ mov RAX, b; movupd XMM1, [RAX]; comisd XMM0, XMM1; - jz error; + jnz error; jp error; jc error; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovb_01_A.d --- a/run/a/asm_fcmovb_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovb_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmovb ST(1); + fcmovb ST,ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmovb ST(1); + fcmovb ST,ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovbe_01_A.d --- a/run/a/asm_fcmovbe_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovbe_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmovbe ST(1); + fcmovbe ST, ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmovbe ST(1); + fcmovbe ST, ST(1); fst f; } @@ -55,7 +55,7 @@ cmp AL, BL; fld1; fldz; - fcmovbe ST(1); + fcmovbe ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmove_01_A.d --- a/run/a/asm_fcmove_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmove_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmove ST(1); + fcmove ST, ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmove ST(1); + fcmove ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovnb_01_A.d --- a/run/a/asm_fcmovnb_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovnb_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmovnb ST(1); + fcmovnb ST, ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmovnb ST(1); + fcmovnb ST, ST(1); fst f; } @@ -55,7 +55,7 @@ cmp AL, BL; fld1; fldz; - fcmovnb ST(1); + fcmovnb ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovnbe_01_A.d --- a/run/a/asm_fcmovnbe_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovnbe_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmovnbe ST(1); + fcmovnbe ST, ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmovnbe ST(1); + fcmovnbe ST, ST(1); fst f; } @@ -55,7 +55,7 @@ cmp AL, BL; fld1; fldz; - fcmovnbe ST(1); + fcmovnbe ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovne_01_A.d --- a/run/a/asm_fcmovne_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovne_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ cmp AL, BL; fld1; fldz; - fcmovne ST(1); + fcmovne ST, ST(1); fst f; } @@ -41,7 +41,7 @@ cmp AL, BL; fld1; fldz; - fcmovne ST(1); + fcmovne ST, ST(1); fst f; } @@ -55,7 +55,7 @@ cmp AL, BL; fld1; fldz; - fcmovne ST(1); + fcmovne ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovnu_01_A.d --- a/run/a/asm_fcmovnu_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovnu_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -24,7 +24,7 @@ fld f; fucomip; fldz; - fcmovnu ST(1); + fcmovnu ST, ST(1); fst f; } @@ -37,7 +37,7 @@ fld1; fucomip; fldz; - fcmovnu ST(1); + fcmovnu ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcmovu_01_A.d --- a/run/a/asm_fcmovu_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcmovu_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -24,7 +24,7 @@ fld f; fucomip; fldz; - fcmovu ST(1); + fcmovu ST, ST(1); fst f; } @@ -37,7 +37,7 @@ fld1; fucomip; fldz; - fcmovu ST(1); + fcmovu ST, ST(1); fst f; } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcomi_01_A.d --- a/run/a/asm_fcomi_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcomi_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ fldz; fld1; fldz; - fcomi; + fcomi ST, ST(1); fstp f1; fstp f2; setc CF; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fcomip_01_A.d --- a/run/a/asm_fcomip_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fcomip_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -27,7 +27,7 @@ fldz; fld1; fldz; - fcomip; + fcomip ST, ST(1); fstp f1; fstp f2; setc CF; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdiv_01_D.d --- a/run/a/asm_fdiv_01_D.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdiv_01_D.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; float c; asm{ diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdivp_01_A.d --- a/run/a/asm_fdivp_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdivp_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; asm{ fld a; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdivp_01_B.d --- a/run/a/asm_fdivp_01_B.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdivp_01_B.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; asm{ fldz; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdivr_01_D.d --- a/run/a/asm_fdivr_01_D.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdivr_01_D.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; float c = 9.9f; asm{ @@ -30,7 +30,7 @@ fstp c; } - if(a != 12.0f){ + if(a != -3.0f){ assert(0); } if(b != 0.0f){ diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdivrp_01_A.d --- a/run/a/asm_fdivrp_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdivrp_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; asm{ fld b; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fdivrp_01_B.d --- a/run/a/asm_fdivrp_01_B.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fdivrp_01_B.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,8 +16,8 @@ int main(){ haveFPU!()(); - float a = 12.0f; - float b = -3.0f; + float a = -3.0f; + float b = 12.0f; asm{ fldz; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fsubp_01_A.d --- a/run/a/asm_fsubp_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fsubp_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -14,8 +14,10 @@ import addon.cpuinfo; int main(){ - double a = 2.4; - double b = -1.2; + haveFPU!()(); + + double a = -1.2; + double b = 2.4; asm{ fld1; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fsubp_01_B.d --- a/run/a/asm_fsubp_01_B.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fsubp_01_B.d Fri Jan 12 23:07:17 2007 +0000 @@ -14,8 +14,10 @@ import addon.cpuinfo; int main(){ - double a = 2.4; - double b = -1.2; + haveFPU!()(); + + double a = -1.2; + double b = 2.4; asm{ fld1; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fsubrp_01_A.d --- a/run/a/asm_fsubrp_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fsubrp_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -14,8 +14,10 @@ import addon.cpuinfo; int main(){ - double a = 2.4; - double b = -1.2; + haveFPU!()(); + + double a = -1.2; + double b = 2.4; asm{ fld1; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fsubrp_01_B.d --- a/run/a/asm_fsubrp_01_B.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fsubrp_01_B.d Fri Jan 12 23:07:17 2007 +0000 @@ -14,8 +14,10 @@ import addon.cpuinfo; int main(){ - double a = 2.4; - double b = -1.2; + haveFPU!()(); + + double a = -1.2; + double b = 2.4; asm{ fld1; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fucomi_01_A.d --- a/run/a/asm_fucomi_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fucomi_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -28,7 +28,7 @@ fldz; fld1; fld f1; - fucomi; + fucomi ST,ST(1); fstp f1; fstp f1; fstp f2; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fucomip_01_A.d --- a/run/a/asm_fucomip_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fucomip_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -28,7 +28,7 @@ fldz; fld1; fld f1; - fucomip; + fucomip ST, ST(1); fstp f1; fstp f1; fstp f2; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_fyl2xp1_01.d --- a/run/a/asm_fyl2xp1_01.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_fyl2xp1_01.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,17 +16,16 @@ int main(){ haveFPU!()(); - float a = -0.0f; + float a = 7.0f; asm{ fld a; fld a; fyl2xp1; fstp a; - fstp a; } - if(a != 0.0L){ + if(a != 21.0){ assert(0); } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_movhlps_01_A.d --- a/run/a/asm_movhlps_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_movhlps_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -20,25 +20,42 @@ int main(){ haveSSE!()(); - float[] a = new float[4]; + float* a = (new float[4]).ptr; a[0] = 3.0f; a[1] = 4.0f; a[2] = 5.0f; a[3] = 6.0f; - float[] b = new float[4]; - a[0] = 10.0f; - a[1] = 20.0f; - a[2] = 30.0f; - a[3] = 40.0f; + float* b = (new float[4]).ptr; + b[0] = 10.0f; + b[1] = 20.0f; + b[2] = 30.0f; + b[3] = 40.0f; + + float* c = (new float[4]).ptr; - float[] c = new float[4]; - - asm{ - movups XMM0, a; - movups XMM1, b; - movlhps XMM0, XMM1; - movups c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movups XMM0, [EAX]; + mov EAX, b; + movups XMM1, [EAX]; + movlhps XMM0, XMM1; + mov EAX, c; + movups [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movups XMM0, [RAX]; + mov RAX, b; + movups XMM1, [RAX]; + movlhps XMM0, XMM1; + mov RAX, c; + movups [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != a[0]){ diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_psadbw_01_A.d --- a/run/a/asm_psadbw_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_psadbw_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,19 +16,39 @@ int main(){ haveSSE!()(); - const ubyte[16] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; - const ubyte[16] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10]; + ubyte[] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + ubyte* a = A.ptr; - ushort[8] c; + ubyte[] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10]; + ubyte* b = B.ptr; + + ushort* c = (new ushort[8]).ptr; - asm{ - movdqu XMM0, A; - movdqu XMM1, B; - psadbw XMM0, XMM1; - movdqu c, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + psadbw XMM0, XMM1; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + psadbw XMM0, XMM1; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } - if(c[0] != 0){ + if(c[0] != 22){ assert(0); } if(c[1] != 0){ @@ -37,10 +57,10 @@ if(c[2] != 0){ assert(0); } - if(c[3] != 22){ + if(c[3] != 0){ assert(0); } - if(c[4] != 0){ + if(c[4] != 29){ assert(0); } if(c[5] != 0){ @@ -49,7 +69,7 @@ if(c[6] != 0){ assert(0); } - if(c[7] != 21){ + if(c[7] != 0){ assert(0); } return 0; diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_pshufd_01_A.d --- a/run/a/asm_pshufd_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_pshufd_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,19 +16,36 @@ int main(){ haveSSE2!()(); - float* a = [1.0f, 2.0f, 3.0f, 4.0f]; - float* b = [5.0f, 6.0f, 7.0f, 8.0f]; + float[] A = [1.0f, 2.0f, 3.0f, 4.0f]; + float* a = A.ptr; - float* c = new float[4]; + float[] B = [5.0f, 6.0f, 7.0f, 8.0f]; + float* b = B.ptr; + + float* c = (new float[4]).ptr; - asm{ - mov EAX, a; - movups XMM0, [EAX]; - mov EAX, b; - movups XMM1, [EAX]; - pshufd XMM0, XMM1, 0b01_01_00_10; - mov EAX, c; - movups [EAX], XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movups XMM0, [EAX]; + mov EAX, b; + movups XMM1, [EAX]; + pshufd XMM0, XMM1, 0b01_01_00_10; + mov EAX, c; + movups [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movups XMM0, [RAX]; + mov RAX, b; + movups XMM1, [RAX]; + pshufd XMM0, XMM1, 0b01_01_00_10; + mov RAX, c; + movups [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != 7.0f){ diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_pshufhw_01_A.d --- a/run/a/asm_pshufhw_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_pshufhw_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,28 +16,34 @@ int main(){ haveSSE2!()(); - const short[8] A = [9, 9, 9, 9, 9, 9, 9, 9]; - const short[8] B = [1, 2, 3, 4, 5, 6, 7, 8]; + short[] A = [9, 9, 9, 9, 9, 9, 9, 9]; + short* a = A.ptr; - short[8] c; + short[] B = [1, 2, 3, 4, 5, 6, 7, 8]; + short* b = B.ptr; + + short* c = (new short[8]).ptr; asm{ - movdqu XMM0, A; - movdqu XMM1, B; + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; pshufhw XMM0, XMM1, 0b11_10_01_00; - movdqu, XMM0; + mov EAX, c; + movdqu [EAX], XMM0; } - if(c[0] != 4){ + if(c[0] != 1){ assert(0); } - if(c[1] != 3){ + if(c[1] != 2){ assert(0); } - if(c[2] != 2){ + if(c[2] != 3){ assert(0); } - if(c[3] != 1){ + if(c[3] != 4){ assert(0); } if(c[4] != 5){ diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_pshuflw_01_A.d --- a/run/a/asm_pshuflw_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_pshuflw_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,40 +16,60 @@ int main(){ haveSSE2!()(); - const short[8] A = [9, 9, 9, 9, 9, 9, 9, 9]; - const short[8] B = [1, 2, 3, 4, 5, 6, 7, 8]; + short[] A = [9, 9, 9, 9, 9, 9, 9, 9]; + short* a = A.ptr; - short[8] c; + short[] B = [1, 2, 3, 4, 5, 6, 7, 8]; + short* b = B.ptr; + + short* c = (new short[8]).ptr; - asm{ - movdqu XMM0, A; - movdqu XMM1, B; - psuhflw XMM0, XMM1, 0b11_10_01_00; - movdqu, XMM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + pshuflw XMM0, XMM1, 0b11_01_10_00; + mov EAX, c; + movdqu [EAX], XMM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + pshuflw XMM0, XMM1, 0b11_01_10_00; + mov RAX, c; + movdqu [RAX], XMM0; + } + }else{ + static assert(0, "unhandled pointer size"); } if(c[0] != 1){ assert(0); } - if(c[1] != 2){ + if(c[1] != 3){ assert(0); } - if(c[2] != 3){ + if(c[2] != 2){ assert(0); } if(c[3] != 4){ assert(0); } - if(c[4] != 8){ + if(c[4] != 5){ assert(0); } - if(c[5] != 7){ + if(c[5] != 6){ assert(0); } - if(c[6] != 6){ + if(c[6] != 7){ assert(0); } - if(c[7] != 5){ + if(c[7] != 8){ assert(0); } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_pshufw_01_A.d --- a/run/a/asm_pshufw_01_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_pshufw_01_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,28 +16,48 @@ int main(){ haveSSE2!()(); - const short[4] A = [9, 9, 9, 9]; - const short[4] B = [1, 2, 3, 4]; + short[] A = [9, 9, 9, 9]; + short* a = A.ptr; - short[4] c; + short[] B = [1, 2, 3, 4]; + short* b = B.ptr; + + short* c = (new short[4]).ptr; - asm{ - movq MM0, A; - movq MM1, B; - psuhfw MM0, MM1, 0b11_10_01_00; - movq c, MM0; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movq MM0, [EAX]; + mov EAX, b; + movq MM1, [EAX]; + pshufw MM0, MM1, 0b11_00_01_10; + mov EAX, c; + movq [EAX], MM0; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movq MM0, [RAX]; + mov RAX, b; + movq MM1, [RAX]; + pshufw MM0, MM1, 0b11_00_01_10; + mov RAX, c; + movq [RAX], MM0; + } + }else{ + static assert(0, "unhandled pointer size"); } - if(c[0] != 4){ + if(c[0] != 3){ assert(0); } - if(c[1] != 3){ + if(c[1] != 2){ assert(0); } - if(c[2] != 2){ + if(c[2] != 1){ assert(0); } - if(c[3] != 1){ + if(c[3] != 4){ assert(0); } diff -r 288d15cd3b95 -r 1c8652b3795a run/a/asm_pxor_02_A.d --- a/run/a/asm_pxor_02_A.d Fri Jan 12 23:06:49 2007 +0000 +++ b/run/a/asm_pxor_02_A.d Fri Jan 12 23:07:17 2007 +0000 @@ -16,7 +16,7 @@ int main(){ haveSSE2!()(); - ushort[8] a = new ushort[8]; + ushort* a = (new ushort[8]).ptr; a[0] = 0x1200; a[1] = 0x0120; a[2] = 0x0012; @@ -26,7 +26,7 @@ a[6] = 0x0000; a[7] = 0x1111; - ushort[] b = new ushort[8]; + ushort* b = (new ushort[8]).ptr; b[0] = 0x2100; b[1] = 0x2100; b[2] = 0x2100; @@ -36,7 +36,7 @@ b[6] = 0x0102; b[7] = 0x2222; - ushort[] c = new ushort[8]; + ushort* c = (new ushort[8]).ptr; c[0] = 0x3300; c[1] = 0x2020; c[2] = 0x2112; @@ -46,24 +46,44 @@ c[6] = 0x0102; c[7] = 0x3333; - ushort[] d = new ushort[8]; - ushort[] e = new ushort[8]; + ushort* d = (new ushort[8]).ptr; + ushort* e = (new ushort[8]).ptr; - asm{ - movdqu XMM0, a; - movdqu XMM1, b; - pxor XMM1, XMM0; - movdqu d, XMM0; - movdqu e, XMM1; + static if(size_t.sizeof == 4){ + asm{ + mov EAX, a; + movdqu XMM0, [EAX]; + mov EAX, b; + movdqu XMM1, [EAX]; + pxor XMM1, XMM0; + mov EAX, d; + movdqu [EAX], XMM0; + mov EAX, e; + movdqu [EAX], XMM1; + } + }else static if(size_t.sizeof == 8){ + asm{ + mov RAX, a; + movdqu XMM0, [RAX]; + mov RAX, b; + movdqu XMM1, [RAX]; + pxor XMM1, XMM0; + mov RAX, d; + movdqu [RAX], XMM0; + mov RAX, e; + movdqu [RAX], XMM1; + } + }else{ + static assert(0, "unhandled pointer size"); } - foreach(size_t i, ushort s; a){ + foreach(size_t i, ushort s; a[0 .. 8]){ if(s != d[i]){ assert(0); } } - foreach(size_t i, ushort s; c){ + foreach(size_t i, ushort s; c[0 .. 8]){ if(s != e[i]){ assert(0); }