// See LICENSE for license details.

#ifdef __riscv_flen

#if __riscv_flen != 64
# error single-float only is not supported
#endif

#define get_f32(which) fmv.x.s a0, which; jr t0
#define put_f32(which) fmv.s.x which, a0; jr t0
#if __riscv_xlen == 64
# define get_f64(which) fmv.x.d a0, which; jr t0
# define put_f64(which) fmv.d.x which, a0; jr t0
#else
# define get_f64(which) fsd which, 0(a0); jr t0
# define put_f64(which) fld which, 0(a0); jr t0
#endif

  .text
  .option norvc
  .globl get_f32_reg
  get_f32_reg:
    get_f32(f0)
    get_f32(f1)
    get_f32(f2)
    get_f32(f3)
    get_f32(f4)
    get_f32(f5)
    get_f32(f6)
    get_f32(f7)
    get_f32(f8)
    get_f32(f9)
    get_f32(f10)
    get_f32(f11)
    get_f32(f12)
    get_f32(f13)
    get_f32(f14)
    get_f32(f15)
    get_f32(f16)
    get_f32(f17)
    get_f32(f18)
    get_f32(f19)
    get_f32(f20)
    get_f32(f21)
    get_f32(f22)
    get_f32(f23)
    get_f32(f24)
    get_f32(f25)
    get_f32(f26)
    get_f32(f27)
    get_f32(f28)
    get_f32(f29)
    get_f32(f30)
    get_f32(f31)
  
  .text
  .globl put_f32_reg
  put_f32_reg:
    put_f32(f0)
    put_f32(f1)
    put_f32(f2)
    put_f32(f3)
    put_f32(f4)
    put_f32(f5)
    put_f32(f6)
    put_f32(f7)
    put_f32(f8)
    put_f32(f9)
    put_f32(f10)
    put_f32(f11)
    put_f32(f12)
    put_f32(f13)
    put_f32(f14)
    put_f32(f15)
    put_f32(f16)
    put_f32(f17)
    put_f32(f18)
    put_f32(f19)
    put_f32(f20)
    put_f32(f21)
    put_f32(f22)
    put_f32(f23)
    put_f32(f24)
    put_f32(f25)
    put_f32(f26)
    put_f32(f27)
    put_f32(f28)
    put_f32(f29)
    put_f32(f30)
    put_f32(f31)
  
  .text
  .globl get_f64_reg
  get_f64_reg:
    get_f64(f0)
    get_f64(f1)
    get_f64(f2)
    get_f64(f3)
    get_f64(f4)
    get_f64(f5)
    get_f64(f6)
    get_f64(f7)
    get_f64(f8)
    get_f64(f9)
    get_f64(f10)
    get_f64(f11)
    get_f64(f12)
    get_f64(f13)
    get_f64(f14)
    get_f64(f15)
    get_f64(f16)
    get_f64(f17)
    get_f64(f18)
    get_f64(f19)
    get_f64(f20)
    get_f64(f21)
    get_f64(f22)
    get_f64(f23)
    get_f64(f24)
    get_f64(f25)
    get_f64(f26)
    get_f64(f27)
    get_f64(f28)
    get_f64(f29)
    get_f64(f30)
    get_f64(f31)
  
  .text
  .globl put_f64_reg
  put_f64_reg:
    put_f64(f0)
    put_f64(f1)
    put_f64(f2)
    put_f64(f3)
    put_f64(f4)
    put_f64(f5)
    put_f64(f6)
    put_f64(f7)
    put_f64(f8)
    put_f64(f9)
    put_f64(f10)
    put_f64(f11)
    put_f64(f12)
    put_f64(f13)
    put_f64(f14)
    put_f64(f15)
    put_f64(f16)
    put_f64(f17)
    put_f64(f18)
    put_f64(f19)
    put_f64(f20)
    put_f64(f21)
    put_f64(f22)
    put_f64(f23)
    put_f64(f24)
    put_f64(f25)
    put_f64(f26)
    put_f64(f27)
    put_f64(f28)
    put_f64(f29)
    put_f64(f30)
    put_f64(f31)

#endif
