diff options
| author | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-08-28 22:25:56 +0200 |
|---|---|---|
| committer | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-12-05 16:02:49 +0100 |
| commit | ab03d3be21f229be8c28dba292d5da237a929a73 (patch) | |
| tree | 8bc53e3031f644532fec255bb392a90cd4ad59fb /arch/riscv/usr/float.S | |
| parent | 1a36e6211674f1a39c7cc0ddff705357a4add65a (diff) | |
| download | farga-ab03d3be21f229be8c28dba292d5da237a929a73.tar.gz farga-ab03d3be21f229be8c28dba292d5da237a929a73.zip | |
Restructure the whole thing
It will be something more than just messing around with RISC-V stuff.
Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
Diffstat (limited to 'arch/riscv/usr/float.S')
| -rw-r--r-- | arch/riscv/usr/float.S | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/riscv/usr/float.S b/arch/riscv/usr/float.S new file mode 100644 index 0000000..f481f3e --- /dev/null +++ b/arch/riscv/usr/float.S @@ -0,0 +1,40 @@ +.text +.globl greater_than_ten +.type greater_than_ten, @function + +// bool greater_than_ten(double a, uint64_t b); +greater_than_ten: + // Upon entry a -> fa0; and b -> a0. That is, the ABI increments the + //(f)a<n> register per argument type. + + // Change the rounding to "Rounds Towards Zero" (bits: 0b001). + li t0, 0b001 + fsrm t0 + + // Convert the second parameter to double. + fcvt.d.lu ft0, a0 + + // ret = a + b + fadd.d fa0, fa0, ft0 + + // ret = (ret * b) + b + fmv.d ft1, ft0 + fmadd.d fa0, fa0, ft0, ft1 + + // Now we need to compare the number with 10.0. There are multiple ways to + // load a floating point immediate: + // 1. Loading an integer immediate and then convert it into a double. This + // is discouraged on the RISC-V assembly manual. + // 2. Load a double with `fld` from a memory location on the data section. + // 3. Load a floating point immediate with `fli` (requires the `Zfa` + // extension). + // I don't have the `Zfa` extension on my board, so I'm opting for the + // second way. + fld ft1, .TEN, t0 + fle.d a0, ft1, fa0 + + ret + +.data +.TEN: + .double 10.0 |
