From ba4d29848c985a1272688d39912c1ce03f783e7a Mon Sep 17 00:00:00 2001 From: Ian Fisher Date: Sun, 10 Feb 2019 13:28:29 -0500 Subject: [PATCH] More tests from Tiger compiler Resolves #42 --- test/assets/cs350/array_madness.hera | 646 +++++++++++++++++++++++++++ test/assets/cs350/record_trees.hera | 254 +++++++++++ test/test_from_cs350.py | 14 + 3 files changed, 914 insertions(+) create mode 100644 test/assets/cs350/array_madness.hera create mode 100644 test/assets/cs350/record_trees.hera diff --git a/test/assets/cs350/array_madness.hera b/test/assets/cs350/array_madness.hera new file mode 100644 index 0000000..63ae269 --- /dev/null +++ b/test/assets/cs350/array_madness.hera @@ -0,0 +1,646 @@ +DLABEL(string0) TIGER_STRING("") +DLABEL(string1) TIGER_STRING("a") +DLABEL(string2) TIGER_STRING("x") +DLABEL(string3) TIGER_STRING("radius") +DLABEL(string4) TIGER_STRING("min") +DLABEL(string5) TIGER_STRING("") +DLABEL(string6) TIGER_STRING("") +DLABEL(string7) TIGER_STRING("Colorless") +DLABEL(string8) TIGER_STRING("green") +DLABEL(string9) TIGER_STRING("ideas") +DLABEL(string10) TIGER_STRING("sleep") +DLABEL(string11) TIGER_STRING("furiously") +DLABEL(string12) TIGER_STRING("") +DLABEL(string13) TIGER_STRING("some new value") +DLABEL(string14) TIGER_STRING("Colorless") +DLABEL(string15) TIGER_STRING("Failed array ref test") +DLABEL(string16) TIGER_STRING("Failed sentence_eq test") +DLABEL(string17) TIGER_STRING("radius") +DLABEL(string18) TIGER_STRING("Failed longest_symbol test") + +#include + +CBON() + INC(SP, 10) + SET(R1, 3) + STORE(R1, 2, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 2, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R3, 3, R12) + DEC(SP, 4) + LOAD(Rt, 2, FP) + STORE(Rt, 0, R3) + SET(Rt, 0) + STORE(Rt, 3, FP) + LABEL(array0) + LOAD(Rt, 3, FP) + LOAD(R2, 2, FP) + CMP(Rt, R2) + BZ(array_end0) + SET(R1, 14) + LOAD(Rt, 3, FP) + INC(Rt, 1) + STORE(Rt, 3, FP) + ADD(Rt, Rt, R3) + STORE(R1, 0, Rt) + BR(array0) + LABEL(array_end0) + STORE(R3, 0, FP) + SET(R1, 0) + STORE(R1, 4, FP) + SET(R1, 0) + STORE(R1, 5, FP) + SET(R3, 1) + SET(R1, 1) + MUL(R3, R3, R1) + SET(R2, 2) + SET(R1, 1) + MUL(R2, R2, R1) + SET(R1, 1) + MUL(R2, R2, R1) + ADD(R3, R3, R2) + STORE(R3, 6, FP) + LABEL(for_start1) + LOAD(R1, 5, FP) + LOAD(R3, 6, FP) + CMP(R1, R3) + BG(for_end0) + LOAD(R2, 5, FP) + STORE(R2, 4, FP) + LOAD(R1, 5, FP) + INC(R1, 1) + STORE(R1, 5, FP) + BR(for_start1) + LABEL(for_end0) + LOAD(R3, 4, FP) + STORE(R3, 2, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 2, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R5, 3, R12) + DEC(SP, 4) + LOAD(Rt, 2, FP) + STORE(Rt, 0, R5) + SET(Rt, 0) + STORE(Rt, 3, FP) + LABEL(array1) + LOAD(Rt, 3, FP) + LOAD(R4, 2, FP) + CMP(Rt, R4) + BZ(array_end1) + SET(R1, string0) + STORE(R1, 4, FP) + SET(R3, 1) + SET(R1, 1) + MUL(R3, R3, R1) + SET(R2, 2) + SET(R1, 1) + MUL(R2, R2, R1) + SET(R1, 1) + MUL(R2, R2, R1) + ADD(R3, R3, R2) + STORE(R3, 5, FP) + SET(R1, 5) + STORE(R1, 6, FP) + LABEL(for_start0) + LOAD(R3, 5, FP) + LOAD(R1, 6, FP) + CMP(R3, R1) + BG(for_end1) + LOAD(R1, 4, FP) + STORE(R1, 7, FP) + SET(R1, string1) + STORE(R1, 8, FP) + MOVE(R12, SP) + INC(SP, 5) + LOAD(R1, 7, FP) + STORE(R1, 3, R12) + LOAD(R1, 8, FP) + STORE(R1, 4, R12) + STORE(FP, 2, R12) + CALL(R12, concat) + LOAD(R2, 3, R12) + DEC(SP, 5) + STORE(R2, 4, FP) + LOAD(R3, 5, FP) + INC(R3, 1) + STORE(R3, 5, FP) + BR(for_start0) + LABEL(for_end1) + LOAD(R3, 4, FP) + LOAD(Rt, 3, FP) + INC(Rt, 1) + STORE(Rt, 3, FP) + ADD(Rt, Rt, R5) + STORE(R3, 0, Rt) + BR(array1) + LABEL(array_end1) + STORE(R5, 1, FP) + SET(R5, string2) + SET(R2, 0) + LOAD(R1, 1, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R5, 1, R1) + SET(R5, string3) + SET(R2, 1) + LOAD(R1, 1, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R5, 1, R1) + SET(R5, string4) + SET(R2, 2) + LOAD(R1, 1, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R5, 1, R1) + LOAD(R1, 1, FP) + STORE(R1, 4, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 4, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, longest_symbol0) + LOAD(R1, 3, R12) + DEC(SP, 4) + STORE(R1, 2, FP) + SET(R1, string17) + STORE(R1, 3, FP) + MOVE(R12, SP) + INC(SP, 5) + LOAD(R1, 2, FP) + STORE(R1, 3, R12) + LOAD(R1, 3, FP) + STORE(R1, 4, R12) + STORE(FP, 2, R12) + CALL(R12, tstrcmp) + LOAD(R2, 3, R12) + DEC(SP, 5) + SET(R1, 0) + CMP(R2, R1) + BZ(if_true0) + SET(R2, 0) + BR(end_if1) + LABEL(if_true0) + SET(R2, 1) + LABEL(end_if1) + CMP(R2, R0) + BZ(if_false0) + MOVE(R12, SP) + INC(SP, 4) + STORE(FP, 2, R12) + CALL(R12, test_matrix0) + LOAD(R5, 3, R12) + DEC(SP, 4) + BR(end_if0) + LABEL(if_false0) + SET(R1, string18) + STORE(R1, 2, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 2, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, println) + LOAD(R5, 3, R12) + DEC(SP, 4) + LABEL(end_if0) +HALT() + +#include +LABEL(array_out_of_bounds0) + print("attempted illegal array access... halting") + HALT() +LABEL(nil_record0) + print("attempted use of a nil record... halting") + HALT() + +LABEL(longest_symbol0) + INC(SP, 7) + STORE(R13, 0, FP) + STORE(R12, 1, FP) + STORE(R1, 4, FP) + STORE(R2, 5, FP) + STORE(R3, 6, FP) + SET(R1, string5) + STORE(R1, 7, FP) + SET(R1, 0) + STORE(R1, 8, FP) + LOAD(R1, 3, FP) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R2, 3, R12) + DEC(SP, 4) + SET(R1, 1) + SUB(R2, R2, R1) + STORE(R2, 9, FP) + LABEL(for_start2) + LOAD(R1, 8, FP) + LOAD(R2, 9, FP) + CMP(R1, R2) + BG(for_end2) + LOAD(R2, 8, FP) + LOAD(R1, 3, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R2, 1, R1) + STORE(R2, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R2, 10, FP) + STORE(R2, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R2, 3, R12) + DEC(SP, 4) + LOAD(R1, 7, FP) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R1, 3, R12) + DEC(SP, 4) + CMP(R2, R1) + BLE(end_if3) + LOAD(R2, 8, FP) + LOAD(R1, 3, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R3, 1, R1) + STORE(R3, 7, FP) + LABEL(end_if3) + LOAD(R1, 8, FP) + INC(R1, 1) + STORE(R1, 8, FP) + BR(for_start2) + LABEL(for_end2) + LOAD(R3, 7, FP) + STORE(R3, 3, FP) + LOAD(R1, 4, FP) + LOAD(R2, 5, FP) + LOAD(R3, 6, FP) + LOAD(R13, 0, FP) + LOAD(R12, 1, FP) + DEC(SP, 7) + RETURN(R12, R13) +LABEL(test_matrix0) + INC(SP, 9) + STORE(R13, 0, FP) + STORE(R12, 1, FP) + STORE(R1, 4, FP) + STORE(R2, 5, FP) + STORE(R3, 6, FP) + STORE(R4, 7, FP) + SET(R1, 5) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 10, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R3, 3, R12) + DEC(SP, 4) + LOAD(Rt, 10, FP) + STORE(Rt, 0, R3) + SET(Rt, 0) + STORE(Rt, 11, FP) + LABEL(array2) + LOAD(Rt, 11, FP) + LOAD(R2, 10, FP) + CMP(Rt, R2) + BZ(array_end2) + SET(R1, string6) + LOAD(Rt, 11, FP) + INC(Rt, 1) + STORE(Rt, 11, FP) + ADD(Rt, Rt, R3) + STORE(R1, 0, Rt) + BR(array2) + LABEL(array_end2) + STORE(R3, 8, FP) + LOAD(R1, 8, FP) + STORE(R1, 9, FP) + SET(R4, string7) + SET(R2, 0) + LOAD(R1, 8, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + SET(R4, string8) + SET(R2, 1) + LOAD(R1, 9, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + SET(R4, string9) + SET(R2, 2) + LOAD(R1, 8, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + SET(R4, string10) + SET(R2, 3) + LOAD(R1, 9, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + SET(R4, string11) + SET(R2, 4) + LOAD(R1, 8, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + LOAD(R1, 8, FP) + STORE(R1, 10, FP) + LOAD(R1, 9, FP) + STORE(R1, 11, FP) + MOVE(R12, SP) + INC(SP, 5) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + LOAD(R1, 11, FP) + STORE(R1, 4, R12) + STORE(FP, 2, R12) + CALL(R12, sentence_eq0) + LOAD(R1, 3, R12) + DEC(SP, 5) + CMP(R1, R0) + BZ(if_false1) + SET(R1, 1) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 10, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R4, 3, R12) + DEC(SP, 4) + LOAD(Rt, 10, FP) + STORE(Rt, 0, R4) + SET(Rt, 0) + STORE(Rt, 11, FP) + LABEL(array3) + LOAD(Rt, 11, FP) + LOAD(R3, 10, FP) + CMP(Rt, R3) + BZ(array_end3) + SET(R1, string12) + LOAD(Rt, 11, FP) + INC(Rt, 1) + STORE(Rt, 11, FP) + ADD(Rt, Rt, R4) + STORE(R1, 0, Rt) + BR(array3) + LABEL(array_end3) + STORE(R4, 9, FP) + SET(R4, string13) + SET(R2, 0) + LOAD(R1, 9, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + STORE(R4, 1, R1) + SET(R2, 0) + LOAD(R1, 8, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R2, 1, R1) + STORE(R2, 10, FP) + SET(R1, string14) + STORE(R1, 11, FP) + MOVE(R12, SP) + INC(SP, 5) + LOAD(R2, 10, FP) + STORE(R2, 3, R12) + LOAD(R2, 11, FP) + STORE(R2, 4, R12) + STORE(FP, 2, R12) + CALL(R12, tstrcmp) + LOAD(R2, 3, R12) + DEC(SP, 5) + SET(R1, 0) + CMP(R2, R1) + BZ(if_true1) + SET(R2, 0) + BR(end_if6) + LABEL(if_true1) + SET(R2, 1) + LABEL(end_if6) + CMP(R2, R0) + BZ(if_false2) + SET(R1, 42) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, printint) + LOAD(R4, 3, R12) + DEC(SP, 4) + BR(end_if5) + LABEL(if_false2) + SET(R1, string15) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, println) + LOAD(R4, 3, R12) + DEC(SP, 4) + LABEL(end_if5) + BR(end_if4) + LABEL(if_false1) + SET(R1, string16) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, println) + LOAD(R4, 3, R12) + DEC(SP, 4) + LABEL(end_if4) + STORE(R4, 3, FP) + LOAD(R1, 4, FP) + LOAD(R2, 5, FP) + LOAD(R3, 6, FP) + LOAD(R4, 7, FP) + LOAD(R13, 0, FP) + LOAD(R12, 1, FP) + DEC(SP, 9) + RETURN(R12, R13) +LABEL(sentence_eq0) + INC(SP, 7) + STORE(R13, 0, FP) + STORE(R12, 1, FP) + STORE(R1, 5, FP) + STORE(R2, 6, FP) + STORE(R3, 7, FP) + SET(R1, 1) + STORE(R1, 8, FP) + LOAD(R1, 3, FP) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R1, 3, R12) + DEC(SP, 4) + STORE(R1, 9, FP) + LOAD(R2, 9, FP) + LOAD(R1, 4, FP) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R1, 3, R12) + DEC(SP, 4) + CMP(R2, R1) + BNZ(if_false3) + SET(R1, 0) + STORE(R1, 10, FP) + LOAD(R2, 9, FP) + SET(R1, 1) + SUB(R2, R2, R1) + STORE(R2, 11, FP) + LABEL(for_start3) + LOAD(R1, 10, FP) + LOAD(R2, 11, FP) + CMP(R1, R2) + BG(for_end3) + LOAD(R2, 10, FP) + LOAD(R1, 3, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R2, 1, R1) + STORE(R2, 12, FP) + LOAD(R2, 10, FP) + LOAD(R1, 4, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R2, 1, R1) + STORE(R2, 13, FP) + MOVE(R12, SP) + INC(SP, 5) + LOAD(R2, 12, FP) + STORE(R2, 3, R12) + LOAD(R2, 13, FP) + STORE(R2, 4, R12) + STORE(FP, 2, R12) + CALL(R12, tstrcmp) + LOAD(R2, 3, R12) + DEC(SP, 5) + SET(R1, 0) + CMP(R2, R1) + BNZ(if_true3) + SET(R3, 0) + BR(end_if11) + LABEL(if_true3) + SET(R3, 1) + LABEL(end_if11) + CMP(R3, R0) + BZ(end_if10) + SET(R3, 0) + STORE(R3, 8, FP) + BR(for_end3) + LABEL(end_if10) + LOAD(R1, 10, FP) + INC(R1, 1) + STORE(R1, 10, FP) + BR(for_start3) + LABEL(for_end3) + LOAD(R3, 8, FP) + BR(end_if7) + LABEL(if_false3) + SET(R3, 0) + LABEL(end_if7) + STORE(R3, 3, FP) + LOAD(R1, 5, FP) + LOAD(R2, 6, FP) + LOAD(R3, 7, FP) + LOAD(R13, 0, FP) + LOAD(R12, 1, FP) + DEC(SP, 7) + RETURN(R12, R13) diff --git a/test/assets/cs350/record_trees.hera b/test/assets/cs350/record_trees.hera new file mode 100644 index 0000000..4c180ad --- /dev/null +++ b/test/assets/cs350/record_trees.hera @@ -0,0 +1,254 @@ +#include + +CBON() + INC(SP, 6) + SET(R4, 2) + MOVE(R12, SP) + INC(SP, 4) + STORE(R4, 3, R12) + CALL(R12, malloc) + LOAD(R4, 3, R12) + DEC(SP, 4) + SET(R1, 4) + STORE(R1, 0, R4) + SET(R1, 0) + STORE(R1, 3, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 3, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R3, 3, R12) + DEC(SP, 4) + LOAD(Rt, 3, FP) + STORE(Rt, 0, R3) + SET(Rt, 0) + STORE(Rt, 4, FP) + LABEL(array0) + LOAD(Rt, 4, FP) + LOAD(R2, 3, FP) + CMP(Rt, R2) + BZ(array_end0) + SET(R1, 0) + LOAD(Rt, 4, FP) + INC(Rt, 1) + STORE(Rt, 4, FP) + ADD(Rt, Rt, R3) + STORE(R1, 0, Rt) + BR(array0) + LABEL(array_end0) + STORE(R3, 1, R4) + STORE(R4, 0, FP) + SET(R4, 2) + MOVE(R12, SP) + INC(SP, 4) + STORE(R4, 3, R12) + CALL(R12, malloc) + LOAD(R4, 3, R12) + DEC(SP, 4) + SET(R1, 17) + STORE(R1, 0, R4) + SET(R1, 1) + STORE(R1, 3, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 3, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R3, 3, R12) + DEC(SP, 4) + LOAD(Rt, 3, FP) + STORE(Rt, 0, R3) + SET(Rt, 0) + STORE(Rt, 4, FP) + LABEL(array1) + LOAD(Rt, 4, FP) + LOAD(R2, 3, FP) + CMP(Rt, R2) + BZ(array_end1) + LOAD(R1, 0, FP) + LOAD(Rt, 4, FP) + INC(Rt, 1) + STORE(Rt, 4, FP) + ADD(Rt, Rt, R3) + STORE(R1, 0, Rt) + BR(array1) + LABEL(array_end1) + STORE(R3, 1, R4) + STORE(R4, 1, FP) + SET(R4, 2) + MOVE(R12, SP) + INC(SP, 4) + STORE(R4, 3, R12) + CALL(R12, malloc) + LOAD(R4, 3, R12) + DEC(SP, 4) + SET(R1, 0) + STORE(R1, 0, R4) + SET(R1, 2) + STORE(R1, 3, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(Rt, 3, FP) + INC(Rt, 1) + STORE(Rt, 3, R12) + CALL(R12, malloc) + LOAD(R3, 3, R12) + DEC(SP, 4) + LOAD(Rt, 3, FP) + STORE(Rt, 0, R3) + SET(Rt, 0) + STORE(Rt, 4, FP) + LABEL(array2) + LOAD(Rt, 4, FP) + LOAD(R2, 3, FP) + CMP(Rt, R2) + BZ(array_end2) + LOAD(R1, 1, FP) + LOAD(Rt, 4, FP) + INC(Rt, 1) + STORE(Rt, 4, FP) + ADD(Rt, Rt, R3) + STORE(R1, 0, Rt) + BR(array2) + LABEL(array_end2) + STORE(R3, 1, R4) + STORE(R4, 2, FP) + LOAD(R1, 2, FP) + STORE(R1, 4, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 4, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, sum_tree0) + LOAD(R1, 3, R12) + DEC(SP, 4) + STORE(R1, 3, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 3, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, printint) + LOAD(R4, 3, R12) + DEC(SP, 4) +HALT() + +#include +LABEL(array_out_of_bounds0) + print("attempted illegal array access... halting") + HALT() +LABEL(nil_record0) + print("attempted use of a nil record... halting") + HALT() + +LABEL(sum_tree0) + INC(SP, 4) + STORE(R13, 0, FP) + STORE(R12, 1, FP) + STORE(R1, 4, FP) + STORE(R2, 5, FP) + STORE(R3, 6, FP) + LOAD(R2, 3, FP) + SET(R1, 0) + CMP(R2, R1) + BNZ(if_false0) + SET(R3, 0) + BR(end_if0) + LABEL(if_false0) + LOAD(R1, 3, FP) + CMP(R1, R0) + BZ(nil_record0) + LOAD(R3, 0, R1) + LOAD(R1, 3, FP) + CMP(R1, R0) + BZ(nil_record0) + LOAD(R2, 1, R1) + STORE(R2, 7, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R2, 7, FP) + STORE(R2, 3, R12) + LOAD(Rt, 2, FP) + STORE(Rt, 2, R12) + CALL(R12, sum_tree_list0) + LOAD(R2, 3, R12) + DEC(SP, 4) + ADD(R3, R3, R2) + LABEL(end_if0) + STORE(R3, 3, FP) + LOAD(R1, 4, FP) + LOAD(R2, 5, FP) + LOAD(R3, 6, FP) + LOAD(R13, 0, FP) + LOAD(R12, 1, FP) + DEC(SP, 4) + RETURN(R12, R13) +LABEL(sum_tree_list0) + INC(SP, 7) + STORE(R13, 0, FP) + STORE(R12, 1, FP) + STORE(R1, 4, FP) + STORE(R2, 5, FP) + STORE(R3, 6, FP) + SET(R1, 0) + STORE(R1, 7, FP) + SET(R1, 0) + STORE(R1, 8, FP) + LOAD(R1, 3, FP) + STORE(R1, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R1, 10, FP) + STORE(R1, 3, R12) + STORE(FP, 2, R12) + CALL(R12, size) + LOAD(R2, 3, R12) + DEC(SP, 4) + SET(R1, 1) + SUB(R2, R2, R1) + STORE(R2, 9, FP) + LABEL(for_start0) + LOAD(R1, 8, FP) + LOAD(R2, 9, FP) + CMP(R1, R2) + BG(for_end0) + LOAD(R2, 8, FP) + LOAD(R1, 3, FP) + CMP(R2, R0) + BL(array_out_of_bounds0) + LOAD(Rt, 0, R1) + CMP(R2, Rt) + BGE(array_out_of_bounds0) + ADD(R1, R1, R2) + LOAD(R2, 1, R1) + STORE(R2, 10, FP) + MOVE(R12, SP) + INC(SP, 4) + LOAD(R2, 10, FP) + STORE(R2, 3, R12) + LOAD(Rt, 2, FP) + STORE(Rt, 2, R12) + CALL(R12, sum_tree0) + LOAD(R2, 3, R12) + DEC(SP, 4) + LOAD(R1, 7, FP) + ADD(R3, R1, R2) + STORE(R3, 7, FP) + LOAD(R1, 8, FP) + INC(R1, 1) + STORE(R1, 8, FP) + BR(for_start0) + LABEL(for_end0) + LOAD(R3, 7, FP) + STORE(R3, 3, FP) + LOAD(R1, 4, FP) + LOAD(R2, 5, FP) + LOAD(R3, 6, FP) + LOAD(R13, 0, FP) + LOAD(R12, 1, FP) + DEC(SP, 7) + RETURN(R12, R13) diff --git a/test/test_from_cs350.py b/test/test_from_cs350.py index 1302d66..963a2ee 100644 --- a/test/test_from_cs350.py +++ b/test/test_from_cs350.py @@ -32,6 +32,20 @@ def test_lexical_scope_deep(capsys): assert captured.out == "42" +def test_array_madness(capsys): + main(["test/assets/cs350/array_madness.hera"]) + + captured = capsys.readouterr() + assert captured.out == "42" + + +def test_record_trees(capsys): + main(["test/assets/cs350/record_trees.hera"]) + + captured = capsys.readouterr() + assert captured.out == "42" + + def test_stdlib_ord(): vm = execute_program_helper(helper_stdlib("ord", "A"))