diff options
author | bd <bdunahu@operationnull.com> | 2025-04-27 23:26:40 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-04-27 23:26:40 -0400 |
commit | a5366c56469bdec480c7eb463f9f71d7a3e3b2d2 (patch) | |
tree | 0e66c059b00e66297d4bd06a553b4721ff9eacc0 /src/ex.cc | |
parent | b50cb7048275f5b9255dea7f3ac1362aaa09fe83 (diff) |
Fix push/pop instruction
Diffstat (limited to 'src/ex.cc')
-rw-r--r-- | src/ex.cc | 374 |
1 files changed, 189 insertions, 185 deletions
@@ -22,7 +22,6 @@ #include "stage.h" #include <unordered_map> - // Switch statements for each instruction void EX::advance_helper() { @@ -32,212 +31,217 @@ void EX::advance_helper() unsigned int pc; Mnemonic m; + s1 = 0, s2 = 0, s3 = 0; m = this->curr_instr->mnemonic; pc = this->curr_instr->slot_B; - if(this->is_vector_type(m)) { - if(this->curr_instr->mnemonic != LOADV && this->curr_instr->mnemonic != STOREV){ + if (this->is_vector_type(m)) { + if (this->curr_instr->mnemonic != LOADV && + this->curr_instr->mnemonic != STOREV) { v1 = this->curr_instr->operands.vector.slot_one; v2 = this->curr_instr->operands.vector.slot_two; - v3 = this->curr_instr->operands.vector.slot_three; + v3 = this->curr_instr->operands.vector.slot_three; } else { - v_immediate = this->curr_instr->operands.load_store_vector.immediate; - v_base_addr = this->curr_instr->operands.load_store_vector.base_addr; + v_immediate = + this->curr_instr->operands.load_store_vector.immediate; + v_base_addr = + this->curr_instr->operands.load_store_vector.base_addr; } v_len = this->curr_instr->slot_A; - if(v_len == 0){ - //clear destination vector reg + if (v_len == 0) { + // clear destination vector reg v1.fill(0); - } - } else{ + } + } else { s1 = this->curr_instr->operands.integer.slot_one; s2 = this->curr_instr->operands.integer.slot_two; s3 = this->curr_instr->operands.integer.slot_three; } - if(this->is_logical(m)) { + if (this->is_logical(m)) { this->set_condition(OF, false); this->set_condition(UF, false); } - switch(m) { - case ADD: - this->set_condition(OF, ADDITION_OF_GUARD(s1, s2)); - this->set_condition(UF, ADDITION_UF_GUARD(s1, s2)); - s1 = s1 + s2; - break; - - case SUB: - this->set_condition(OF, SUBTRACTION_OF_GUARD(s1, s2)); - this->set_condition(UF, SUBTRACTION_UF_GUARD(s1, s2)); - s1 = s1 - s2; - break; - - case MUL: - this->set_condition(OF, MULTIPLICATION_OF_GUARD(s1, s2)); - this->set_condition(UF, MULTIPLICATION_UF_GUARD(s1, s2)); - s1 = s1 * s2; - break; - - case QUOT: - this->handle_divide(s1, s2, false); - break; - - case REM: - this->handle_divide(s1, s2, true); - break; - - case SFTR: - s1 = s1 >> s2; - break; - - case SFTL: - s1 = s1 << s2; - break; - - case AND: - s1 = s1 & s2; - break; - - case OR: - s1 = s1 | s2; - break; - - case XOR: - s1 = s1 ^ s2; - break; - - case NOT: - s1 = ~s1; - break; - - case CMP: - (s1 > s2) ? this->set_condition(GT, true) - : this->set_condition(GT, false); - (s1 == s2) ? this->set_condition(EQ, true) - : this->set_condition(EQ, false); + switch (m) { + case ADD: + this->set_condition(OF, ADDITION_OF_GUARD(s1, s2)); + this->set_condition(UF, ADDITION_UF_GUARD(s1, s2)); + s1 = s1 + s2; + break; + + case SUB: + this->set_condition(OF, SUBTRACTION_OF_GUARD(s1, s2)); + this->set_condition(UF, SUBTRACTION_UF_GUARD(s1, s2)); + s1 = s1 - s2; + break; + + case MUL: + this->set_condition(OF, MULTIPLICATION_OF_GUARD(s1, s2)); + this->set_condition(UF, MULTIPLICATION_UF_GUARD(s1, s2)); + s1 = s1 * s2; + break; + + case QUOT: + this->handle_divide(s1, s2, false); + break; + + case REM: + this->handle_divide(s1, s2, true); + break; + + case SFTR: + s1 = s1 >> s2; + break; + + case SFTL: + s1 = s1 << s2; + break; + + case AND: + s1 = s1 & s2; + break; + + case OR: + s1 = s1 | s2; + break; + + case XOR: + s1 = s1 ^ s2; + break; + + case NOT: + s1 = ~s1; + break; + + case CMP: + (s1 > s2) ? this->set_condition(GT, true) + : this->set_condition(GT, false); + (s1 == s2) ? this->set_condition(EQ, true) + : this->set_condition(EQ, false); + break; + + case ADDI: + this->set_condition(OF, ADDITION_OF_GUARD(s1, s3)); + this->set_condition(UF, ADDITION_UF_GUARD(s1, s3)); + s1 = s1 + s3; + break; + + case SUBI: + this->set_condition(OF, SUBTRACTION_OF_GUARD(s1, s3)); + this->set_condition(UF, SUBTRACTION_UF_GUARD(s1, s3)); + s1 = s1 - s3; + break; + + case SFTRI: + s1 = s1 >> s3; + break; + + case SFTLI: + s1 = s1 << s3; + break; + + case ANDI: + s1 = s1 & s3; + break; + + case ORI: + s1 = s1 | s3; + break; + + case XORI: + s1 = s1 ^ s3; + break; + + case LOAD: + case STORE: + case PUSH: + case POP: + s1 = s1 + s3; + break; + + case JMP: + case JAL: + s1 = s1 + s2; + break; + + case JRL: + s1 = pc + s2; + break; + + case BEQ: + (this->get_condition(EQ)) ? s1 = pc + s2 : s1 = -1; + break; + + case BGT: + (this->get_condition(GT)) ? s1 = pc + s2 : s1 = -1; + break; + + case BUF: + (this->get_condition(UF)) ? s1 = pc + s2 : s1 = -1; + break; + + case BOF: + (this->get_condition(OF)) ? s1 = pc + s2 : s1 = -1; + break; + + case ADDV: + for (int i = 0; i < v_len; i++) { + this->set_condition(OF, ADDITION_OF_GUARD(v1[i], v2[i])); + this->set_condition(UF, ADDITION_UF_GUARD(v1[i], v2[i])); + v1[i] = v1[i] + v2[i]; + } + break; + case SUBV: + for (int i = 0; i < v_len; i++) { + this->set_condition(OF, SUBTRACTION_OF_GUARD(v1[i], v2[i])); + this->set_condition(UF, SUBTRACTION_UF_GUARD(v1[i], v2[i])); + v1[i] = v1[i] - v2[i]; + } + break; + case MULV: + for (int i = 0; i < v_len; i++) { + this->set_condition(OF, MULTIPLICATION_OF_GUARD(v1[i], v2[i])); + this->set_condition(UF, MULTIPLICATION_UF_GUARD(v1[i], v2[i])); + v1[i] = v1[i] * v2[i]; + } + break; + case DIVV: + for (int i = 0; i < v_len; i++) { + this->handle_divide(v1[i], v2[i], false); + } + break; + case CEV: + int i; + for (i = 0; i < v_len; i++) { + if (v1[i] != v2[i]) { break; - - case ADDI: - this->set_condition(OF, ADDITION_OF_GUARD(s1, s3)); - this->set_condition(UF, ADDITION_UF_GUARD(s1, s3)); - s1 = s1 + s3; - break; - - case SUBI: - this->set_condition(OF, SUBTRACTION_OF_GUARD(s1, s3)); - this->set_condition(UF, SUBTRACTION_UF_GUARD(s1, s3)); - s1 = s1 - s3; - break; - - case SFTRI: - s1 = s1 >> s3; - break; - - case SFTLI: - s1 = s1 << s3; - break; - - case ANDI: - s1 = s1 & s3; - break; - - case ORI: - s1 = s1 | s3; - break; - - case XORI: - s1 = s1 ^ s3; - break; - - case LOAD: - case STORE: - case PUSH: - case POP: - s1 = s1 + s3; - break; - - case JMP: - case JAL: - s1 = s1 + s2; - break; - - case JRL: - s1 = pc + s2; - break; - - case BEQ: - (this->get_condition(EQ)) ? s1 = pc + s2 : s1 = -1; - break; - - case BGT: - (this->get_condition(GT)) ? s1 = pc + s2 : s1 = -1; - break; - - case BUF: - (this->get_condition(UF)) ? s1 = pc + s2 : s1 = -1; - break; - - case BOF: - (this->get_condition(OF)) ? s1 = pc + s2 : s1 = -1; - break; - - case ADDV: - for(int i=0;i<v_len;i++){ - this->set_condition(OF, ADDITION_OF_GUARD(v1[i],v2[i])); - this->set_condition(UF, ADDITION_UF_GUARD(v1[i],v2[i])); - v1[i] = v1[i] + v2[i]; } - break; - case SUBV: - for(int i=0;i<v_len;i++){ - this->set_condition(OF, SUBTRACTION_OF_GUARD(v1[i],v2[i])); - this->set_condition(UF, SUBTRACTION_UF_GUARD(v1[i],v2[i])); - v1[i] = v1[i] - v2[i]; - } - break; - case MULV: - for(int i=0;i<v_len;i++){ - this->set_condition(OF, MULTIPLICATION_OF_GUARD(v1[i],v2[i])); - this->set_condition(UF, MULTIPLICATION_UF_GUARD(v1[i],v2[i])); - v1[i] = v1[i] * v2[i]; - } - break; - case DIVV: - for(int i=0;i<v_len;i++){ - this->handle_divide(v1[i],v2[i],false); - } - break; - case CEV: - int i; - for(i=0;i<v_len;i++){ - if(v1[i] != v2[i]){ - break; - } - } - if(i == v_len){ - this->set_condition(EQ, true); - } else { - this->set_condition(EQ, false); - } - break; - case LOADV: - case STOREV: - v_base_addr = v_base_addr + v_immediate; - break; - - case RET: - case NOP: - break; - + } + if (i == v_len) { + this->set_condition(EQ, true); + } else { + this->set_condition(EQ, false); + } + break; + case LOADV: + case STOREV: + v_base_addr = v_base_addr + v_immediate; + break; + + case RET: + case NOP: + break; } - if(this->is_vector_type(m)) { - if(this->curr_instr->mnemonic != LOADV && this->curr_instr->mnemonic != STOREV){ - this->curr_instr->operands.vector.slot_one = v1; + if (this->is_vector_type(m)) { + if (this->curr_instr->mnemonic != LOADV && + this->curr_instr->mnemonic != STOREV) { + this->curr_instr->operands.vector.slot_one = v1; } else { - this->curr_instr->operands.load_store_vector.base_addr = v_base_addr; - } - } else{ + this->curr_instr->operands.load_store_vector.base_addr = + v_base_addr; + } + } else { this->curr_instr->operands.integer.slot_one = s1; } this->status = OK; |