52 uint32_t reg_addr = addr;
53 uint32_t reg_data = wdata;
54 asm volatile (
"sw %[da], 0(%[ad])" : : [da]
"r" (reg_data), [ad]
"r" (reg_addr));
68 uint32_t reg_addr = addr;
69 uint32_t reg_data = (uint32_t)wdata;
70 asm volatile (
"sh %[da], 0(%[ad])" : : [da]
"r" (reg_data), [ad]
"r" (reg_addr));
82 uint32_t reg_addr = addr;
83 uint32_t reg_data = (uint32_t)wdata;
84 asm volatile (
"sb %[da], 0(%[ad])" : : [da]
"r" (reg_data), [ad]
"r" (reg_addr));
98 uint32_t reg_addr = addr;
100 asm volatile (
"lw %[da], 0(%[ad])" : [da]
"=r" (reg_data) : [ad]
"r" (reg_addr));
115 uint32_t reg_addr = addr;
117 asm volatile (
"lhu %[da], 0(%[ad])" : [da]
"=r" (reg_data) : [ad]
"r" (reg_addr));
132 uint32_t reg_addr = addr;
134 asm volatile (
"lh %[da], 0(%[ad])" : [da]
"=r" (reg_data) : [ad]
"r" (reg_addr));
147 uint32_t reg_addr = addr;
149 asm volatile (
"lbu %[da], 0(%[ad])" : [da]
"=r" (reg_data) : [ad]
"r" (reg_addr));
162 uint32_t reg_addr = addr;
164 asm volatile (
"lb %[da], 0(%[ad])" : [da]
"=r" (reg_data) : [ad]
"r" (reg_addr));
183 asm volatile (
"csrr %[dst], %[id]" : [dst]
"=r" (csr_data) : [id]
"i" (csr_id));
196 uint32_t csr_data = data;
197 asm volatile (
"csrw %[id], %[src]" : : [id]
"i" (csr_id), [src]
"r" (csr_data));
209 uint32_t csr_data = mask;
210 asm volatile (
"csrs %[id], %[src]" : : [id]
"i" (csr_id), [src]
"r" (csr_data));
222 uint32_t csr_data = mask;
223 asm volatile (
"csrc %[id], %[src]" : : [id]
"i" (csr_id), [src]
"r" (csr_data));
242 asm volatile (
"csrrw %[dst], %[id], %[src]" : [dst]
"=r" (tmp) : [id]
"i" (csr_id), [src]
"r" (wdata));
258#if defined __riscv_atomic
259 uint32_t amo_addr = addr;
262 asm volatile (
"lr.w %[dst], 0(%[addr])" : [dst]
"=r" (amo_rdata) : [addr]
"r" (amo_addr));
283inline uint32_t __attribute__ ((always_inline))
neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
285#if defined __riscv_atomic
286 uint32_t amo_addr = addr;
287 uint32_t amo_wdata = wdata;
290 asm volatile (
"sc.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_status) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
314#if defined __riscv_atomic
315 uint32_t amo_addr = addr;
316 uint32_t amo_wdata = wdata;
319 asm volatile (
"amoswap.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
343#if defined __riscv_atomic
344 uint32_t amo_addr = addr;
345 uint32_t amo_wdata = wdata;
348 asm volatile (
"amoadd.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
372#if defined __riscv_atomic
373 uint32_t amo_addr = addr;
374 uint32_t amo_wdata = wdata;
377 asm volatile (
"amoxor.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
401#if defined __riscv_atomic
402 uint32_t amo_addr = addr;
403 uint32_t amo_wdata = wdata;
406 asm volatile (
"amoand.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
428inline uint32_t __attribute__ ((always_inline))
neorv32_cpu_amoor(uint32_t addr, uint32_t wdata) {
430#if defined __riscv_atomic
431 uint32_t amo_addr = addr;
432 uint32_t amo_wdata = wdata;
435 asm volatile (
"amoor.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
459#if defined __riscv_atomic
460 uint32_t amo_addr = addr;
461 uint32_t amo_wdata = wdata;
464 asm volatile (
"amomin.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
488#if defined __riscv_atomic
489 uint32_t amo_addr = addr;
490 uint32_t amo_wdata = wdata;
493 asm volatile (
"amomax.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
517#if defined __riscv_atomic
518 uint32_t amo_addr = addr;
519 uint32_t amo_wdata = wdata;
522 asm volatile (
"amominu.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
546#if defined __riscv_atomic
547 uint32_t amo_addr = addr;
548 uint32_t amo_wdata = wdata;
551 asm volatile (
"amomaxu.w %[dst], %[src], (%[addr])" : [dst]
"=r" (amo_rdata) : [src]
"r" (amo_wdata), [addr]
"r" (amo_addr));
576 asm volatile (
"wfi");
void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:50
uint32_t neorv32_cpu_amoxor(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:370
void neorv32_cpu_set_mcycle(uint64_t value)
Definition neorv32_cpu.c:69
void neorv32_cpu_csr_set(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:207
uint32_t neorv32_cpu_pmp_get_num_regions(void)
Definition neorv32_cpu.c:130
void neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata)
Definition neorv32_cpu.h:66
int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:160
uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:113
uint64_t neorv32_cpu_get_instret(void)
Definition neorv32_cpu.c:86
uint32_t neorv32_cpu_load_unsigned_word(uint32_t addr)
Definition neorv32_cpu.h:96
uint32_t neorv32_cpu_amoand(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:399
void neorv32_cpu_set_minstret(uint64_t value)
Definition neorv32_cpu.c:111
uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:283
uint32_t neorv32_cpu_amominu(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:515
uint32_t neorv32_cpu_hpm_get_num_counters(void)
Definition neorv32_cpu.c:282
void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:574
uint32_t neorv32_cpu_amoadd(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:341
uint32_t neorv32_cpu_amoor(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:428
int neorv32_cpu_pmp_configure_region(int index, uint32_t addr, uint8_t config)
Definition neorv32_cpu.c:214
int neorv32_cpu_hwtrig_get_number(void)
Definition neorv32_cpu.c:374
uint32_t neorv32_cpu_amoswap(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:312
uint32_t neorv32_cpu_csr_read(const int csr_id)
Definition neorv32_cpu.h:180
uint32_t neorv32_cpu_amomax(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:486
uint32_t neorv32_cpu_amomin(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:457
void neorv32_cpu_csr_clr(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:220
uint64_t neorv32_cpu_get_cycle(void)
Definition neorv32_cpu.c:44
uint8_t neorv32_cpu_load_unsigned_byte(uint32_t addr)
Definition neorv32_cpu.h:145
uint32_t neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata)
Definition neorv32_cpu.h:239
uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:256
uint32_t neorv32_cpu_pmp_get_granularity(void)
Definition neorv32_cpu.c:174
uint32_t neorv32_cpu_hpm_get_size(void)
Definition neorv32_cpu.c:334
uint32_t neorv32_cpu_amomaxu(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:544
int16_t neorv32_cpu_load_signed_half(uint32_t addr)
Definition neorv32_cpu.h:130
void neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata)
Definition neorv32_cpu.h:80
void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:194