LINUX.ORG.RU

как intel asm скомпилять?


0

1

Есть код:

#include <stdio.h>

float cuberoot_sse_8bits( float x )
{
    float z;
    static const float three = 3.0f;
    __asm
    {
        mov        eax, x                // x as bits
        movss    xmm2, x                // x2: x
        movss    xmm1, three            // x1: 3
        // Magic floating point cube root done with integer math.
        // The exponent is divided by three in such a way that 
        // remainder bits get shoved into the top of the normalized 
        // mantissa. 
        mov        ecx, eax            // copy of x
        and        eax, 0x7FFFFFFF        // exponent & mantissa of x in biased-127
        sub     eax, 0x3F800000        // exponent & mantissa of x in 2's comp
        sar     eax, 10                // 
        imul    eax, 341            // 341/1024 ~= .333
        add        eax, 0x3F800000        // back to biased-127
        and     eax, 0x7FFFFFFF        // remask
        and        ecx, 0x80000000        // original sign and mantissa
        or      eax, ecx            // masked new exponent, old sign and mantissa
        mov        z, eax                // 
        
        // use SSE to refine the first approximation
        movss    xmm0, z                ;// x0: z
        movss    xmm3, xmm0            ;// x3: z
        mulss    xmm3, xmm0            ;// x3: z*z
        movss    xmm4, xmm3            ;// x4: z*z
        mulss   xmm3, xmm1            ;// x3: 3*z*z
        rcpss    xmm3, xmm3            ;// x3: ~ 1/(3*z*z)
        mulss   xmm4, xmm0            ;// x4: z*z*z
        subss    xmm4, xmm2            ;// x4: z*z*z-x
        mulss    xmm4, xmm3            ;// x4: (z*z*z-x) / (3*z*z)
        subss    xmm0, xmm4            ;// x0: z' accurate to within about 0.3%
        movss    z, xmm0
    }

    return z;
}

int main (void)
{
	float i = 15, f;
	f = cuberoot_sse_8bits(i);
	printf ("Cube SQRT is %f\n", f);
	return 0;
}

пробую собрать:

gcc -S -masm=intel sqrt.c

Всё равно упорно требует синтаксис AT&T.

Да ты, парень, читать по аглицки не умеешь. Это генерирует асм файл в синтаксесе интел. Тебе же надо добавить инструкцию в код

Today, gas supports both syntax sets (.intel_syntax and the default .att_syntax)

parrto
()

или выносите гвозди в либы и делайте реализации под _все_ доступные ISA или вдоль.

exception13 ★★★★★
()
Ответ на: комментарий от steemandlinux

Ты слепой, али читать не умеешь?
Тебе же надо добавить инструкцию в код .intel_syntax
.intel_syntax
.intel_syntax
.intel_syntax
школота

parrto
()
Ответ на: комментарий от parrto

А нашел в мануле:

    asm __volatile__ (
        ".intel_syntax noprefix       \n\t"
steemandlinux ★★★★★
() автор топика

а зачем ты передаёшь опцию -S?

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.