summaryrefslogtreecommitdiff
path: root/src/mm.cc
diff options
context:
space:
mode:
authorbd <bdunaisky@umass.edu>2025-04-28 03:44:42 +0000
committerGitHub <noreply@github.com>2025-04-28 03:44:42 +0000
commit013a79547aa465872d0262b2f5c24e73f9556869 (patch)
tree28cc8f2ea6e5aa1a74f328de8594b0ad5995fa66 /src/mm.cc
parent5653b2a033e7a4173d2f178b5ce52384666d3d7b (diff)
parent336faf3fd701aaf962613abd1ff0a69cbdf021ce (diff)
Merge pull request #69 from bdunahu/vector_ext
Vector ext
Diffstat (limited to 'src/mm.cc')
-rw-r--r--src/mm.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/mm.cc b/src/mm.cc
index ac77433..8134cf5 100644
--- a/src/mm.cc
+++ b/src/mm.cc
@@ -24,6 +24,7 @@ void MM::advance_helper()
{
signed int data;
int i;
+ int vector_delay = VECTOR_MEM_DELAY;
switch (this->curr_instr->mnemonic) {
case LOAD:
@@ -35,6 +36,32 @@ void MM::advance_helper()
} else
this->status = STALLED;
break;
+ case LOADV:
+ if (vector_delay == 0){
+ signed int word_address = this->curr_instr->operands.load_store_vector.base_addr;
+ int j = 0;
+ while(j < this->curr_instr->slot_A){
+ i = this->storage->read_word(this, word_address, data);
+ this->status = i ? OK : STALLED;
+ if (this->status == OK) {
+ this->curr_instr->operands.load_store_vector.vector_register[j] = data;
+ // +1 or +4?
+ word_address += 1;
+ j++;
+ } else {
+ break;
+ }
+ }
+ if(this->status == OK){
+ // if vector is loaded, reset delay
+ vector_delay = VECTOR_MEM_DELAY;
+ } else {
+ this->status = STALLED;
+ }
+ } else {
+ vector_delay--;
+ }
+ break;
case PUSH:
case STORE:
@@ -46,6 +73,31 @@ void MM::advance_helper()
this->status = STALLED;
}
break;
+ case STOREV:
+ if (vector_delay == 0){
+ signed int word_address = this->curr_instr->operands.load_store_vector.base_addr;
+ int j = 0;
+ while(j < this->curr_instr->slot_A){
+ this->storage->write_word(
+ this, this->curr_instr->operands.load_store_vector.vector_register[j], word_address);
+ this->status = i ? OK : STALLED;
+ if (this->status != OK) {
+ break;
+ } else {
+ word_address += 1;
+ j++;
+ }
+ }
+ if(this->status == OK){
+ // if vector is stored , reset delay
+ vector_delay = VECTOR_MEM_DELAY;
+ } else {
+ this->status = STALLED;
+ }
+ } else {
+ vector_delay--;
+ }
+ break;
case POP:
i = this->storage->read_word(this, this->curr_instr->operands.integer.slot_three, data);