RISC-V, float-Konstante in Register laden



  • Hallo, vielleicht hat jemand von euch eine Idee, warum das im Folgendem angegebene Programm nicht funktionieren könnte, und wie es stattdessen möglich wäre...

    .data
    .float 1.5
    .text
    main:
        fmv.d.x f16, zero
        fld f17, (.data)
        jal ra, my_sum
        j stop
    

    Fehlermeldung: AssemblerError: start1.s:6: Register f17 is not an integer register

    Nun ja, f17 ist ein float-Register und darin möchte in den konstanten Wert 1.5 laden.

    Ich nutze einen RISC-V Simulator: Venus für VS Code. Soweit ich weiß, ist RISC-V open source und eindeutig durchspezifiziert, ich kann mir gar nicht vorstellen, dass es dafür keine Lösung gäbe...



  • Noch eine Idee:

        addi        a0, zero, 1
        addi        a1, zero, 5
        addi        a2, zero, 1
        addi        a3, zero, 10
        fcvt.d.w    f16, a0
        fcvt.d.w    f17, a1
        fcvt.d.w    f18, a2
        fcvt.d.w    f19, a3
        start1:
        flt.s       a3, f17, f18
        beq         a2, a3, stop1
        fdiv.s      f17, f17, f19
        # fmv.s
        j           start1
        stop1:
        fadd.d      f16, f16, f17
    

    Ich könnte 5 und 10 in ein int-Register laden (intermediate). Dann move ich beide/alles in float-Registers. Anschließend rechne ich 5.0 geteilt durch 10.0. 0.5 addiere ich dann zu 1.0 und erhalte somit 1.5. Zumindest in der Theorie.

    Problem: Nach der Zeile fdiv.s f17, f17, f19 steht in f17 immer der Wert NaN... Warum?

    fdiv.d kennt er nicht, weil die int-Registers wohl 64-bit sind, die float-Registers wohl jedoch 32-bit.

    Hier https://five-embeddev.com/riscv-isa-manual/latest/f.html#sec:single-float-compute steht auch noch:
    FMADD.S multiplies the values in rs1 and rs2, adds the value in rs3,
    etwas von rs3 - was ist das? 😅



  • püschel

    Bitte sagt mir, was falsch ist. Ich bin mit meinem Latein am Ende. 😭

    Laut Debugger (der ist bei der VS Code-Erweiterung übrigens auch dabei) sieht alles gut aus, bis auf diese Zeile:
    fdiv.s f17, f17, f19.

    Danke für jeden Input.


Log in to reply