Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

1-Translate the following C code into IA-64. Your translation must be compliant

ID: 3710916 • Letter: 1

Question

1-Translate the following C code into IA-64. Your translation must be compliant with the gcc compiler 
conventions.

long sum(long A[], long size, long i){ 
if ( i >= size || i < 0) 
return 0; 
return A[i] + sum(A, size, i+1); 

long F1(int A[], int size){ 
long i;

for (i = 0; i < size; i++) 
if (i % 2 == 0) 
A[i] = i << 2; 
else 
A[i] = i >> 1;

return sum(A, size, 0);
{

======
it should not look like
sum(long*, long, long):
  push rbp
  mov rbp, rsp
  push rbx
  sub rsp, 40
  mov QWORD PTR [rbp-24], rdi
  mov QWORD PTR [rbp-32], rsi
  mov QWORD PTR [rbp-40], rdx
  mov rax, QWORD PTR [rbp-40]
  cmp rax, QWORD PTR [rbp-32]
  jge .L2
  cmp QWORD PTR [rbp-40], 0
  jns .L3
.L2:
  mov eax, 0
  jmp .L4
.L3:
  mov rax, QWORD PTR [rbp-40]
  lea rdx, [0+rax*8]
  mov rax, QWORD PTR [rbp-24]
  add rax, rdx
  mov rbx, QWORD PTR [rax]
  mov rax, QWORD PTR [rbp-40]
  lea rdx, [rax+1]
  mov rcx, QWORD PTR [rbp-32]
  mov rax, QWORD PTR [rbp-24]
  mov rsi, rcx
  mov rdi, rax
  call sum(long*, long, long)
  add rax, rbx
.L4:
  add rsp, 40
  pop rbx
  pop rbp
  ret
F1(long*, int):
  push rbp
  mov rbp, rsp
  sub rsp, 32
  mov QWORD PTR [rbp-24], rdi
  mov DWORD PTR [rbp-28], esi
  mov QWORD PTR [rbp-8], 0
.L9:
  mov eax, DWORD PTR [rbp-28]
  cdqe
  cmp QWORD PTR [rbp-8], rax
  jge .L6
  mov rax, QWORD PTR [rbp-8]
  and eax, 1
  test rax, rax
  jne .L7
  mov rax, QWORD PTR [rbp-8]
  lea rdx, [0+rax*8]
  mov rax, QWORD PTR [rbp-24]
  add rax, rdx
  mov rdx, QWORD PTR [rbp-8]
  sal rdx, 2
  mov QWORD PTR [rax], rdx
  jmp .L8
.L7:
  mov rax, QWORD PTR [rbp-8]
  lea rdx, [0+rax*8]
  mov rax, QWORD PTR [rbp-24]
  add rax, rdx
  mov rdx, QWORD PTR [rbp-8]
  sar rdx
  mov QWORD PTR [rax], rdx
.L8:
  add QWORD PTR [rbp-8], 1
  jmp .L9
.L6:
  mov eax, DWORD PTR [rbp-28]
  movsx rcx, eax
  mov rax, QWORD PTR [rbp-24]
  mov edx, 0
  mov rsi, rcx
  mov rdi, rax
  call sum(long*, long, long)
  leave
  ret
with the Qword ptr and stuff
but in simply assembly

example:
pushl %rbp
movl %rsp, %rbp
subl $4, %rsp
movl $0, -4(%rbp)

.L2:
movl -4(%rbp), %rax
cmpl 8(%rbp), %rax
jl .L5
jmp .L3

.L5:
decl 8(%rbp)
movl 12(%rbp), %rdx
leal -4(%rbp), %rax
addl %rdx, (%rax)
jmp .L2

.L3:
movl 8(%rbp), %rax
leave
ret
and stuff pls help

(in computer system language)
ASSEMBLY

Explanation / Answer

(1) Solution (In your needed format):

pushq %rbp

movq %rsp, %rbp

pushq %rbx

subq $40, %rsp

movq %rdi, -24(%rbp)

movq %rsi, -32(%rbp)

movq %rdx, -40(%rbp)

movq -40(%rbp), %rax

cmpq -32(%rbp), %rax

jge .L2

cmpq $0, -40(%rbp)

jns .L3

.L2:

movl $0, %eax

jmp .L4

.L3:

movq -40(%rbp), %rax

leaq 0(,%rax,8), %rdx

movq -24(%rbp), %rax

addq %rdx, %rax

movq (%rax), %rbx

movq -40(%rbp), %rax

leaq 1(%rax), %rdx

movq -32(%rbp), %rcx

movq -24(%rbp), %rax

movq %rcx, %rsi

movq %rax, %rdi

call sum

addq %rbx, %rax

.L4:

addq $40, %rsp

popq %rbx

popq %rbp

ret

.LFE0:

F1:

.LFB1:

pushq %rbp

movq %rsp, %rbp

subq $32, %rsp

movq %rdi, -24(%rbp)

movl %esi, -28(%rbp)

movq $0, -8(%rbp)

jmp .L6

.L9:

movq -8(%rbp), %rax

andl $1, %eax

testq %rax, %rax

jne .L7

movq -8(%rbp), %rax

leaq 0(,%rax,4), %rdx

movq -8(%rbp), %rax

leaq 0(,%rax,4), %rcx

movq -24(%rbp), %rax

addq %rcx, %rax

movl %edx, (%rax)

jmp .L8

.L7:

movq -8(%rbp), %rax

sarq %rax

movq %rax, %rdx

movq -8(%rbp), %rax

leaq 0(,%rax,4), %rcx

movq -24(%rbp), %rax

addq %rcx, %rax

movl %edx, (%rax)

.L8:

addq $1, -8(%rbp)

.L6:

movl -28(%rbp), %eax

cltq

cmpq %rax, -8(%rbp)

jl .L9

movl -28(%rbp), %eax

movslq %eax, %rcx

movq -24(%rbp), %rax

movl $0, %edx

movq %rcx, %rsi

movq %rax, %rdi

call sum

leave

ret

.LFE1:

.Letext0:

.Ldebug_info0:

.Ldebug_abbrev0:

.Ldebug_line0:

.LASF4:

.LASF1:

.LASF0:

.LASF3:

.LASF2:

{

(2) Solution (Optional):

sum:

  
push rbp
  
mov rbp, rsp
  
push rbx
  
sub rsp, 40
  
mov QWORD PTR [rbp-24], rdi
  
mov QWORD PTR [rbp-32], rsi
  
mov QWORD PTR [rbp-40], rdx
  
mov rax, QWORD PTR [rbp-40]
  
cmp rax, QWORD PTR [rbp-32]
  
jge .L2
  
cmp QWORD PTR [rbp-40], 0
  
jns .L3

.L2:
  
mov eax, 0
  
jmp .L4

.L3:
  
mov rax, QWORD PTR [rbp-40]
  
lea rdx, [0+rax*8]
  
mov rax, QWORD PTR [rbp-24]
  
add rax, rdx
  
mov rbx, QWORD PTR [rax]
  
mov rax, QWORD PTR [rbp-40]
  
lea rdx, [rax+1]
  
mov rcx, QWORD PTR [rbp-32]
  
mov rax, QWORD PTR [rbp-24]
  
mov rsi, rcx
  
mov rdi, rax
  
call sum
  
add rax, rbx

.L4:
  
add rsp, 40
  
pop rbx
  
pop rbp
  
ret

F1:
  
push rbp
  
mov rbp, rsp
  
sub rsp, 32
  
mov QWORD PTR [rbp-24], rdi
  
mov DWORD PTR [rbp-28], esi
  
mov QWORD PTR [rbp-8], 0
  
jmp
.L6

.L9:
  
mov rax, QWORD PTR [rbp-8]
  
and eax, 1
  
test rax, rax
  
jne .L7
  
mov rax, QWORD PTR [rbp-8]
  
lea rdx, [0+rax*4]
  
mov rax, QWORD PTR [rbp-8]
  
lea rcx, [0+rax*4]
  
mov rax, QWORD PTR [rbp-24]
  
add rax, rcx
  
mov DWORD PTR [rax], edx
  
jmp .L8

.L7:
  
mov rax, QWORD PTR [rbp-8]
  
sar rax
  
mov rdx, rax
  
mov rax, QWORD PTR [rbp-8]
  
lea rcx, [0+rax*4]
  
mov rax, QWORD PTR [rbp-24]
  
add rax, rcx
  
mov DWORD PTR [rax], edx

.L8:
  
add QWORD PTR [rbp-8], 1

.L6:
  
mov eax, DWORD PTR [rbp-28]
  
cdqe
  
cmp QWORD PTR [rbp-8], rax
  
jl .L9
  
mov eax, DWORD PTR [rbp-28]
  
movsx rcx, eax
  
mov rax, QWORD PTR [rbp-24]
  
mov edx, 0
  
mov rsi, rcx
  
mov rdi, rax
  
call sum
  
leave
  
ret

}