21.3 右移

  1. #include <stdint.h>
  2. uint64_t f6 (uint64_t a)
  3. {
  4. return a>>7;
  5. };

代码 21.5: MSVC 2012 /Ox /Ob1

  1. _a$ = 8 ; size = 8
  2. _f6 PROC
  3. mov eax, DWORD PTR _a$[esp-4]
  4. mov edx, DWORD PTR _a$[esp]
  5. shrd eax, edx, 7
  6. shr edx, 7
  7. ret 0
  8. _f6 ENDP

代码 21.6: GCC 4.8.1 -O3 -fno-inline

  1. _f6:
  2. mov edx, DWORD PTR [esp+8]
  3. mov eax, DWORD PTR [esp+4]
  4. shrd eax, edx, 7
  5. shr edx, 7
  6. ret

右移也是分成两步完成:先移低位,然后移高位。但是低位部分通过指令SHRD移动,它将EDX的值移动7位,并从EAX借来1位,也就是从高位部分。而高位部分通过更受欢迎的指令SHR移动:的确,高位释放出来的位置用0填充。