digitalmars.D.learn - I think i've found a bug, should / how do i report it.
- Chris Warwick (16/16) Mar 11 2007 MMX assembler doesnt like const.
- Jarrett Billingsley (5/20) Mar 11 2007 Are you sure that you can move immediates into MMX registers with movd?
- Daniel Keep (18/40) Mar 11 2007 Yup, yup.
- Chris Warwick (13/13) Mar 11 2007 Apologys for the previous jibberish.. i've been on honeymoon with D for ...
- Derek Parnell (12/32) Mar 11 2007 The MMX instruction 'movq' requires that the source/destination is eithe...
- Chris Warwick (7/38) Mar 11 2007 Should it really be optimizing typed constants like that, especialy with...
- Don Clugston (6/51) Mar 12 2007 'const' doesn't mean the same as in C++. A const is a constant, not a
- Chris Warwick (4/56) Mar 12 2007 ah ok, thanks.
MMX assembler doesnt like const. ------------------- const int foo = 1; asm mov EAX,foo; compiles ok. ---------------------- ulong foo = 1; asm movd MM0,foo; compiles ok. ----------------------- const ulong foo = 1; asm movd MM0,foo; complains "bad type/size of operands 'movd'" So simply changing the variable to const, breaks mmx's ability to use it. but the same thing is not true when using normal int registers. cw
Mar 11 2007
"Chris Warwick" <sp m.me.not> wrote in message news:et24ga$1ppn$1 digitalmars.com...MMX assembler doesnt like const. ------------------- const int foo = 1; asm mov EAX,foo; compiles ok. ---------------------- ulong foo = 1; asm movd MM0,foo; compiles ok. ----------------------- const ulong foo = 1; asm movd MM0,foo; complains "bad type/size of operands 'movd'" So simply changing the variable to const, breaks mmx's ability to use it. but the same thing is not true when using normal int registers.Are you sure that you can move immediates into MMX registers with movd? Everything I've found only says that movd moves from reg to MMX or from MMX to reg..
Mar 11 2007
Chris Warwick wrote:MMX assembler doesnt like const. ------------------- const int foo = 1; asm mov EAX,foo; compiles ok. ---------------------- ulong foo = 1; asm movd MM0,foo; compiles ok.Really? That's odd...----------------------- const ulong foo = 1; asm movd MM0,foo; complains "bad type/size of operands 'movd'"Yup, yup.So simply changing the variable to const, breaks mmx's ability to use it. but the same thing is not true when using normal int registers. cwI can't be sure, since I haven't written any MMX code in a while, but... movd. As in DWORD. As in 32-bits. ulong is 64. Have you tried movq? :P Maybe the reason this is happening is because it's only taking the first 32-bits of your non-cost ulong foo, whereas if you try to use a 64-bit immediate, it actually throws up an error saying "are you sure you mean that, because that don't fit". That said, I don't think I ever tried to load a ulong const... there's a few static ones in there, but no consts. Anyway, give movq a shot. Never know :) -- Daniel -- Unlike Knuth, I have neither proven or tried the above; it may not even make sense. v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
Mar 11 2007
Apologys for the previous jibberish.. i've been on honeymoon with D for the last 4 days and havn't had much sleep lol.. So the problem is still there i just wrote out the examples wrong.. getting my movd's and movq's all mixed up.. Anyway copy and past this time so i dont feck up... private ulong MMXZERO = 0x0; movq MM0,MMXZERO; compiles fine, as expected. But the addition of 'const' private const ulong MMXZERO = 0x0; movq MM0,MMXZERO; causes "bad type/size of operands 'movq'" cheers cw
Mar 11 2007
On Mon, 12 Mar 2007 01:43:34 -0000, Chris Warwick wrote:Apologys for the previous jibberish.. i've been on honeymoon with D for the last 4 days and havn't had much sleep lol.. So the problem is still there i just wrote out the examples wrong.. getting my movd's and movq's all mixed up.. Anyway copy and past this time so i dont feck up... private ulong MMXZERO = 0x0; movq MM0,MMXZERO; compiles fine, as expected. But the addition of 'const' private const ulong MMXZERO = 0x0; movq MM0,MMXZERO; causes "bad type/size of operands 'movq'" cheers cwThe MMX instruction 'movq' requires that the source/destination is either MMX register or an address of a 64-bit value, except that both can't be addresses. I believe that the DMD compile optimizes the 'const' value to be a literal zero so you end up with ... movq, MM0,0x0 which is not allowed. -- Derek Parnell Melbourne, Australia "Justice for David Hicks!" skype: derek.j.parnell
Mar 11 2007
"Derek Parnell" <derek psych.ward> wrote in message news:1898vpzduavha.1b2w76ic8zmeg.dlg 40tude.net...On Mon, 12 Mar 2007 01:43:34 -0000, Chris Warwick wrote:Should it really be optimizing typed constants like that, especialy with asm? is it worth me bring this issue up somewhere? cheers, cwApologys for the previous jibberish.. i've been on honeymoon with D for the last 4 days and havn't had much sleep lol.. So the problem is still there i just wrote out the examples wrong.. getting my movd's and movq's all mixed up.. Anyway copy and past this time so i dont feck up... private ulong MMXZERO = 0x0; movq MM0,MMXZERO; compiles fine, as expected. But the addition of 'const' private const ulong MMXZERO = 0x0; movq MM0,MMXZERO; causes "bad type/size of operands 'movq'" cheers cwThe MMX instruction 'movq' requires that the source/destination is either MMX register or an address of a 64-bit value, except that both can't be addresses. I believe that the DMD compile optimizes the 'const' value to be a literal zero so you end up with ... movq, MM0,0x0 which is not allowed.
Mar 11 2007
Chris Warwick wrote:"Derek Parnell" <derek psych.ward> wrote in message news:1898vpzduavha.1b2w76ic8zmeg.dlg 40tude.net...'const' doesn't mean the same as in C++. A const is a constant, not a variable. You cannot take the address of a const; in many ways it's more like a #define. In theory, the const may not even be allocated any storage space at all in the final executable. (In practice, I think it always is, but I hope that changes eventually).On Mon, 12 Mar 2007 01:43:34 -0000, Chris Warwick wrote:Should it really be optimizing typed constants like that, especialy with asm? is it worth me bring this issue up somewhere? cheers, cwApologys for the previous jibberish.. i've been on honeymoon with D for the last 4 days and havn't had much sleep lol.. So the problem is still there i just wrote out the examples wrong.. getting my movd's and movq's all mixed up.. Anyway copy and past this time so i dont feck up... private ulong MMXZERO = 0x0; movq MM0,MMXZERO; compiles fine, as expected. But the addition of 'const' private const ulong MMXZERO = 0x0; movq MM0,MMXZERO; causes "bad type/size of operands 'movq'" cheers cwThe MMX instruction 'movq' requires that the source/destination is either MMX register or an address of a 64-bit value, except that both can't be addresses. I believe that the DMD compile optimizes the 'const' value to be a literal zero so you end up with ... movq, MM0,0x0 which is not allowed.
Mar 12 2007
"Don Clugston" <dac nospam.com.au> wrote in message news:et3rdl$1bhc$1 digitalmars.com...Chris Warwick wrote:ah ok, thanks. cw"Derek Parnell" <derek psych.ward> wrote in message news:1898vpzduavha.1b2w76ic8zmeg.dlg 40tude.net...'const' doesn't mean the same as in C++. A const is a constant, not a variable. You cannot take the address of a const; in many ways it's more like a #define. In theory, the const may not even be allocated any storage space at all in the final executable. (In practice, I think it always is, but I hope that changes eventually).On Mon, 12 Mar 2007 01:43:34 -0000, Chris Warwick wrote:Should it really be optimizing typed constants like that, especialy with asm? is it worth me bring this issue up somewhere? cheers, cwApologys for the previous jibberish.. i've been on honeymoon with D for the last 4 days and havn't had much sleep lol.. So the problem is still there i just wrote out the examples wrong.. getting my movd's and movq's all mixed up.. Anyway copy and past this time so i dont feck up... private ulong MMXZERO = 0x0; movq MM0,MMXZERO; compiles fine, as expected. But the addition of 'const' private const ulong MMXZERO = 0x0; movq MM0,MMXZERO; causes "bad type/size of operands 'movq'" cheers cwThe MMX instruction 'movq' requires that the source/destination is either MMX register or an address of a 64-bit value, except that both can't be addresses. I believe that the DMD compile optimizes the 'const' value to be a literal zero so you end up with ... movq, MM0,0x0 which is not allowed.
Mar 12 2007