ARMv8 странный бесконечный цикл - PullRequest
0 голосов
/ 07 декабря 2018

Так что для назначения мне нужно создать программу сборки, которая находит корень куба с плавающей запятой, переданный из двоичного файла.Кажется, что все работает, за исключением того, что в конце вычисления есть бесконечный цикл.

    calcCR:
    stp     x29, x30, [sp, -16]!
    mov     x29, sp
    //d0 contains the initial value
    fmov    d31, d0
    //first step is x = input/3.0, this  is initial setup and only should be done once, loop starts on step 2
    adrp    x9, a_m   //a_m is 3.0
    add     x9, x9, :lo12:a_m
    ldr     d1, [x9]        //d1 = 3.0
    adrp    x10, b_m    //b_m is 1.0e-10
    add     x10, x10, :lo12:b_m
    ldr     d16, [x10]      //d16 = 1.0e-10
    fmul    d17, d31, d16   //d17 = input*1.0e-10
    fdiv    d2, d31, d1     //d2 = x

calcTop:
    //second step is y = x*x*x
    fmul    d3, d2, d2
    fmul    d3, d3, d2      //d3 = y
    //third step is dy = y-input
    fsub    d4, d3, d31     //d4 = dy
    //fourth step is dy/dx = 3.0*x*x
    ldr     d1, [x9]
    fmul    d5, d1, d2
    fmul    d5, d5, d2      //d5 = dy/dx
    //fifth step is x = x-dy / (dy/dx), this will be the new trial value for x
    fsub    d6, d2, d4
    fdiv    d2, d6, d5      //d2 = new trial x
    //sixth step is get the absolute value of dy
    fabs    d7, d4  //d7 = abs dy, using this value causes an infinite loop in the comparison
    //seventh step is compare the absolute value of dy to input*1.0e-10
    //if |dy| is greater, go back to calcTop, if it is less then we're done, exit loop
    fcmp    d7, d17   //this comparison and branch is causing the infinite loop.
    b.ge    calcTop

    fmov    d0, d2
    ldp     x29, x30, [sp], 16
    ret

инструкции по присваиванию для расчетной части: «Метод Ньютона требует начального предположения для корня куба; используйте x= input / 3.0. Вычислите y, куб вашей текущей догадки x, используя y = x * x * x. Затем вычислите разницу dy между y и входным значением: используйте dy = y - input. Вычислите производную dy / dxс dy / dx = 3,0 * x * x. Затем вычислите новое пробное значение для x с помощью x = x - dy / (dy / dx). Повторяйте эти шаги, пока ошибка | dy | не будет минимизирована с использованием формулы | dy |

Я на 100% не понимаю, почему это не совсем работает, поэтому любая помощь будет признательна.

...