code wiki / (root) / nx_riscv.nx

nx_riscv.nx

buildroot/runtime/nx_riscv.nx

106471 B2821 linesdepth 4pulls 6 transitivereach 23 importersview sourcekind librarytopic riscv
docsdependenciesstructsconstsfunctions

about

riscv.nx -- RV64 codegen backend, in NishiLang. Takes a Function + its ValueLoc table and emits RV64 assembly text to an output buffer. Pairs with regalloc.nx and ir.nx. Scope: the opcodes our benchmarks emit. Full backend parity is mechanical extension of the switch statement. Output format: raw asm text, same as riscv.c emits today, so the output of this NishiLang codegen is byte-compatible with gcc `as` (verified at compile time by reading its IR output).

dependencies 4 imports · 11 importers

nx_syscalls.nx nx_types.nx nx_ir.nx nx_outbuf.nx nx_riscv.nx nx_main.nx nx_nxc.nx nx_smoke_nxc_pipeline.nx nx_smoke_nxc_pipeline10.nx nx_smoke_nxc_pipeline2.nx nx_smoke_nxc_pipeline7.nx nx_smoke_nxc_pipeline8.nx nx_smoke_nxc_pipeline9.nx nx_smoke_nxc_tilde.nx nxc.nx

diagram shows first 10 each side; +0 more imports, +1 more importers in the complete lists below.

imports: nx_syscalls.nxnx_types.nxnx_ir.nxnx_outbuf.nx

imported by: nx_main.nxnx_nxc.nxnx_smoke_nxc_pipeline.nxnx_smoke_nxc_pipeline10.nxnx_smoke_nxc_pipeline2.nxnx_smoke_nxc_pipeline7.nxnx_smoke_nxc_pipeline8.nxnx_smoke_nxc_pipeline9.nxnx_smoke_nxc_tilde.nxnxc.nxriscv.nx

structs

none

consts

none

functions

50func loc_at(locs: *ValueLoc, id: i64) -> *ValueLoc {
70func reg_name(o: *OutBuf, idx: i64) -> i64 {
157func fits_imm12(off: i64) -> i64 {
164func emit_sp_adjust(o: *OutBuf, off: i64) -> i64 {
180func emit_sp_ld(o: *OutBuf, dst: *u8, off: i64) -> i64 {
203func sp_is_reg(name: *u8, a: i64, b: i64) -> i64 {
called by 1: emit_sp_sd
224func emit_sp_sd(o: *OutBuf, src: *u8, off: i64) -> i64 {
256func emit_sp_addi(o: *OutBuf, dst: *u8, off: i64) -> i64 {
293func emit_sp_flw(o: *OutBuf, dst: *u8, off: i64) -> i64 {
312func emit_sp_fsw(o: *OutBuf, src: *u8, off: i64) -> i64 {
336func emit_sp_fld(o: *OutBuf, dst: *u8, off: i64) -> i64 {
355func emit_sp_fsd(o: *OutBuf, src: *u8, off: i64) -> i64 {
380func emit_fbinop_mnem(o: *OutBuf, op: i64, is_double: i64) -> i64 {
called by 2: rv_emit_fbinopmain calls 1: out_str
411func emit_binop_mnem(o: *OutBuf, op: i64) -> i64 {
called by 1: rv_emit_binop calls 1: out_str
437func materialise(f: *Function, locs: *ValueLoc, o: *OutBuf,
513func materialise_value(f: *Function, locs: *ValueLoc, o: *OutBuf,
603func fmaterialise(f: *Function, locs: *ValueLoc, o: *OutBuf,
661func rv_emit_fbinop(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
708func emit_vbinop_mnem(o: *OutBuf, op: i64) -> i64 {
called by 2: rv_emit_vbinopmain calls 1: out_str
734func rv_emit_vbinop(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
757func rv_emit_binop(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
815func popcount(x: i64) -> i64 {
called by 1: emit_function
833func emit_save_gpr(o: *OutBuf, mask: i64, save_base: i64,
867func emit_restore_gpr(o: *OutBuf, mask: i64, save_base: i64) -> i64 {
called by 1: emit_function calls 2: sys_mmapemit_sp_ld
908func emit_save_fpr(o: *OutBuf, mask: i64, save_base: i64,
945func emit_restore_fpr(o: *OutBuf, mask: i64, save_base: i64) -> i64 {
982func rv_emit_return(f: *Function, locs: *ValueLoc, o: *OutBuf,
1033func emit_branch(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr,
1078func rv_emit_fcmp(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, is_d: i64) -> i64 {
1138func rv_emit_cmp(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1224func target_reg_name(o: *OutBuf, k: i64) -> i64 {
1233func target_freg_name(o: *OutBuf, k: i64) -> i64 {
1239func rv_emit_call(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1360func rv_emit_call_indirect(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1469func load_mnem_name(o: *OutBuf, sz: i64, is_signed: i64) -> i64 {
called by 1: rv_emit_load calls 1: out_str
1486func store_mnem_name(o: *OutBuf, sz: i64) -> i64 {
called by 1: rv_emit_store calls 1: out_str
1495func type_kind_is_signed(k: i64) -> i64 {
1503func rv_emit_load(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1530func rv_emit_addr_of(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1544func rv_emit_store(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1565func rv_emit_gep(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1607func rv_emit_tail_call(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr,
1664func rv_emit_fcast(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1724func compute_alloca_offsets(f: *Function, spill_bytes: i64,
called by 1: emit_function calls 1: block_at
1761func rv_emit_alloca(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr,
1803func rv_emit_simd_vdot_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1878func rv_emit_simd_vreduce_minmax_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, is_max: i64) -> i64 {
1914func rv_emit_simd_vbinop_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, enc_word: i64) -> i64 {
1939func rv_emit_simd_vsadd_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
1956func rv_emit_simd_vshift_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, enc_word: i64) -> i64 {
1989func rv_emit_simd_vreduce_sum_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2021func rv_emit_simd_vbroadcast_i16(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2046func rv_emit_simd_vbinop_i8(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, enc_word: i64) -> i64 {
2075func rv_emit_simd_vreduce_sum_i8(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2108func rv_emit_simd_vbroadcast_i8(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2131func rv_emit_simd_vbinop_i32(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, enc_word: i64) -> i64 {
2159func rv_emit_simd_vreduce_sum_i32(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2189func rv_emit_simd_vbroadcast_i32(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2210func rv_emit_simd_vbinop_i64(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr, enc_word: i64) -> i64 {
2236func rv_emit_simd_vreduce_sum_i64(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2257func rv_emit_simd_vbroadcast_i64(f: *Function, locs: *ValueLoc, o: *OutBuf, i: *Instr) -> i64 {
2277func emit_instr(f: *Function, locs: *ValueLoc, o: *OutBuf,
2578func emit_function(f: *Function, locs: *ValueLoc, o: *OutBuf,
2812func emit_return_instr(bb: *BasicBlock, v: i64) -> i64 {