Arm Asm Double Register Immediates

111 views Asked by At

I have an assignment requiring an Ln-algorithm written in armasm. I decided to use the BKM algorithm. The algorithm uses a lookUp table. The assignment requires to implement lookup tables in asm as well. The problem is that I'm getting an immediateOutOfBounds Error or garbageFollowingInstruction Error when compiling, even on immediates like VMOV.f64 d2, #0.0. On my other asm-Functions these Operations work fine

This is the code:

.global bkm_assembly

bkm_assembly:
    // r0 -> Adresse des Arguments dessen ln berechnet werden soll
    // r1 -> Adresse des LookUpTables
    // d0 -> e
    // d1 -> Argument
    // d2 -> Result
    // d3 -> Buffer for addition
    // r4 -> Buffer for LookupCalculation

    push {r4-r8, lr}
    b FillTablef

algorithm:
    VMOV.f64 d0, #2.718281828459045235360287471352662497757247093699959574966967627724076
    VLDR.f64 d1, [r0]
    VMOV.f64 d2, #0.0

algorithmArgBiggerE:
    //Divide Argument by e while Argument > e, add 1 each time
    VCMP.f64 d1, d0
    VMRS APSR_nzcv, FPSCR//get the Flags to be used by branch
    BLS algotithmArgSmallerEf
    VDIV.f64 d1, d1, d2
    VMOV.f64 d3, #1.0
    VADD.f64 d2, d2, d3
    B algorithmArgBiggerEb

algorithmArgSmallerE:
    //Main BKM Execution
    // d4 -> x
    // d5 -> s
    // d6 -> z
    // r2 -> k
    // r3 -> N

    MOV r3, #53
    VMOV.f64 d4, #1.0
    VMOV.f64 d5, #1.0
    MOV r2, #0

ForLoopBegin:
    CMP r3, r2
    BHS ForLoopEndf
    VMUL.f64 d6, d4, d5
    VADD.f64 d6, d6, d4
    //IF Condition
    VCMP.f64 d6, d1
    VMRS APSR_nzcv, FPSCR//get the Flags to be used by branch
    BLS EndIff
    VMOV.f64 d4, d6
    //clalculate LookUpAdress
    ADD r4, r1, r2, LSL #2
    VLDR.f64 d3, [r4]
    VADD.f64 d2, d2, d3
EndIf:
    VMOV.f64 d3, #2.0
    VDIV.f64 d5, d5, d3
    B ForLoopBeginb

ForLoopEnd:
    B EXITf






FillTable:
    // d2 -> Aktueller Wert zum befüllen des Lookups
    //Fill the Lookuptable
    LDR R1, =LookUp
    VMOV.f64 d2, #0.693147180559945297099404706000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.405465108108164392935428259000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.223143551314209769962616701000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.117783035656383447138088388000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.060624621816434840186291518000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.030771658666753686222134530000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.015504186535965253358272343000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.007782140442054949100825041000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.003898640415657322636221046000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.001951220131261749216850870000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000976085973055458892686544000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000488162079501351186957460000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000244110827527362687853374000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000122062862525677363338881000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000061033293680638525913091000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000030517112473186377476993000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000015258672648362398138404000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000007629365427567572417821000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000003814689989685889381171000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000001907346813825409407938000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000953673861659188260005000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000476837044516323000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000238418550679858000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000119209282445354000000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000059604642999033900000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000029802321943606100000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000014901161082825400000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000007450580569168250000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000003725290291523020000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000001862645147496230000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000931322574181798000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000465661287199319000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000232830643626765000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000116415321820159000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000058207660911773300000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000029103830456310200000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000014551915228261000000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000007275957614156960000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000003637978807085100000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000001818989403544200000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000909494701772515000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000454747350886361000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000227373675443206000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000113686837721610000
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000056843418860806400
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000028421709430403600
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000014210854715201900
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000007105427357600980
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000003552713678800490
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000001776356839400250
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000888178419700125
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000444089209850063
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000222044604925031
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000111022302462516
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000055511151231258
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000027755575615629
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000013877787807815
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000006938893903907
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000003469446951954
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000001734723475977
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000867361737988
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000433680868994
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000216840434497
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000108420217249
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000054210108624
    VSTR.f64 d2, [r1]
    ADD R1, R1, #8
    VMOV.f64 d2, #0.000000000000000000027105054312
    VSTR.f64 d2, [r1]
    B   algorithmb


EXIT:
    pop {r4-r8, pc}




.data
.balign 4
LookUp:     .skip   528 //Array for the lookuptable

Thanks in advance

0

There are 0 answers