Skip to content

Commit

Permalink
Super exp!
Browse files Browse the repository at this point in the history
  • Loading branch information
ATPStorages committed Apr 19, 2024
1 parent 650f67b commit ae2932e
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 34 deletions.
2 changes: 1 addition & 1 deletion src/main/kotlin/breadmod/util/riscv32/Register.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ package breadmod.util.riscv32
* @author Miko Elbrecht
* @see 1.0.0
*/
class Register(private val lock: Int? = null) {
class Register(private val lock: Int? = null, val saver: RegisterSaver) {
var storedValue: Int = 0
get() = lock ?: field
internal set
Expand Down
7 changes: 7 additions & 0 deletions src/main/kotlin/breadmod/util/riscv32/RegisterSaver.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package breadmod.util.riscv32

enum class RegisterSaver {
CALLEE,
CALLER,
NONE
}
100 changes: 67 additions & 33 deletions src/main/kotlin/breadmod/util/riscv32/VirtualProcessor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,41 +12,75 @@ package breadmod.util.riscv32
*/
class VirtualProcessor {
val registers = listOf(
Register(0), // zero
Register(), // return address (ra)
Register(), // stack pointer (sp)
Register(), // global pointer (gp)
Register(), // thread pointer (tp)
Register(), // temporary/alternate return (t0)
Register(), // temporary (t1)
Register(), // temporary (t2)
Register(), // saved register/frame pointer (s0/fp)
Register(), // saved register (s1)
Register(), // function arguments/return values (a0)
Register(), // ditto (a1)
Register(), // function arguments (a2)
Register(), // ditto (a3)
Register(), // ditto (a4)
Register(), // ditto (a5)
Register(), // ditto (a6)
Register(), // ditto (a7)
Register(), // saved register (s2)
Register(), // ditto (s3)
Register(), // ditto (s4)
Register(), // ditto (s5)
Register(), // ditto (s6)
Register(), // ditto (s7)
Register(), // ditto (s8)
Register(), // ditto (s9)
Register(), // ditto (s10)
Register(), // ditto (s11)
Register(), // temporary (t3)
Register(), // ditto (t4)
Register(), // ditto (t5)
Register(), // ditto (t6)
Register(0, RegisterSaver.NONE), // zero
Register(saver = RegisterSaver.CALLER), // return address (ra)
Register(saver = RegisterSaver.CALLEE), // stack pointer (sp)
Register(saver = RegisterSaver.NONE), // global pointer (gp)
Register(saver = RegisterSaver.NONE), // thread pointer (tp)
Register(saver = RegisterSaver.CALLER), // temporary/alternate return (t0)
Register(saver = RegisterSaver.CALLER), // temporary (t1)
Register(saver = RegisterSaver.CALLER), // temporary (t2)
Register(saver = RegisterSaver.CALLEE), // saved register/frame pointer (s0/fp)
Register(saver = RegisterSaver.CALLEE), // saved register (s1)
Register(saver = RegisterSaver.CALLER), // function arguments/return values (a0)
Register(saver = RegisterSaver.CALLER), // ditto (a1)
Register(saver = RegisterSaver.CALLER), // function arguments (a2)
Register(saver = RegisterSaver.CALLER), // ditto (a3)
Register(saver = RegisterSaver.CALLER), // ditto (a4)
Register(saver = RegisterSaver.CALLER), // ditto (a5)
Register(saver = RegisterSaver.CALLER), // ditto (a6)
Register(saver = RegisterSaver.CALLER), // ditto (a7)
Register(saver = RegisterSaver.CALLEE), // saved register (s2)
Register(saver = RegisterSaver.CALLEE), // ditto (s3)
Register(saver = RegisterSaver.CALLEE), // ditto (s4)
Register(saver = RegisterSaver.CALLEE), // ditto (s5)
Register(saver = RegisterSaver.CALLEE), // ditto (s6)
Register(saver = RegisterSaver.CALLEE), // ditto (s7)
Register(saver = RegisterSaver.CALLEE), // ditto (s8)
Register(saver = RegisterSaver.CALLEE), // ditto (s9)
Register(saver = RegisterSaver.CALLEE), // ditto (s10)
Register(saver = RegisterSaver.CALLEE), // ditto (s11)
Register(saver = RegisterSaver.CALLER), // temporary (t3)
Register(saver = RegisterSaver.CALLER), // ditto (t4)
Register(saver = RegisterSaver.CALLER), // ditto (t5)
Register(saver = RegisterSaver.CALLER), // ditto (t6)
)

fun decodeInstruction(instruction: Int) {
val opcode = instruction and 0xFFFFFF

}

abstract class InstructionFormat(open val instruction: Int) {
abstract fun process(forCpu: VirtualProcessor)
}

/**
* R-type [instruction format](https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf#section.2.2)
* @author Miko Elbrecht
* @since 1.0.0
*/
class RegisterRegisterInstruction(override val instruction: Int): InstructionFormat(instruction) {
constructor(
opcode: Int,
destinationRegister1: Int,
opcodeExtension3B: Int,
sourceRegister1: Int,
sourceRegister2: Int,
opcodeExtension7B: Int
) : this(
opcode or destinationRegister1 or opcodeExtension3B or
sourceRegister1 or sourceRegister2 or opcodeExtension7B
)

val opcode: Int = instruction and 0xFFFFFF
val destinationRegister1: Int = (instruction and 0xFFFFF) shr 7 // one bit remaining
val opcodeExtension3B: Int = 0
val sourceRegister1: Int = 0
val sourceRegister2: Int = 0
val opcodeExtension7B: Int = 0

override fun process(forCpu: VirtualProcessor) {
TODO("Not yet implemented")
}
}
}

0 comments on commit ae2932e

Please sign in to comment.