From 19ea6644e40cd2c8731f224dafe73b44c2b340ee Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Thu, 16 Dec 2021 16:49:38 +0100 Subject: [PATCH] some of it --- A5/encoding.txt | 95 +++++++++++++++++++++++++++++++++++++++++ A5/main.c | 34 ++++++++++++--- A5/sim | Bin 0 -> 63896 bytes A5/test_runs/test1.hex | 17 ++++++++ A5/test_runs/test1.out | 25 +++++++++++ A5/test_runs/test1.sym | 2 + A5/test_runs/test1.trc | 24 +++++++++++ A5/test_runs/test2.hex | 22 ++++++++++ A5/test_runs/test2.out | 18 ++++++++ A5/test_runs/test2.sym | 5 +++ A5/test_runs/test2.trc | 14 ++++++ A5/tests/test1.prime | 18 ++++++++ A5/tests/test2.prime | 22 ++++++++++ 13 files changed, 289 insertions(+), 7 deletions(-) create mode 100644 A5/encoding.txt create mode 100755 A5/sim create mode 100644 A5/test_runs/test1.hex create mode 100644 A5/test_runs/test1.out create mode 100644 A5/test_runs/test1.sym create mode 100644 A5/test_runs/test1.trc create mode 100644 A5/test_runs/test2.hex create mode 100644 A5/test_runs/test2.out create mode 100644 A5/test_runs/test2.sym create mode 100644 A5/test_runs/test2.trc create mode 100644 A5/tests/test1.prime create mode 100644 A5/tests/test2.prime diff --git a/A5/encoding.txt b/A5/encoding.txt new file mode 100644 index 0000000..7d1457b --- /dev/null +++ b/A5/encoding.txt @@ -0,0 +1,95 @@ +x86prime instructions and encoding +---------------------------------- + +Encoding: Assembler Operation + +00000000 00000000 stop stop the machine +00000001 0000ssss ret s return from function call +0001aaaa ddddssss op s,d reg/reg arithmetic (see below) +00100001 ddddssss movq s,d reg->reg copy +00110001 ddddssss movq (s),d load (memory -> reg copy) +00111001 ddddssss movq d,(s) store (reg -> memory copy) +- +0100cccc ddddssss pp...32...pp cb s,d,p compare and continue at p if... (see below) +01001110 dddd0000 pp...32...pp call p,d function call +01001111 00000000 pp...32...pp jmp p continue at p +0101aaaa dddd0000 ii...32...ii op $i,d constant/reg arithmethic(see below) +01100100 dddd0000 ii...32...ii movq $i,d constant -> register +01110101 ddddssss ii...32...ii movq i(s),d load (memory -> reg copy) +01111101 ddddssss ii...32...ii movq d,i(s) store (reg -> memory copy) +- +10000001 ddddssss leaq (s),d s -> d +10010010 dddd0000 zzzzvvvv leaq (,z,v),d z*v -> d +10010011 ddddssss zzzzvvvv leaq (s,z,v),d s+z*v -> d +10100100 dddd0000 ii...32...ii leaq i,d i -> d +10100101 ddddssss ii...32...ii leaq i(s),d i+s -> d +10110110 dddd0000 zzzzvvvv ii...32...ii leaq i(,z,v),d i+z*v -> d +10110111 ddddssss zzzzvvvv ii...32...ii leaq i(s,z,v),d i+s+z*v -> d +- +1111cccc dddd0000 ii...32...ii pp...32...pp cb $i,d,p compare and continue at p if... (see below) + +Note: first 4 bits are called the "major opcode", next 4 bits are called the "minor opcode". + +Explanations: + +aaaa indicates the kind of arithmetic operation. All operate on full 64 bits: + +0000 add addition +0001 sub subtraction +0010 and bitwise and +0011 or bitwise or +0100 xor bitwise xor +0101 mul unsigned multiplication +0110 sar shift arithmetic right (preserve topmost bit) +0111 sal shift arithmetic left (zero into lsb, do not preserve topmost bit) +1000 shr shift (logical) right (zero into topmost bit) +1001 imul signed multiplication + +d,s and z are registers: + +0000 %rax 1000 %r8 +0001 %rbx 1001 %r9 +0010 %rcx 1010 %r10 +0011 %rdx 1011 %r11 +0100 %rbp 1100 %r12 +0101 %rsi 1101 %r13 +0110 %rdi 1110 %r14 +0111 %rsp 1111 %r15 + +v is a scale factor encoded into the field vvvv in the form of a shift amount as follows: + +vvvv v +0000 1 +0001 2 +0010 4 +0011 8 + +ii...32...ii is a 32 bit signed immediate +pp...32...pp is a 32 bit target address + + is a condition mnemonic used in compare-and-branch. The compare-and-branch +instruction cb is not part of the original x86 instruction set, but the +conditions in x86prime carry the same meaning as for x86. + +Example: cble %rdi,%rbp,target = if %rdi <= %rbp (signed) then jump to target + +Encoding Semantic +0000 e Equal +0001 ne Not equal +0010 +0011 +0100 l less (signed) +0101 le less or equal (signed) +0110 g greater (signed) +0111 ge greater or equal (signed) +1000 a above (unsigned) +1001 ae above or equal (unsigned) +1010 b below (unsigned) +1011 be below or equal (unsigned) +11xx + +Note that signed and unsigned comparisons are different. + +call places the return address in a register instead of pushing it onto the stack. +ret returns to the address in a register instead of popping it from the stack. +returning to address 0 or to a negative address (bit 64 set) stops the machine. diff --git a/A5/main.c b/A5/main.c index 146cbae..95e60e6 100644 --- a/A5/main.c +++ b/A5/main.c @@ -105,6 +105,7 @@ int main(int argc, char* argv[]) { val reg_s = pick_bits(0, 4, inst_bytes[1]); val reg_z = pick_bits(4, 4, inst_bytes[2]); val shamt = pick_bits(0, 4, inst_bytes[2]); + val target = pick_bits(0, 8, inst_bytes[2]); // decode instruction type from major operation code bool is_return_or_stop = is(RETURN_STOP, major_op); @@ -122,9 +123,24 @@ int main(int argc, char* argv[]) { bool is_imm_cbranch = is(IMM_CBRANCH, major_op); // Right now, we can only execute instructions with a size of 2. - // TODO 2021: // from info above determine the instruction size - val ins_size = from_int(2); + bool size_is_2 = (is_return_or_stop || is_reg_arithmetic || is_reg_movq || is_reg_movq_mem || is_leaq2); + val size_2 = use_if(size_is_2, from_int(2)); + bool size_is_3 = (is_leaq3); + val size_3 = use_if(size_is_3, from_int(3)); + bool size_is_6 = (is_cflow || is_imm_arithmetic || is_imm_movq || is_imm_movq_mem || is_leaq6); + val size_6 = use_if(size_is_6, from_int(6)); + bool size_is_7 = (is_leaq7); + val size_7 = use_if(size_is_7, from_int(7)); + bool size_is_10 = (is_imm_cbranch); + val size_10 = use_if(size_is_10, from_int(10)); + + val add_1 = add(size_2, size_3); + val add_2 = add(add_1, size_6); + val add_3 = add(add_2, size_7); + val add_4 = add(add_3, size_10); + + val ins_size = add_4; // broad categorization of the instruction bool is_leaq = is_leaq2 || is_leaq3 || is_leaq6 || is_leaq7; @@ -139,9 +155,9 @@ int main(int argc, char* argv[]) { bool imm_p_pos6 = is_imm_cbranch; /* all other at position 2 */ // unimplemented control signals: - bool is_load = false; // TODO 2021: Detect when we're executing a load - bool is_store = false; // TODO 2021: Detect when we're executing a store - bool is_conditional = false; // TODO 2021: Detect if we are executing a conditional flow change + bool is_load = (is_mem_access && !pick_one(3,minor_op)); + bool is_store = (is_mem_access && pick_one(3,minor_op)); + bool is_conditional = (is_cflow || is_imm_cbranch) && !(is(0xE, minor_op) || is(0xF, minor_op)); // TODO 2021: Add additional control signals you may need below.... @@ -214,8 +230,11 @@ int main(int argc, char* argv[]) { val pc_incremented = add(pc, ins_size); // determine the next position of the program counter - // TODO 2021: Add any additional sources for the next PC (for call, ret, jmp and conditional branch) - val pc_next = pc_incremented; + bool is_jump = is_cflow && (is(0xF,minor_op) || (is_conditional && !reduce_or(compute_result))); + val pc_next_if_not_control = use_if(!is_jump, pc_incremented); + val pc_next_if_jump = use_if(is_jump, target); + val pc_next_if_return = use_if(is_return, reg_out_b); + val pc_next = add(add(pc_next_if_not_control, pc_next_if_jump), pc_next_if_return); /*** MEMORY ***/ // read from memory if needed @@ -232,6 +251,7 @@ int main(int argc, char* argv[]) { reg_write(regs, reg_d, datapath_result, reg_wr_enable); // write to memory if needed + printf("%i\n",is_store); memory_write(mem, agen_result, reg_out_a, is_store); // update program counter diff --git a/A5/sim b/A5/sim new file mode 100755 index 0000000000000000000000000000000000000000..de17651e6ad2a70bc1e43bc9cee37d351455b308 GIT binary patch literal 63896 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