loop:
; x in %rdi, n in %esi
movl %esi, %ecx
movl $1, %edx
movl $0, %eax
jmp .L2
.L3:
movq %rdi, %r8
andq %rdx, %r8
orq %r8, %rax
salq %cl, %rdx
.L2:
testq %rdx, %rdx
jne .L3
rep; ret
The preceding code was generated by compiling C code that had the following overall form:
longloop(longx,longn){long result = ____;long mask;for(mask = ____; mask ____; mask = ____){ result |= ____;}return result;}
Your task is to fill in the missing parts of the code to get a program equivalent to the generated assembly code. Recall that the result of the function is returened in register %rax. You will find it helpful to examine the assembly code before, during , and after the loop to form a consistent mapping between the registers and the program variables.
A. Which registers hold program values x, n, result, and mask?
x in %rdi, n in %eax, result in %rax, mask in %rdx
B. What are the initial values of result and mask?