Copyright (c) 2015-2019, the Selfie Project authors. All rights reserved. Please see the AUTHORS file for details. Use of this source code is governed by a BSD license that can be found in the LICENSE file.
Selfie is a project of the Computational Systems Group at the Department of Computer Sciences of the University of Salzburg in Austria. For further information and code please refer to:
http://selfie.cs.uni-salzburg.at
This document provides an overview of the RISC-U instruction set. RISC-U is a tiny subset of the 64-bit RISC-V instruction set. The selfie system implements a compiler that targets RISC-U as well as a RISC-U emulator that interprets RISC-U code. RISC-U consists of just 14 instructions listed below. For details on the exact encoding, decoding, and semantics of RISC-U code see the selfie implementation.
A RISC-U machine has a 64-bit program counter denoted pc
, 32 general-purpose 64-bit registers (zero
, ra
, sp
, gp
, tp
, t0-t2
, s0-s1
, a0-a7
, s2-s11
, t3-t6
), and 4GB of byte-addressed memory.
Register zero
always contains the value 0
. Any attempts to update the value in zero
are ignored.
RISC-U instructions are 32-bit, two per 64-bit double word. Memory, however, can only be accessed at 64-bit double-word granularity.
The parameters rd
, rs1
, and rs2
used in RISC-U instructions may denote any of the 32 general-purpose registers.
The parameter imm
denotes a signed integer value represented by a fixed number of bits depending on the instruction.
lui rd,imm
: rd = imm * 2^12; pc = pc + 4
with -2^19 <= imm < 2^19
addi rd,rs1,imm
: rd = rs1 + imm; pc = pc + 4
with -2^11 <= imm < 2^11
ld rd,imm(rs1)
: rd = memory[rs1 + imm]; pc = pc + 4
with -2^11 <= imm < 2^11
sd rs2,imm(rs1)
: memory[rs1 + imm] = rs2; pc = pc + 4
with -2^11 <= imm < 2^11
add rd,rs1,rs2
: rd = rs1 + rs2; pc = pc + 4
sub rd,rs1,rs2
: rd = rs1 - rs2; pc = pc + 4
mul rd,rs1,rs2
: rd = rs1 * rs2; pc = pc + 4
divu rd,rs1,rs2
: rd = rs1 / rs2; pc = pc + 4
where rs1
and rs2
are unsigned integers.
remu rd,rs1,rs2
: rd = rs1 % rs2; pc = pc + 4
where rs1
and rs2
are unsigned integers.
sltu rd,rs1,rs2
: if (rs1 < rs2) { rd = 1 } else { rd = 0 } pc = pc + 4
where rs1
and rs2
are unsigned integers.
beq rs1,rs2,imm
: if (rs1 == rs2) pc = pc + imm else pc = pc + 4
with -2^12 <= imm < 2^12
and imm % 2 == 0
jal rd,imm
: rd = pc + 4; pc = pc + imm
with -2^20 <= imm < 2^20
and imm % 2 == 0
jalr rd,imm(rs1)
: tmp = ((rs1 + imm) / 2) * 2; rd = pc + 4; pc = tmp
with -2^11 <= imm < 2^11
ecall
: system call number is in a7
, parameters are in a0-a2
, return value is in a0
.