; Directives
equ	F8000000		; <31-28> = F is directive flag
org	F8010000		; <27> indicates can redefine label
origin	F8010000		; <26> indicates can define non-label
align	F8020000
def	F8030000
record	F8040000
structure F8040000
struct	F8040000
rec_align	F8050000
struct_align	F8050000

alias	F8100000		; Encodes size of operation
byte	F8110000
halfword F8120000
half	F8120000
word	F8140000
double	F8180000
doubleword F8180000

rn	F4000000
cn	F4010000
cp	F4020000

defb	F0000000
dcb	F0000000
defh	F0010000
dcw	F0010000
defw	F0020000
dcd	F0020000
defs	F0030000
export	F0040000
include	F0050000
get	F0050000
literal	F0060000
literals F0060000
pool	F0060000
ltorg	F0060000
arch	F0070000
architecture F0070000
entry	F0080000
arm	F0090000
thumb	F00A0000
set	F00B0000
define	F00B0000
if	F00C0000
endif	F00D0000
fi	F00D0000
else	F00E0000
import	F00F0000

; ** Incomplete description **
; <27:25> func3 bits (if appropriate)  [Bits 14:12]
; <24:20> Primary op. code             [Bits 6:2]
; <19:16> Primary mnemonic classifier
; <15>    Variable length flag   ** maybe determine by classifier? **
; <14:8>  Sometimes secondary op. code [Bits 31:25]

lui	00D00000	; U-type
auipc	00500000	; U-type

jal	01B10000	; J-type

jalr	01950000	; I-type, load syntax

lb	00058000	; I-type, load syntax
lh	02058000	; I-type, load syntax
lw	04058000	; I-type, load syntax
lbu	08058000	; I-type, load syntax
lhu	0A058000	; I-type, load syntax

lwu	0C058000	; RV64I
ld	06058000	; RV64I

addi	00420000	; I-type
subi	10420000	; I-type (alternate code)
slti	04420000	; I-type
sltiu	06420000	; I-type
xori	08420000	; I-type
ori	0C420000	; I-type
andi	0E420000	; I-type
slli	02420000	; I-type (ish)
srli	0A420000	; I-type (ish)
srai	0A422000	; I-type (ish)

addiw   00620000	; RV64I

beq	01830000	; B-type
bne	03830000	; B-type
blt	09830000	; B-type
bge	0B830000	; B-type
bltu	0D830000	; B-type
bgeu	0F830000	; B-type

sb	00848000	; S-type
sh	02848000	; S-type
sw	04848000	; S-type

sd	06848000	; RV64I

add	00C60000	; R-type
sub	00C62000	; R-type
sll	02C60000	; R-type
slt	04C60000	; R-type
sltu	06C60000	; R-type
xor	08C60000	; R-type
srl	0AC60000	; R-type
sra	0AC62000	; R-type
or	0CC60000	; R-type
and	0EC60000	; R-type

slliw	02620000	; RV64I
srliw	0A620000	; RV64I
sraiw	0A622000	; RV64I
addw	00E60000	; RV64I
subw	00E62000	; RV64I
sllw	02E60000	; RV64I
srlw	0AE60000	; RV64I
sraw	0AE62000	; RV64I

fence	00080000	; 
fence.i	02080000	; May need extension
ecall	00070000	; 
ebreak	00170000	; 

uret	00270000
sret	10270000
mret	30270000
wfi	10570000

csrrw	03CA0000	; I-type (ish)
csrrs	05CA0000	; I-type (ish)
csrrc	07CA0000	; I-type (ish)
csrrwi	1BCA0000	; I-type (ish)
csrrsi	1DCA0000	; I-type (ish)
csrrci	1FCA0000	; I-type (ish)

mul	00C60100	; RV32M
mulh	02C60100	; RV32M
mulhsu	04C60100	; RV32M
mulhu	06C60100	; RV32M
div	08C60100	; RV32M
divu	0AC60100	; RV32M
rem	0CC60100	; RV32M
remu	0EC60100	; RV32M

mulw	00E60100	; RV64M
divw	08E60100	; RV64M
divuw	0AE60100	; RV64M
remw	0CE60100	; RV64M
remuw	0EE60100	; RV64M


lr.w		008C0000	; RV32A
lr.w.aq		00AC0000	; Lazy approach
lr.w.rl		009C0000	; but easy way of coping
lr.w.rl.aq	00BC0000
lr.w.aq.rl	00BC0000
sc.w		00CC0000
sc.w.aq		00EC0000
sc.w.rl		00DC0000
sc.w.rl.aq	00FC0000
sc.w.aq.rl	00FC0000
amoswap.w 	004C0000
amoswap.w.aq 	006C0000
amoswap.w.rl 	005C0000
amoswap.w.rl.aq	007C0000
amoswap.w.aq.rl	007C0000
amoadd.w  	000C0000
amoadd.w.aq	002C0000
amoadd.w.rl	001C0000
amoadd.w.rl.aq	003C0000
amoadd.w.aq.rl	003C0000
amoxor.w	010C0000
amoxor.w.aq	012C0000
amoxor.w.rl	011C0000
amoxor.w.rl.aq	013C0000
amoxor.w.aq.rl	013C0000
amoand.w	030C0000
amoand.w.aq	032C0000
amoand.w.rl	031C0000
amoand.w.rl.aq	033C0000
amoand.w.aq.rl	033C0000
amoor.w		020C0000
amoor.w.aq	022C0000
amoor.w.rl	021C0000
amoor.w.rl.aq	023C0000
amoor.w.aq.rl	023C0000
amomin.w	040C0000
amomin.w.aq	042C0000
amomin.w.rl	041C0000
amomin.w.rl.aq	043C0000
amomin.w.aq.rl	043C0000
amomax.w	050C0000
amomax.w.aq	052C0000
amomax.w.rl	051C0000
amomax.w.rl.aq	053C0000
amomax.w.aq.rl	053C0000
amominu.w	060C0000
amominu.w.aq	062C0000
amominu.w.rl	061C0000
amominu.w.rl.aq	063C0000
amominu.w.aq.rl	063C0000
amomaxu.w	070C0000
amomaxu.w.aq	072C0000
amomaxu.w.rl	071C0000
amomaxu.w.rl.aq	073C0000
amomaxu.w.aq.rl	073C0000

lr.d		088C0000	; RV64A
lr.d.aq		08AC0000
lr.d.rl		089C0000
lr.d.rl.aq	08BC0000
lr.d.aq.rl	08BC0000
sc.d		08CC0000
sc.d.aq		08EC0000
sc.d.rl		08DC0000
sc.d.rl.aq	08FC0000
sc.d.aq.rl	08FC0000
amoswap.d 	084C0000
amoswap.d.aq 	086C0000
amoswap.d.rl 	085C0000
amoswap.d.rl.aq	087C0000
amoswap.d.aq.rl	087C0000
amoadd.d  	080C0000
amoadd.d.aq	082C0000
amoadd.d.rl	081C0000
amoadd.d.rl.aq	083C0000
amoadd.d.aq.rl	083C0000
amoxor.d	090C0000
amoxor.d.aq	092C0000
amoxor.d.rl	091C0000
amoxor.d.rl.aq	093C0000
amoxor.d.aq.rl	093C0000
amoand.d	0B0C0000
amoand.d.aq	0B2C0000
amoand.d.rl	0B1C0000
amoand.d.rl.aq	0B3C0000
amoand.d.aq.rl	0B3C0000
amoor.d		0A0C0000
amoor.d.aq	0A2C0000
amoor.d.rl	0A1C0000
amoor.d.rl.aq	0A3C0000
amoor.d.aq.rl	0A3C0000
amomin.d	0C0C0000
amomin.d.aq	0C2C0000
amomin.d.rl	0C1C0000
amomin.d.rl.aq	0C3C0000
amomin.d.aq.rl	0C3C0000
amomax.d	0D0C0000
amomax.d.aq	0D2C0000
amomax.d.rl	0D1C0000
amomax.d.rl.aq	0D3C0000
amomax.d.aq.rl	0D3C0000
amominu.d	0E0C0000
amominu.d.aq	0E2C0000
amominu.d.rl	0E1C0000
amominu.d.rl.aq	0E3C0000
amominu.d.aq.rl	0E3C0000
amomaxu.d	0F0C0000
amomaxu.d.aq	0F2C0000
amomaxu.d.rl	0F1C0000
amomaxu.d.rl.aq	0F3C0000
amomaxu.d.aq.rl	0F3C0000

li	000B8000	; Pseudo-instructions
la	000B9000
lla	000B9000

call	021BA000
tail	006BA000

nop     00090000
ret     10090000
illegal 20090000
jr      00190000
j	00290000

mv	00390000
not	10390000
neg	20390000
negw	30390000
sext.w	40390000
seqz	50390000
snez	60390000
sltz	70390000
sgtz	80390000

beqz	00490000
bnez	02490000
blez	0B490000
bgez	0A490000
bltz	08490000
bgtz	09490000

bgt	19830000	; This subset mapped with
ble	1B830000	; 'normal' branches
bgtu	1D830000
bleu	1F830000

csrr	24590000
csrw	02590000
csrs	04590000
csrc	06590000
csrwi	1A590000
csrsi	1C590000
csrci	1E590000


rdinstret C0692200	; Fields unfortunate!
rdcycle   C0690200
rdtime    C0691200

rdinstreth C8692200
rdcycleh   C8690200
rdtimeh	   C8691200

frcsr	00693200
frrm	00692200
frflags	00691200
fscsr	00693100
fsrm	00692100
fsflags	00691100

;fmv.s rd, rs		fsgnj.s rd, rs, rs		
;fabs.s rd, rs		fsgnjx.s rd, rs, rs		
;fneg.s rd, rs		fsgnjn.s rd, rs, rs		
;fmv.d rd, rs		fsgnj.d rd, rs, rs		
;fabs.d rd, rs		fsgnjx.d rd, rs, rs		
;fneg.d rd, rs		fsgnjn.d rd, rs, rs		


USTATUS		00000001	; CSR addresses
FFLAGS		00100001
FRM		00200001
FCSR		00300001
UIE		00400001
UTVEC		00500001

USCRATCH	04000001
UEPC		04100001
UCAUSE		04200001
UTVAL		04300001
UIP		04400001

SSTATUS		10000001
SEDELEG		10200001
SIDELEG		10300001
SIE		10400001
STVEC		10500001
SCOUNTEREN	10600001

SSCRATCH	14000001
SEPC		14100001
SCAUSE		14200001
STVAL		14300001
SIP		14400001

SAT		18000001

MSTATUS		30000001
MISA		30100001
MEDELEG		30200001
MIDELEG		30300001
MIE		30400001
MTVEC		30500001
MCOUNTEREN	30600001

MCOUNTINHIBIT	32000001
MHPMEVENT3	32300001
MHPMEVENT4	32400001
MHPMEVENT5	32500001
MHPMEVENT6	32600001
MHPMEVENT7	32700001
MHPMEVENT8	32800001
MHPMEVENT9	32900001
MHPMEVENT10	32A00001
MHPMEVENT11	32B00001
MHPMEVENT12	32C00001
MHPMEVENT13	32D00001
MHPMEVENT14	32E00001
MHPMEVENT15	32F00001
MHPMEVENT16	33000001
MHPMEVENT17	33100001
MHPMEVENT18	33200001
MHPMEVENT19	33300001
MHPMEVENT20	33400001
MHPMEVENT21	33500001
MHPMEVENT22	33600001
MHPMEVENT23	33700001
MHPMEVENT24	33800001
MHPMEVENT25	33900001
MHPMEVENT26	33A00001
MHPMEVENT27	33B00001
MHPMEVENT28	33C00001
MHPMEVENT29	33D00001
MHPMEVENT30	33E00001
MHPMEVENT31	33F00001

MSCRATCH	34000001
MEPC		34100001
MCAUSE		34200001
MTVAL		34300001
MIP		34400001

PMPCFG0		3A000001
PMPCFG1		3A100001
PMPCFG2		3A200001
PMPCFG3		3A300001
PMPADDR0	3B000001
PMPADDR1	3B100001
PMPADDR2	3B200001
PMPADDR3	3B300001
PMPADDR4	3B400001
PMPADDR5	3B500001
PMPADDR6	3B600001
PMPADDR7	3B700001
PMPADDR8	3B800001
PMPADDR9	3B900001
PMPADDR10	3BA00001
PMPADDR11	3BB00001
PMPADDR12	3BC00001
PMPADDR13	3BD00001
PMPADDR14	3BE00001
PMPADDR15	3BF00001

TSELECT		7A000001
TDATA1		7A100001
TDATA2		7A200001
TDATA3		7A300001

DCSR		7B000001
DPC		7B100001
DSCRATCH0	7B200001
DSCRATCH1	7B300001

MCYCLE		B0000001
MINSTRET	B0200001
MHPMCOUNTER3	B0300001
MHPMCOUNTER4	B0400001
MHPMCOUNTER5	B0500001
MHPMCOUNTER6	B0600001
MHPMCOUNTER7	B0700001
MHPMCOUNTER8	B0800001
MHPMCOUNTER9	B0900001
MHPMCOUNTER10	B0A00001
MHPMCOUNTER11	B0B00001
MHPMCOUNTER12	B0C00001
MHPMCOUNTER13	B0D00001
MHPMCOUNTER14	B0E00001
MHPMCOUNTER15	B0F00001
MHPMCOUNTER16	B1000001
MHPMCOUNTER17	B1100001
MHPMCOUNTER18	B1200001
MHPMCOUNTER19	B1300001
MHPMCOUNTER20	B1400001
MHPMCOUNTER21	B1500001
MHPMCOUNTER22	B1600001
MHPMCOUNTER23	B1700001
MHPMCOUNTER24	B1800001
MHPMCOUNTER25	B1900001
MHPMCOUNTER26	B1A00001
MHPMCOUNTER27	B1B00001
MHPMCOUNTER28	B1C00001
MHPMCOUNTER29	B1D00001
MHPMCOUNTER30	B1E00001
MHPMCOUNTER31	B1F00001

MCYCLEH		B8000001
MINSTRETH	B8200001
MHPMCOUNTER3H	B8300001
MHPMCOUNTER4H	B8400001
MHPMCOUNTER5H	B8500001
MHPMCOUNTER6H	B8600001
MHPMCOUNTER7H	B8700001
MHPMCOUNTER8H	B8800001
MHPMCOUNTER9H	B8900001
MHPMCOUNTER10H	B8A00001
MHPMCOUNTER11H	B8B00001
MHPMCOUNTER12H	B8C00001
MHPMCOUNTER13H	B8D00001
MHPMCOUNTER14H	B8E00001
MHPMCOUNTER15H	B8F00001
MHPMCOUNTER16H	B9000001
MHPMCOUNTER17H	B9100001
MHPMCOUNTER18H	B9200001
MHPMCOUNTER19H	B9300001
MHPMCOUNTER20H	B9400001
MHPMCOUNTER21H	B9500001
MHPMCOUNTER22H	B9600001
MHPMCOUNTER23H	B9700001
MHPMCOUNTER24H	B9800001
MHPMCOUNTER25H	B9900001
MHPMCOUNTER26H	B9A00001
MHPMCOUNTER27H	B9B00001
MHPMCOUNTER28H	B9C00001
MHPMCOUNTER29H	B9D00001
MHPMCOUNTER30H	B9E00001
MHPMCOUNTER31H	B9F00001

CYCLE		C0000001
TIME		C0100001
INSTRET		C0200001
HPMCOUNTER3	C0300001
HPMCOUNTER4	C0400001
HPMCOUNTER5	C0500001
HPMCOUNTER6	C0600001
HPMCOUNTER7	C0700001
HPMCOUNTER8	C0800001
HPMCOUNTER9	C0900001
HPMCOUNTER10	C0A00001
HPMCOUNTER11	C0B00001
HPMCOUNTER12	C0C00001
HPMCOUNTER13	C0D00001
HPMCOUNTER14	C0E00001
HPMCOUNTER15	C0F00001
HPMCOUNTER16	C1000001
HPMCOUNTER17	C1100001
HPMCOUNTER18	C1200001
HPMCOUNTER19	C1300001
HPMCOUNTER20	C1400001
HPMCOUNTER21	C1500001
HPMCOUNTER22	C1600001
HPMCOUNTER23	C1700001
HPMCOUNTER24	C1800001
HPMCOUNTER25	C1900001
HPMCOUNTER26	C1A00001
HPMCOUNTER27	C1B00001
HPMCOUNTER28	C1C00001
HPMCOUNTER29	C1D00001
HPMCOUNTER30	C1E00001
HPMCOUNTER31	C1F00001

CYCLEH		C8000001
TIMEH		C8100001
INSTRETH	C8200001
HPMCOUNTER3H	C8300001
HPMCOUNTER4H	C8400001
HPMCOUNTER5H	C8500001
HPMCOUNTER6H	C8600001
HPMCOUNTER7H	C8700001
HPMCOUNTER8H	C8800001
HPMCOUNTER9H	C8900001
HPMCOUNTER10H	C8A00001
HPMCOUNTER11H	C8B00001
HPMCOUNTER12H	C8C00001
HPMCOUNTER13H	C8D00001
HPMCOUNTER14H	C8E00001
HPMCOUNTER15H	C8F00001
HPMCOUNTER16H	C9000001
HPMCOUNTER17H	C9100001
HPMCOUNTER18H	C9200001
HPMCOUNTER19H	C9300001
HPMCOUNTER20H	C9400001
HPMCOUNTER21H	C9500001
HPMCOUNTER22H	C9600001
HPMCOUNTER23H	C9700001
HPMCOUNTER24H	C9800001
HPMCOUNTER25H	C9900001
HPMCOUNTER26H	C9A00001
HPMCOUNTER27H	C9B00001
HPMCOUNTER28H	C9C00001
HPMCOUNTER29H	C9D00001
HPMCOUNTER30H	C9E00001
HPMCOUNTER31H	C9F00001

MVENDORID	F1100001
MARCHID		F1200001
MIMPID		F1300001
MHARTID		F1400001
