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 Wert1.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 vonrs3
- 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.