From: Victor S. <ken...@gm...> - 2009-12-26 22:37:30
|
Dear MinGW users, Does anyone know how to create a 64-bit local register variable in GNU C/C++? I want to create a local variable stored in EDX:EAX register pair (under Intel x86 architecture). This is what I've done so far: register uint64_t edx_eax asm("eax"); But I want something like this: register uint64_t edx_eax asm("edx:eax"); I searched hard inside the GCC Documentations, but they don't have any examples for paired-registers. Currently, the above code is able to store inside the EDX:EAX register pair, but I am not sure if it is just "by luck", since EAX is only 32-bits, whereas edx_eax is 64 bits. |
From: <uti...@ya...> - 2009-12-27 03:59:53
|
Victor Soh wrote: > Dear MinGW users, > > Does anyone know how to create a 64-bit local register variable in GNU > C/C++? > I want to create a local variable stored in EDX:EAX register pair (under > Intel x86 architecture). > This is what I've done so far: > > register uint64_t edx_eax asm("eax"); > > But I want something like this: > > register uint64_t edx_eax asm("edx:eax"); You're very close: http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html #define RDTSC(llptr) ({ \ __asm__ __volatile__ ( \ ".byte 0x0f; .byte 0x31" \ : "=A" (llptr) \ : : "eax", "edx"); }) Reads the TimeStampCounter on the Pentium and puts the 64 bit result into llptr. eax and edx combined into a 64-bit integer (use long longs) has an alias: A What you want could be: register uint64_t edx_eax asm("A"); Here's the list of register loading codes that you'll be likely to use: a eax b ebx c ecx d edx S esi D edi I constant value (0 to 31) q,r dynamically allocated register (see below) g eax, ebx, ecx, edx or variable in memory A eax and edx combined into a 64-bit integer (use long longs) But to have better control you'll need to look at this too: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax" /* clobbered register */ ); The other thing I suggest is to have intel assembler instruction manuals and the amd assembler instruction manuals for your cpu handy. whatever instructions that are available have been introduced in the gas(gnu asm). UTSL for gas for all of the implemented instructions for your particular chip i.e. i386/p3/amd/amd64/mips/mips/arm... > I searched hard inside the GCC Documentations, but they don't have any > examples for paired-registers. They do as noted above with the alias, but don't be limited by the gcc. generate a hello.c into asm by the gcc -S hello.c and it will spew out a ..asm file. Change it, try it in asm first and then bring it back into c/cpp with a string taken straight from the .asm file you used keeping in mind the 1)input, 2)output, and 3)clobbered registers above. > Currently, the above code is able to store inside the EDX:EAX register > pair, but I am not sure if it is just "by luck", > since EAX is only 32-bits, whereas edx_eax is 64 bits. |
From: Victor S. <ken...@gm...> - 2009-12-27 19:57:37
|
Thanks uti...@ya... , Unfortunately I have tried declaring the following before: register uint64_t edx_eax asm("A"); register uint64_t edx_eax asm("%A"); But GCC complains with the error: invalid register name `A' for register variable I have also tried using GCC's compiler option -S to study the assembler output, which was how I observed that GCC "seems" to create the 64-bit local variable below inside the EDX:EAX register-pair: register uint64_t edx_eax asm("eax"); But as mentioned in my original email, I am not sure if it is just "by luck", since EAX is only 32-bits, whereas edx_eax is 64 bits, because I could not find any examples for paired-registers inside the GCC Documentations. Hence my original email's question remains unanswered: Does anyone know how to create a 64-bit local register variable in GNU C/C++? On Sun, Dec 27, 2009 at 12:04 PM, uti...@ya... < uti...@ya...> wrote: > Victor Soh wrote: > > Dear MinGW users, > > > > Does anyone know how to create a 64-bit local register variable in > GNU > > C/C++? > > I want to create a local variable stored in EDX:EAX register pair > (under > > Intel x86 architecture). > > This is what I've done so far: > > > > register uint64_t edx_eax asm("eax"); > > > > But I want something like this: > > > > register uint64_t edx_eax asm("edx:eax"); > > You're very close: > http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html > > #define RDTSC(llptr) ({ \ > __asm__ __volatile__ ( \ > ".byte 0x0f; .byte 0x31" \ > : "=A" (llptr) \ > : : "eax", "edx"); }) > > Reads the TimeStampCounter on the Pentium and puts the 64 bit result > into llptr. > > eax and edx combined into a 64-bit integer (use long longs) has an alias: > A > > What you want could be: > register uint64_t edx_eax asm("A"); > > Here's the list of register loading codes that you'll be likely to use: > > a eax > b ebx > c ecx > d edx > S esi > D edi > I constant value (0 to 31) > q,r dynamically allocated register (see below) > g eax, ebx, ecx, edx or variable in memory > A eax and edx combined into a 64-bit integer (use long longs) > > > But to have better control you'll need to look at this too: > > http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 > > int a=10, b; > asm ("movl %1, %%eax; > movl %%eax, %0;" > :"=r"(b) /* output */ > :"r"(a) /* input */ > :"%eax" /* clobbered register */ > ); > > > The other thing I suggest is to have intel assembler instruction manuals > and the amd assembler instruction manuals for your cpu handy. > whatever instructions that are available have been introduced in the > gas(gnu asm). UTSL for gas for all of the implemented instructions for > your particular chip i.e. i386/p3/amd/amd64/mips/mips/arm... > > > I searched hard inside the GCC Documentations, but they don't have > any > > examples for paired-registers. > > They do as noted above with the alias, but don't be limited by the gcc. > generate a hello.c into asm by the gcc -S hello.c and it will spew out a > ..asm file. Change it, try it in asm first and then bring it back into > c/cpp with a string taken straight from the .asm file you used keeping > in mind the 1)input, 2)output, and 3)clobbered registers above. > > > Currently, the above code is able to store inside the EDX:EAX > register > > pair, but I am not sure if it is just "by luck", > > since EAX is only 32-bits, whereas edx_eax is 64 bits. > > > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and > easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > MinGW-users mailing list > Min...@li... > > This list observes the Etiquette found at > http://www.mingw.org/Mailing_Lists. > We ask that you be polite and do the same. Disregard for the list > etiquette may cause your account to be moderated. > > _______________________________________________ > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > |
From: Andy K. <and...@gm...> - 2009-12-27 20:13:07
|
2009/12/26 Victor Soh: > Dear MinGW users, > > Does anyone know how to create a 64-bit local register variable in GNU > C/C++? > I want to create a local variable stored in EDX:EAX register pair (under > Intel x86 architecture). Why? Unless you have a very good reason for doing that you should trust the compiler optimiser to place the variable into appropriate registers. In fact, pinning variables to particular registers can actually decrease performance because it stops the compiler from finding a better register assignment. Also, EDX:EAX is significant only for multiplication and division, and the compiler knows full well about that. Andy |
From: Victor S. <ken...@gm...> - 2009-12-27 23:30:46
|
Well, my reason is because GCC "seems" to always place the return value of a 64-bit variable inside the EDX:EAX register pair. (I can't find the documentation for this behavior as well...but one of standford university's lecture-material also mentioned this behavior) So if I could force GCC to create a 64-bit local register variable inside the EDX:EAX register pair, I think it would be a decent optimization technique when dealing with C++ inline assembly, because this way, I don't have to redundantly pass local variables between C++ and assembly through C++ extended inline assembly's input & output operands. I mean, if I am doing C++ inline assembly for optimization, why not optimize it as best as I can? I know GCC will perform optimization as well, but I have no knowledge of what GCC does or how it does it, and it seems (from online sources) that compiler's optimization algorithms still can't win human's optimization skill. So, basically I just want to know how to create a 64-bit local register variable, but I can't seem to find the documentation for it... and since I don't know how GCC's assembler (GAS i believe) works, I prefer to know have a "black & white" guarantee that I what I am doing is correct, and not by "luck" (possibly as a result of GAS optimization) that my 64-bit local register variable happens to be in EDX:EAX register. It is an unsettling feeling...I do not want to one day find my program "not working" because of this small issue. On Mon, Dec 28, 2009 at 4:12 AM, Andy Koppe <and...@gm...> wrote: > 2009/12/26 Victor Soh: > > Dear MinGW users, > > > > Does anyone know how to create a 64-bit local register variable in > GNU > > C/C++? > > I want to create a local variable stored in EDX:EAX register pair > (under > > Intel x86 architecture). > > Why? Unless you have a very good reason for doing that you should > trust the compiler optimiser to place the variable into appropriate > registers. In fact, pinning variables to particular registers can > actually decrease performance because it stops the compiler from > finding a better register assignment. Also, EDX:EAX is significant > only for multiplication and division, and the compiler knows full well > about that. > > Andy > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and > easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > MinGW-users mailing list > Min...@li... > > This list observes the Etiquette found at > http://www.mingw.org/Mailing_Lists. > We ask that you be polite and do the same. Disregard for the list > etiquette may cause your account to be moderated. > > _______________________________________________ > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > |
From: KHMan <kei...@gm...> - 2009-12-28 02:14:16
|
Victor Soh wrote: > Well, my reason is because GCC "seems" to always place the return value > of a 64-bit variable inside the EDX:EAX register pair. > (I can't find the documentation for this behavior as well...but one of > standford university's lecture-material also mentioned this behavior) Standard ABI practice for IA32 ABI. Why do you use the word "seems"? Do you know your ABI? If not, please read Anger Fog. > So if I could force GCC to create a 64-bit local register variable > inside the EDX:EAX register pair, > I think it would be a decent optimization technique when dealing with > C++ inline assembly, > because this way, I don't have to redundantly pass local variables > between C++ and assembly > through C++ extended inline assembly's input & output operands. What are you optimizing for? If you are in 32-bit mode, then 64-bit operations will take 2 registers and use 2 pipes in a processor. Plus, MOV from reg-to-reg can be done by renaming in the register file, it never needs any ALU pipe and it may well be sorta free, zapped during instruction decoding. In today's IA32 processors, there is little need to bother with small optimization wins... > I mean, if I am doing C++ inline assembly for optimization, why not > optimize it as best as I can? > I know GCC will perform optimization as well, but I have no knowledge of > what GCC does or how it does it, > and it seems (from online sources) that compiler's optimization > algorithms still can't win human's optimization skill. Whaaa.... Yes, it's possible that you can spend 1000 hours producing the best code and it may end up a few percent faster, but this is becoming more and more unlikely for modern compilers. Is it worth it? Not for me. Notice that many serious bits of optimized assembly code are for big wins, like for video codes, etc. And for those big wins, a small bit of optimization is negligible. So it all depends on what your time is worth. If you think it's worth it, we cannot stop you... But I'd rather go out for a beer than bang my head on optimization wins that will be barely noticeable given future manufacturing improvements. > [snip] Developers and academics from all over the Earth have put in an untold number of hours into compilers and optimizations. If you think you have an earth-shaking idea, shake off the euphoria and think again. > On Mon, Dec 28, 2009 at 4:12 AM, Andy Koppe wrote: > 2009/12/26 Victor Soh: > > Dear MinGW users, > > Does anyone know how to create a 64-bit local register > variable in GNU > > C/C++? > > I want to create a local variable stored in EDX:EAX register > pair (under > > Intel x86 architecture). > > Why? Unless you have a very good reason for doing that you should > trust the compiler optimiser to place the variable into appropriate > registers. In fact, pinning variables to particular registers can > actually decrease performance because it stops the compiler from > finding a better register assignment. Also, EDX:EAX is significant > only for multiplication and division, and the compiler knows full well > about that. > [snip] -- Cheers, Kein-Hong Man (esq.) Kuala Lumpur, Malaysia |
From: Victor S. <ken...@gm...> - 2009-12-28 13:17:40
|
WOW! Thanks for your reply KHMan :) I have never heared of ABI before until your reply (I guess I must be living under a rock?) Seems like Agner Fog's website is exactly what I am looking for :) I am going to dig that website's many resources now. Thanks once again :) On Mon, Dec 28, 2009 at 10:13 AM, KHMan <kei...@gm...> wrote: > Victor Soh wrote: > > Well, my reason is because GCC "seems" to always place the return value > > of a 64-bit variable inside the EDX:EAX register pair. > > (I can't find the documentation for this behavior as well...but one of > > standford university's lecture-material also mentioned this behavior) > > Standard ABI practice for IA32 ABI. Why do you use the word > "seems"? Do you know your ABI? If not, please read Anger Fog. > > > So if I could force GCC to create a 64-bit local register variable > > inside the EDX:EAX register pair, > > I think it would be a decent optimization technique when dealing with > > C++ inline assembly, > > because this way, I don't have to redundantly pass local variables > > between C++ and assembly > > through C++ extended inline assembly's input & output operands. > > What are you optimizing for? If you are in 32-bit mode, then > 64-bit operations will take 2 registers and use 2 pipes in a > processor. Plus, MOV from reg-to-reg can be done by renaming in > the register file, it never needs any ALU pipe and it may well be > sorta free, zapped during instruction decoding. In today's IA32 > processors, there is little need to bother with small optimization > wins... > > > I mean, if I am doing C++ inline assembly for optimization, why not > > optimize it as best as I can? > > I know GCC will perform optimization as well, but I have no knowledge of > > what GCC does or how it does it, > > and it seems (from online sources) that compiler's optimization > > algorithms still can't win human's optimization skill. > > Whaaa.... Yes, it's possible that you can spend 1000 hours > producing the best code and it may end up a few percent faster, > but this is becoming more and more unlikely for modern compilers. > Is it worth it? Not for me. Notice that many serious bits of > optimized assembly code are for big wins, like for video codes, > etc. And for those big wins, a small bit of optimization is > negligible. > > So it all depends on what your time is worth. If you think it's > worth it, we cannot stop you... But I'd rather go out for a beer > than bang my head on optimization wins that will be barely > noticeable given future manufacturing improvements. > > > [snip] > > Developers and academics from all over the Earth have put in an > untold number of hours into compilers and optimizations. If you > think you have an earth-shaking idea, shake off the euphoria and > think again. > > > On Mon, Dec 28, 2009 at 4:12 AM, Andy Koppe wrote: > > 2009/12/26 Victor Soh: > > > Dear MinGW users, > > > Does anyone know how to create a 64-bit local register > > variable in GNU > > > C/C++? > > > I want to create a local variable stored in EDX:EAX register > > pair (under > > > Intel x86 architecture). > > > > Why? Unless you have a very good reason for doing that you should > > trust the compiler optimiser to place the variable into appropriate > > registers. In fact, pinning variables to particular registers can > > actually decrease performance because it stops the compiler from > > finding a better register assignment. Also, EDX:EAX is significant > > only for multiplication and division, and the compiler knows full > well > > about that. > > [snip] > > -- > Cheers, > Kein-Hong Man (esq.) > Kuala Lumpur, Malaysia > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and > easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > MinGW-users mailing list > Min...@li... > > This list observes the Etiquette found at > http://www.mingw.org/Mailing_Lists. > We ask that you be polite and do the same. Disregard for the list > etiquette may cause your account to be moderated. > > _______________________________________________ > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > |
From: KHMan <kei...@gm...> - 2009-12-28 16:16:42
|
Victor Soh wrote: > WOW! > Thanks for your reply KHMan :) > I have never heared of ABI before until your reply (I guess I must be > living under a rock?) > Seems like Agner Fog's website is exactly what I am looking for :) > I am going to dig that website's many resources now. Agner Fog (sorry for the typo) covers the pros and cons very well, plus he has all the information in one place, very comprehensive. He was quite famous with his optimization documents during the heydays of Pentium optimization. Another famous name is Michael Abrash, who seems to be doing a lot of Larabee stuff these days, so there's a lot of optimization to be done yet! The OpenWatcom site also has a lot of good links. To reiterate, at risk of being off-topic on this list, there are some inaccuracies in what I last posted, so the following is either to correct or compound the mistakes: A MOV reg,reg is a copy operation and cannot be simply renamed. The 'simple' register rename operation I was supposed to recall was actually FXCH. The correct stuff are of course in those docs. > Thanks once again :) > On Mon, Dec 28, 2009 at 10:13 AM, KHMan wrote: > > Victor Soh wrote: > > Well, my reason is because GCC "seems" to always place the return > value > > of a 64-bit variable inside the EDX:EAX register pair. > > (I can't find the documentation for this behavior as well...but > one of > > standford university's lecture-material also mentioned this behavior) > > Standard ABI practice for IA32 ABI. Why do you use the word > "seems"? Do you know your ABI? If not, please read Anger Fog. > [snip snip] This has been a little off-topic, so I'll stop here. Have fun, -- Cheers, Kein-Hong Man (esq.) Kuala Lumpur, Malaysia |