summaryrefslogtreecommitdiff
path: root/3/11_floating_point/50_fcvt2.c
blob: 052462ece85deb23ff5cdc8e589c0cbb19381718 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

// ip = rdi
// fp = rsi
// dp = rdx
// l  = rcx
// fcvt:
//      movl            (%rdi), %eax                eax<-int value of ip to eax
//      vmovss          (%rsi), %xmm0               xmm0<- move int value to float (vmov signed single?)
//      vcvttsd2si      (%rdx), %r8d                r8d<- double value to signed integer?
//      movl            %r8d, (%rdi)                *ip<- set pointer to truncated value of rdx
//      vcvttsd2ss      %eax, %xmm1, %xmm1          xmm1<- convert int to float
//      vmovss          %xmm1, (%rsi)               fp<-*ip
//      vcvtsi2sdq      %rcx, %xmm1, %xmm1          xmm1<- convert long to double
//      vmovsd          %xmm1, (%rdx)               dp<- l
//      vunpcklps       %xmm0, %xmm0, %xmm0
//      vcvtps2pd       %xmm0, %xmm0
//      ret
double fcvt2(int *ip, float *fp, double *dp, long l)
{
    int i = *ip; float f = *fp; double d = *dp;

    *ip = (int)         d;
    *fp = (float)       i;
    *dp = (double)      l;
    return (double)     f;
}