needs tests/harness asm/riscv asm/label testbegin 0 value c 0 value h : _#eq 2dup = if 2drop else ."instr: " h here over - 4/ spit[] #eq then ; : t[ here to h scnt to c ; : ]t ( ... ) scnt c - here h - 4/ over _#eq ( ... n ) here swap 0 do 4- dup le@ rot _#eq loop drop ; \test nbovfl \ inner checking mechanism used by the assembler, works only for signed numbers 2047 12 nbovfl not #true 2047 #eq 2048 12 nbovfl #true 2048 #eq -2048 12 nbovfl not #true -2048 #eq $fff 12 nbovfl #true $fff #eq 24 5 nbovfl #true 24 #eq 24 6 nbovfl not #true 24 #eq $fff sex12 12 nbovfl not #true drop $7ff sex12 12 nbovfl not #true drop \ === Instructions === \test lb lh lw lbu lhu lb) x12 rd) x5 rs1) $8 imm) $00828603 #eq lh) x12 rd) x5 rs1) $8 imm) $00829603 #eq lw) x12 rd) x5 rs1) $8 imm) $0082a603 #eq lbu) x12 rd) x5 rs1) $8 imm) $0082c603 #eq lhu) x12 rd) x5 rs1) $8 imm) $0082d603 #eq \test sb sh sw sb) x2 src) x3 base) $20 imm) $02218023 #eq sh) x2 src) x3 base) $20 imm) $02219023 #eq sw) x2 src) x3 base) $20 imm) $0221a023 #eq \test sll srl sra sll) x4 rd) x5 rs1) x6 rs2) $00629233 #eq srl) x4 rd) x5 rs1) x6 rs2) $0062d233 #eq sra) x4 rd) x5 rs1) x6 rs2) $4062d233 #eq \test slli srli srai slli) x7 rd) x8 rs1) $1f imm) $01f41393 #eq srli) x7 rd) x8 rs1) $1f imm) $01f45393 #eq srai) x7 rd) x8 rs1) $1f imm) $41f45393 #eq \test add sub addi add) x9 rd) x10 rs1) x11 rs2) $00b504b3 #eq sub) x9 rd) x10 rs1) x11 rs2) $40b504b3 #eq addi) x9 rd) x10 rs1) $ff imm) $0ff50493 #eq \test lui auipc lui) x11 rd) $fffff imm) $fffff5b7 #eq auipc) x11 rd) $fffff imm) $fffff597 #eq \test xor or and xor) x12 rd) x13 rs1) x14 rs2) $00e6c633 #eq or) x12 rd) x13 rs1) x14 rs2) $00e6e633 #eq and) x12 rd) x13 rs1) x14 rs2) $00e6f633 #eq \test xori ori andi xori) x15 rd) x16 rs1) $aa imm) $0aa84793 #eq ori) x15 rd) x16 rs1) $aa imm) $0aa86793 #eq andi) x15 rd) x16 rs1) $aa imm) $0aa87793 #eq \test slt sltu slti sltiu slt) x17 rd) x18 rs1) x19 rs2) $013928b3 #eq sltu) x17 rd) x18 rs1) x19 rs2) $013938b3 #eq slti) x17 rd) x18 rs1) $bb imm) $0bb92893 #eq sltiu) x17 rd) x18 rs1) $bb imm) $0bb93893 #eq \test mul mulh mulhsu mulhu mul) x25 rd) x24 rs1) x23 rs2) $037c0cb3 #eq mulh) x25 rd) x24 rs1) x23 rs2) $037c1cb3 #eq mulhsu) x25 rd) x24 rs1) x23 rs2) $037c2cb3 #eq mulhu) x25 rd) x24 rs1) x23 rs2) $037c3cb3 #eq \test div divu rem remu div) x21 rd) x22 rs1) x23 rs2) $037b4ab3 #eq divu) x21 rd) x22 rs1) x23 rs2) $037b5ab3 #eq rem) x21 rd) x22 rs1) x23 rs2) $037b6ab3 #eq remu) x21 rd) x22 rs1) x23 rs2) $037b7ab3 #eq \test bne beq bge blt bgeu bltu bne) x0 rs1) x1 rs2) -12 imm) $fe101ae3 #eq beq) x19 rs1) x20 rs2) -16 imm) $ff4988e3 #eq bge) x19 rs1) x20 rs2) -20 imm) $ff49d6e3 #eq blt) x19 rs1) x20 rs2) -24 imm) $ff49c4e3 #eq bgeu) x19 rs1) x20 rs2) -28 imm) $ff49f2e3 #eq bltu) x19 rs1) x20 rs2) -32 imm) $ff49e0e3 #eq \test jal jalr) jal) x20 rd) -4 imm) $ffdffa6f #eq jalr) x20 rd) x21 base) 16 imm) $010a8a67 #eq \ === Pseudo instructions === \test mv mv) x1 rd) x2 rs1) addi) x1 rd) x2 rs1) 0 imm) #eq \test not not) x1 rd) x2 rs1) xori) x1 rd) x2 rs1) -1 imm) #eq \test neg neg) x1 rd) x2 rs1) 0 ,) _$rst sub) x1 rd) xZERO rs1) x2 rs2) #eq \test bgt ble bgtu bleu bgt) x1 rs1) x2 rs2) 4 imm) _$rst blt) x2 rs1) x1 rs2) 4 imm) #eq ble) x1 rs1) x2 rs2) 4 imm) _$rst bge) x2 rs1) x1 rs2) 4 imm) #eq bgtu) x1 rs1) x2 rs2) 4 imm) _$rst bltu) x2 rs1) x1 rs2) 4 imm) #eq bleu) x1 rs1) x2 rs2) 4 imm) _$rst bgeu) x2 rs1) x1 rs2) 4 imm) #eq \test beqz bnez beqz) x1 rs1) 4 imm) beq) x1 rs1) xZERO rs2) 4 imm) #eq bnez) x1 rs1) 4 imm) bne) x1 rs1) xZERO rs2) 4 imm) #eq \test j j) 4 imm) jal) xZERO rd) 4 imm) #eq \test ret nop ret) jalr) xZERO rd) xRA base) 0 imm) #eq nop) addi) xZERO rd) xZERO rs1) 0 imm) #eq \ === Other words === \test [jmp] and forward! forward8 [jmp] j) ,) add) x0 rd) x1 rs1) x2 rs2) ,) add) x0 rd) x1 rs1) x2 rs2) ,) dup forward! le@ $00c0006f #eq \test 3p) add) xA xW xS 3p) add) xA rd) xW rs1) xS rs2) #eq addi) xA xA 4 3p) addi) xA rdrs1) 4 imm) #eq lw) xA xS 20 3p) lw) xA dst) xS base) 20 imm) #eq sw) xA xS 20 3p) sw) xA src) xS base) 20 imm) #eq lui) x10 4096 1929 3p) lui) x10 rd) 4096 imm) #eq beq) x3 x7 -128 3p) beq) x3 rs1) x7 rs2) -128 imm) #eq \test 2p) lui) xA 4096 2p) lui) xA rd) 4096 imm) #eq auipc) xA 4096 2p) auipc) xA rd) 4096 imm) #eq \ === Macros === \test push, t[ addi) xRSP xRSP -4 3p) sw) x10 xRSP 0 3p) x10 push, ]t \test ppush, t[ addi) xPSP xPSP -4 3p) sw) x10 xPSP 0 3p) x10 ppush, ]t \test pop, t[ lw) x10 xRSP 0 3p) addi) xRSP xRSP 4 3p) x10 pop, ]t \test ppop, t[ lw) x10 xPSP 0 3p) addi) xPSP xPSP 4 3p) x10 ppop, ]t \test single instr li, t[ addi) xW x0 500 3p) xW 500 li, ]t t[ addi) xA x0 1024 3p) xA 1024 li, ]t t[ addi) xS x0 2047 3p) xS 2047 li, ]t t[ addi) xW x0 -2 3p) xW -2 li, ]t t[ addi) xA x0 -1 3p) xA -1 li, ]t t[ addi) xS x0 -2048 3p) xS -2048 li, ]t \test two instrs li, t[ lui) xA 1 2p) addi) xA xA -1096 3p) xA 3000 li, ]t t[ lui) xA 1 2p) addi) xA xA -1 3p) xA 4095 li, ]t t[ lui) xW 2 2p) addi) xW xW -192 3p) xW 8000 li, ]t t[ lui) xW -1 2p) addi) xW xW 2047 3p) xW -2049 li, ]t \test call, \ J-type can have up to a 1MiB offset t[ jal) xRA 4 2p) 4 call, ]t t[ jal) xRA 8000 2p) 8000 call, ]t t[ auipc) xRA $1e8 2p) jalr) xRA xRA 1152 3p) 2000000 call, ]t \test tail, t[ jal) x0 4 2p) 4 tail, ]t t[ jal) x0 8000 2p) 8000 tail, ]t t[ auipc) xTAIL $1e8 2p) jalr) x0 xTAIL 1152 3p) 2000000 tail, ]t testend