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);