infix
A JIT-Powered FFI Library for C
Loading...
Searching...
No Matches
abi_riscv64_emitters.c File Reference

Emits single RISC-V (RV64GC) instructions into a code_buffer. More...

#include "arch/riscv/abi_riscv64_emitters.h"
#include "arch/riscv/abi_riscv64_common.h"
#include <limits.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
Include dependency graph for abi_riscv64_emitters.c:

Functions

static uint32_t rv_sx_imm12 (int32_t imm)
 
static uint32_t rv_imm20 (uint32_t imm)
 
static uint32_t rv_enc_r (uint32_t funct7, uint8_t rs2, uint8_t rs1, uint32_t funct3, uint8_t rd, uint32_t opcode)
 
static uint32_t rv_enc_i (uint32_t imm12, uint8_t rs1, uint32_t funct3, uint8_t rd, uint32_t opcode)
 
static uint32_t rv_enc_s (uint32_t imm12, uint8_t rs2, uint8_t rs1, uint32_t funct3, uint32_t opcode)
 
static uint32_t rv_enc_b (uint32_t imm13, uint8_t rs2, uint8_t rs1, uint32_t funct3, uint32_t opcode)
 
static uint32_t rv_enc_u (uint32_t imm20, uint8_t rd, uint32_t opcode)
 
static uint32_t rv_enc_j (uint32_t imm21, uint8_t rd, uint32_t opcode)
 
static uint32_t rv_enc_shift (uint32_t funct6, uint8_t shamt, uint8_t rs1, uint32_t funct3, uint8_t rd)
 
static void rv_emit (code_buffer *buf, uint32_t word)
 
void infix_riscv64_emit_addi (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm)
 
void infix_riscv64_emit_addiw (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm)
 
void infix_riscv64_emit_add (code_buffer *buf, uint8_t rd, uint8_t rs1, uint8_t rs2)
 
void infix_riscv64_emit_sub (code_buffer *buf, uint8_t rd, uint8_t rs1, uint8_t rs2)
 
void infix_riscv64_emit_slli (code_buffer *buf, uint8_t rd, uint8_t rs1, uint8_t shamt)
 
void infix_riscv64_emit_srli (code_buffer *buf, uint8_t rd, uint8_t rs1, uint8_t shamt)
 
void infix_riscv64_emit_lui (code_buffer *buf, uint8_t rd, uint32_t imm20)
 
void infix_riscv64_emit_auipc (code_buffer *buf, uint8_t rd, uint32_t imm20)
 
void infix_riscv64_emit_jal (code_buffer *buf, uint8_t rd, int32_t imm20)
 
void infix_riscv64_emit_jalr (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_beq (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_bne (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_ld (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lw (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lwu (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lb (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lbu (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lh (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_lhu (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_sd (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_sw (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_sb (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_sh (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_fld (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_fsd (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_flw (code_buffer *buf, uint8_t rd, uint8_t rs1, int32_t imm12)
 
void infix_riscv64_emit_fsw (code_buffer *buf, uint8_t rs1, uint8_t rs2, int32_t imm12)
 
void infix_riscv64_emit_fmv_d (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_fmv_s (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_fmv_w_x (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_fmv_x_w (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_fcvt_d_s (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_fcvt_s_d (code_buffer *buf, uint8_t rd, uint8_t rs1)
 
void infix_riscv64_emit_ebreak (code_buffer *buf)
 
void infix_riscv64_emit_load_u64_immediate (code_buffer *buf, uint8_t rd, uint64_t imm)
 

Detailed Description

Emits single RISC-V (RV64GC) instructions into a code_buffer.

Copyright (c) 2026 Sanko Robinson

This source code is dual-licensed under the Artistic License 2.0 or the MIT License. You may choose to use this code under the terms of either license.

SPDX-License-Identifier: (Artistic-2.0 OR MIT)

The documentation blocks within this file are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).

SPDX-License-Identifier: CC-BY-4.0

Function Documentation

◆ infix_riscv64_emit_add()

void infix_riscv64_emit_add ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
uint8_t  rs2 
)

◆ infix_riscv64_emit_addi()

void infix_riscv64_emit_addi ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm 
)

◆ infix_riscv64_emit_addiw()

void infix_riscv64_emit_addiw ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm 
)

◆ infix_riscv64_emit_auipc()

void infix_riscv64_emit_auipc ( code_buffer buf,
uint8_t  rd,
uint32_t  imm20 
)

◆ infix_riscv64_emit_beq()

void infix_riscv64_emit_beq ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_bne()

void infix_riscv64_emit_bne ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_ebreak()

void infix_riscv64_emit_ebreak ( code_buffer buf)

◆ infix_riscv64_emit_fcvt_d_s()

void infix_riscv64_emit_fcvt_d_s ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fcvt_s_d()

void infix_riscv64_emit_fcvt_s_d ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fld()

void infix_riscv64_emit_fld ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_flw()

void infix_riscv64_emit_flw ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_fmv_d()

void infix_riscv64_emit_fmv_d ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fmv_s()

void infix_riscv64_emit_fmv_s ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fmv_w_x()

void infix_riscv64_emit_fmv_w_x ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fmv_x_w()

void infix_riscv64_emit_fmv_x_w ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1 
)

◆ infix_riscv64_emit_fsd()

void infix_riscv64_emit_fsd ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_fsw()

void infix_riscv64_emit_fsw ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_jal()

void infix_riscv64_emit_jal ( code_buffer buf,
uint8_t  rd,
int32_t  imm20 
)

◆ infix_riscv64_emit_jalr()

void infix_riscv64_emit_jalr ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_lb()

void infix_riscv64_emit_lb ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_lbu()

void infix_riscv64_emit_lbu ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_ld()

void infix_riscv64_emit_ld ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_lh()

void infix_riscv64_emit_lh ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_lhu()

void infix_riscv64_emit_lhu ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_load_u64_immediate()

void infix_riscv64_emit_load_u64_immediate ( code_buffer buf,
uint8_t  rd,
uint64_t  imm 
)

◆ infix_riscv64_emit_lui()

void infix_riscv64_emit_lui ( code_buffer buf,
uint8_t  rd,
uint32_t  imm20 
)

◆ infix_riscv64_emit_lw()

void infix_riscv64_emit_lw ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_lwu()

void infix_riscv64_emit_lwu ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
int32_t  imm12 
)

◆ infix_riscv64_emit_sb()

void infix_riscv64_emit_sb ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_sd()

void infix_riscv64_emit_sd ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_sh()

void infix_riscv64_emit_sh ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ infix_riscv64_emit_slli()

void infix_riscv64_emit_slli ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
uint8_t  shamt 
)

◆ infix_riscv64_emit_srli()

void infix_riscv64_emit_srli ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
uint8_t  shamt 
)

◆ infix_riscv64_emit_sub()

void infix_riscv64_emit_sub ( code_buffer buf,
uint8_t  rd,
uint8_t  rs1,
uint8_t  rs2 
)

◆ infix_riscv64_emit_sw()

void infix_riscv64_emit_sw ( code_buffer buf,
uint8_t  rs1,
uint8_t  rs2,
int32_t  imm12 
)

◆ rv_emit()

static void rv_emit ( code_buffer buf,
uint32_t  word 
)
inlinestatic

◆ rv_enc_b()

static uint32_t rv_enc_b ( uint32_t  imm13,
uint8_t  rs2,
uint8_t  rs1,
uint32_t  funct3,
uint32_t  opcode 
)
inlinestatic

◆ rv_enc_i()

static uint32_t rv_enc_i ( uint32_t  imm12,
uint8_t  rs1,
uint32_t  funct3,
uint8_t  rd,
uint32_t  opcode 
)
inlinestatic

◆ rv_enc_j()

static uint32_t rv_enc_j ( uint32_t  imm21,
uint8_t  rd,
uint32_t  opcode 
)
inlinestatic

◆ rv_enc_r()

static uint32_t rv_enc_r ( uint32_t  funct7,
uint8_t  rs2,
uint8_t  rs1,
uint32_t  funct3,
uint8_t  rd,
uint32_t  opcode 
)
inlinestatic

◆ rv_enc_s()

static uint32_t rv_enc_s ( uint32_t  imm12,
uint8_t  rs2,
uint8_t  rs1,
uint32_t  funct3,
uint32_t  opcode 
)
inlinestatic

◆ rv_enc_shift()

static uint32_t rv_enc_shift ( uint32_t  funct6,
uint8_t  shamt,
uint8_t  rs1,
uint32_t  funct3,
uint8_t  rd 
)
inlinestatic

◆ rv_enc_u()

static uint32_t rv_enc_u ( uint32_t  imm20,
uint8_t  rd,
uint32_t  opcode 
)
inlinestatic

◆ rv_imm20()

static uint32_t rv_imm20 ( uint32_t  imm)
inlinestatic

◆ rv_sx_imm12()

static uint32_t rv_sx_imm12 ( int32_t  imm)
inlinestatic