spl

systems programming language
git clone http://frotz.net/git/spl.git
Log | Files | Refs | README | LICENSE

sr32.h (2130B)


      1 // Copyright 2025, Brian Swetland <swetland@frotz.net>
      2 // Licensed under the Apache License, Version 2.0.
      3 
      4 #pragma once
      5 #include <stdint.h>
      6 
      7 #define IR_ADD 0
      8 #define IR_SUB 1
      9 #define IR_AND 2
     10 #define IR_OR 3
     11 #define IR_XOR 4
     12 #define IR_SLL 5
     13 #define IR_SRL 6
     14 #define IR_SRA 7
     15 #define IR_SLT 8
     16 #define IR_SLTU 9
     17 #define IR_MUL 10
     18 #define IR_DIV 11
     19 #define IR_JALR 15
     20 
     21 #define B_BEQ 0
     22 #define B_BNE 1
     23 #define B_BLT 2
     24 #define B_BLTU 3
     25 #define B_BGE 4
     26 #define B_BGEU 5
     27 
     28 #define L_LDW 0
     29 #define L_LDH 1
     30 #define L_LDB 2
     31 #define L_LDX 3
     32 #define L_LUI 4
     33 #define L_LDHU 5
     34 #define L_LDBU 6
     35 #define L_AUIPC 7
     36 
     37 #define S_STW 0
     38 #define S_STH 1
     39 #define S_STB 2
     40 #define S_STX 3
     41 
     42 #define J_JAL 0
     43 #define J_SYSCALL 1
     44 #define J_BREAK 2
     45 #define J_SYSRET 3
     46 
     47 static inline uint32_t ins_i(uint32_t o, uint32_t t, uint32_t a, uint32_t i) {
     48 	return (i << 16) | ((a & 0x1F) << 11) | ((t & 0x1F) << 6) | (o & 0xF);
     49 }
     50 static inline uint32_t ins_r(uint32_t o, uint32_t t, uint32_t a, uint32_t b, uint32_t n) {
     51 	return ((n & 7) << 21) | ((b & 0x1F) << 16) | ((a & 0x1F) << 11) | ((t & 0x1F) << 6) | (o & 0xF) | 0x10;
     52 }
     53 static inline uint32_t ins_l(uint32_t o, uint32_t t, uint32_t a, uint32_t i) {
     54 	return (i << 16) | ((a & 0x1F) << 11) | ((t & 0x1F) << 6) | (o & 7) | 0x20;
     55 }
     56 static inline uint32_t ins_s(uint32_t o, uint32_t b, uint32_t a, uint32_t i) {
     57 	return (i << 16) | ((a & 0x1F) << 11) | ((b & 0x1F) << 6) | (o & 7) | 0x28;
     58 }
     59 static inline uint32_t ins_b(uint32_t o, uint32_t a, uint32_t b, uint32_t i) {
     60 	return (i << 16) | ((a & 0x1F) << 11) | ((b & 0x1F) << 6) | (o & 7) | 0x30;
     61 }
     62 static inline uint32_t ins_j(uint32_t o, uint32_t t, uint32_t i) {
     63 	return (i << 11) | ((t & 0x1F) << 6) | (o & 7) | 0x38;
     64 }
     65 
     66 static inline uint32_t get_i16(uint32_t ins) {
     67 	return ((int32_t) ins) >> 16;
     68 }
     69 static inline uint32_t get_i21(uint32_t ins) {
     70 	return ((int32_t) ins) >> 11;
     71 }
     72 static inline uint32_t get_rt(uint32_t ins) {
     73 	return (ins >> 6) & 0x1F;
     74 }
     75 static inline uint32_t get_ra(uint32_t ins) {
     76 	return (ins >> 11) & 0x1F;
     77 }
     78 static inline uint32_t get_rb(uint32_t ins) {
     79 	return (ins >> 16) & 0x1F;
     80 }
     81 
     82 void sr32dis(uint32_t pc, uint32_t ins, char *out);