2011-01-18 1 views
2

Quelles sont les instructions pour le cast de type dans Intel 64 ISA?Quelles sont les instructions pour le cast de type dans Intel 64 ISA

Comme lancer long int pour doubler?

Je fais quelques tests comme celui-ci:

$ cat type_cast.c 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    long int a = 8l; 
    double b; 

    b = (double)a; 

    printf("%f", b); 

    return 0; 
} 

$ gcc -O0 -g -Wall type_cast.c -o type_cast 
$ objdump -S type_cast 

La partie principale est pour:

int main() 
{ 
    4004c4: 55     push %rbp 
    4004c5: 48 89 e5    mov %rsp,%rbp 
    4004c8: 48 83 ec 10   sub $0x10,%rsp 
    long int a = 8l; 
    4004cc: 48 c7 45 f8 08 00 00 movq $0x8,-0x8(%rbp) 
    4004d3: 00 
    double b; 

    b = (double)a; 
    4004d4: f2 48 0f 2a 45 f8  cvtsi2sdq -0x8(%rbp),%xmm0 
    4004da: f2 0f 11 45 f0  movsd %xmm0,-0x10(%rbp) 

    printf("%f", b); 
    4004df: b8 f8 05 40 00  mov $0x4005f8,%eax 
    4004e4: f2 0f 10 45 f0  movsd -0x10(%rbp),%xmm0 
    4004e9: 48 89 c7    mov %rax,%rdi 
    4004ec: b8 01 00 00 00  mov $0x1,%eax 
    4004f1: e8 c2 fe ff ff  callq 4003b8 <[email protected]> 

    return 0; 
    4004f6: b8 00 00 00 00  mov $0x0,%eax 
} 

Il utilise cvtsi2sdq -0x8 (% RBP),% xmm0 et movsd% xmm0, -0x10 (% rbp) pour passer de long int à double.

Je me demande quelles sont les autres méthodes généralement utilisées dans Intel 64 ISA.

+0

Etes-vous intéressé par les instructions générées? Si oui, quelle application de la connaissance allez-vous faire? – wallyk

+0

@wallyk Je suis intéressé par les instructions. Je viens de générer des instructions à partir de C pour voir quels types d'instructions peuvent être utilisés pour le casting de type. Je veux savoir la méthode de casting de type général et efficace dans Intel 64 ISA. – ericzma

Répondre

1

Vous ne trouverez peut-être pas grand chose d'autre puisque SIMD est devenu assez bien implémenté. Naturellement, vous aurez la variante compressée (cvtpi2pd) pour plusieurs conversions simultanées mais ce n'est probablement pas ce que vous demandez. Votre seule vraie alternative serait la paire fildl/fstpl qui chargera votre long int dans la pile x87 à virgule flottante et le relira sur votre pile.

Questions connexes