Если вы хотите изучить ассемблер, я бы настоятельно рекомендовал написать код на C или C ++ и проверить сгенерированную сборку на предмет выбора.
Это даст вам основу.
#include <cmath>
double compute(double x, double degree, double radius) {
return x + std::sin(degree) * radius;
}
Дает следующий LLVM IR:
define double @_Z7computeddd(double %x, double %degree, double %radius)
nounwind uwtable readnone
{
%1 = tail call double @sin(double %degree) nounwind readnone
%2 = fmul double %1, %radius
%3 = fadd double %2, %x
ret double %3
}
declare double @sin(double) nounwind readnone
, который дает следующую сборку:
.text
.globl _Z7computeddd
.align 16, 0x90
.type _Z7computeddd,@function
_Z7computeddd: # @_Z7computeddd
.Ltmp1:
.cfi_startproc
# BB#0:
subq $24, %rsp
.Ltmp2:
.cfi_def_cfa_offset 32
movsd %xmm2, 16(%rsp) # 8-byte Spill
movsd %xmm0, 8(%rsp) # 8-byte Spill
movaps %xmm1, %xmm0
callq sin
mulsd 16(%rsp), %xmm0 # 8-byte Folded Reload
addsd 8(%rsp), %xmm0 # 8-byte Folded Reload
addq $24, %rsp
ret
.Ltmp3:
.size _Z7computeddd, .Ltmp3-_Z7computeddd
.Ltmp4:
.cfi_endproc
.Leh_func_end0:
.section ".note.GNU-stack","",@progbits
Обратите внимание, что по-прежнему существует вызов sin
.