Что я делаю не так при конвертации ГАЗА в МАСМ? - PullRequest
1 голос
/ 24 апреля 2020

Я уже позаботился о других различных синтаксисах, таких как выравнивание констант и их адресация (все они глобальные). Я старался изо всех сил преобразовать GAS для совместимости с windows. но без удачи мои модульные тесты продолжают давать сбой на windows ... пожалуйста, не предлагайте встроенные функции, я должен контролировать сборку в финальной программе для этой процедуры. спасибо!

eecos:
    vmovaps %xmm0, %xmm1 # xmm1 = xmm0

    vmovaps one(%rip), %xmm0 # initialize register to 1

    vmulps %xmm1, %xmm1, %xmm2 # x^2
    vmulps %xmm2, %xmm2, %xmm3 # x^4
    vmulps %xmm2, %xmm3, %xmm4 # x^6
    vmulps %xmm2, %xmm4, %xmm5 # x^8
    vmulps %xmm2, %xmm5, %xmm6 # x^10
    vmulps %xmm2, %xmm6, %xmm7 # x^12
    vmulps %xmm2, %xmm7, %xmm8 # x^14

    vmulps coef2(%rip), %xmm2, %xmm2
    vmulps coef4(%rip), %xmm3, %xmm3
    vmulps coef6(%rip), %xmm4, %xmm4
    vmulps coef8(%rip), %xmm5, %xmm5
    vmulps coef10(%rip), %xmm6, %xmm6
    vmulps coef12(%rip), %xmm7, %xmm7
    vmulps coef14(%rip), %xmm8, %xmm8

    vaddps %xmm2, %xmm0, %xmm0
    vaddps %xmm3, %xmm0, %xmm0
    vaddps %xmm4, %xmm0, %xmm0
    vaddps %xmm5, %xmm0, %xmm0
    vaddps %xmm6, %xmm0, %xmm0
    vaddps %xmm7, %xmm0, %xmm0
    vaddps %xmm8, %xmm0, %xmm0

    # setup rounding at the hundred thousanth place
    # hundred thousanth place should be stable enough for physics
    vmulps hunth(%rip), %xmm0, %xmm0
    vroundps $8, %xmm0, %xmm0
    vmulps invhunth(%rip), %xmm0, %xmm0
    ret # return xmm0

что у меня в МАСМ

eecos PROC FRAME
    .endprolog
    vmovaps xmm1, xmm0 ; xmm1 = xmm0

    vmovaps xmm0, XMMWORD PTR one ; initialize register to 1

    vmulps xmm2, xmm1, xmm1 ; x^2
    vmulps xmm3, xmm2, xmm2 ; x^4
    vmulps xmm4, xmm3, xmm2 ; x^6
    vmulps xmm5, xmm4, xmm2 ; x^8
    vmulps xmm6, xmm5, xmm2 ; x^10
    vmulps xmm7, xmm6, xmm2 ; x^12
    vmulps xmm8, xmm7, xmm2 ; x^14

    vmulps xmm2, xmm2, XMMWORD PTR coef2
    vmulps xmm3, xmm3, XMMWORD PTR coef4
    vmulps xmm4, xmm4, XMMWORD PTR coef6
    vmulps xmm5, xmm5, XMMWORD PTR coef8
    vmulps xmm6, xmm6, XMMWORD PTR coef10
    vmulps xmm7, xmm7, XMMWORD PTR coef12
    vmulps xmm8, xmm8, XMMWORD PTR coef14

    vaddps xmm0, xmm0, xmm2
    vaddps xmm0, xmm0, xmm3
    vaddps xmm0, xmm0, xmm4
    vaddps xmm0, xmm0, xmm5
    vaddps xmm0, xmm0, xmm6
    vaddps xmm0, xmm0, xmm7
    vaddps xmm0, xmm0, xmm8

    ; setup rounding at the hundred thousanth place
    ; hundred thousanth place should be stable enough for physics
    vmulps xmm0, xmm0, XMMWORD PTR hunth
    vroundps xmm0, xmm0, 8
    vmulps xmm0, xmm0, XMMWORD PTR invhunth
    ret ; return xmm0
; cosine subroutine here
eecos ENDP
END

Выходы (сначала ГАЗ) https://paste.ubuntu.com/p/R5vHC6kyfK/ https://paste.ubuntu.com/p/V2NgWmSqDN/

...