Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why did GCC generate mov %eax,%eax and what does it mean?

GCC 4.4.3 generated the following x86_64 assembly. The part that confuses me is the mov %eax,%eax. Move the register to itself? Why?

   23b6c:       31 c9                   xor    %ecx,%ecx        ; the 0 value for shift    23b6e:       80 7f 60 00             cmpb   $0x0,0x60(%rdi)  ; is it shifted?    23b72:       74 03                   je     23b77    23b74:       8b 4f 64                mov    0x64(%rdi),%ecx  ; is shifted so load shift value to ecx    23b77:       48 8b 57 38             mov    0x38(%rdi),%rdx  ; map base    23b7b:       48 03 57 58             add    0x58(%rdi),%rdx  ; plus offset to value    23b7f:       8b 02                   mov    (%rdx),%eax      ; load map_used value to eax    23b81:       89 c0                   mov    %eax,%eax        ; then what the heck is this? promotion from uint32 to 64-bit size_t?    23b83:       48 d3 e0                shl    %cl,%rax         ; shift rax/eax by cl/ecx    23b86:       c3                      retq    

The C++ code for this function is:

    uint32_t shift = used_is_shifted ? shift_ : 0;     le_uint32_t le_map_used = *used_p();     size_t map_used = le_map_used;     return map_used << shift; 

An le_uint32_t is a class which wraps byte-swap operations on big-endian machines. On x86 it does nothing. The used_p() function computes a pointer from the map base + offset and returns a pointer of the correct type.

like image 762
Zan Lynx Avatar asked Aug 10 '12 23:08

Zan Lynx


People also ask

What does G ++ mean in C?

GNU C++ Compiler ( g++ ) is a compiler in Linux which is used to compile C++ programs. It compiles both files with extension . c and . cpp as C++ files.

What is G ++ and GCC?

g++ is used to compile C++ program. gcc is used to compile C program. g++ can compile any . c or . cpp files but they will be treated as C++ files only.

What is the default executable name generated by GCC?

By default, gcc assumes that you want to create an executable program called a.exe.

What is the GCC used for?

It functions as a cross compiler, creating executable code for a platform other than the one on which the compiler is running. GCC is also a core component of the tightly integrated GNU toolchain, produced by the GNU Project, that includes glibc, Binutils, and the GNU Debugger (GDB).


1 Answers

In x86-64, 32-bit instructions implicitly zero-extend: bits 32-63 are cleared (to avoid false dependencies). So sometimes that's why you'll see odd-looking instructions. (Is mov %esi, %esi a no-op or not on x86-64?)

However, in this case the previous mov-load is also 32-bit so the high half of %rax is already cleared. The mov %eax, %eax appears to be redundant, apparently just a GCC missed optimization.

like image 58
ephemient Avatar answered Sep 18 '22 16:09

ephemient