Skip to content
Snippets Groups Projects
Verified Commit e77ef040 authored by Recolic Keghart's avatar Recolic Keghart
Browse files

Merge branch 'master' into fix-function-call

parents cbfda342 e4277730
No related branches found
No related tags found
No related merge requests found
CLEAN=mvn clean package
TEST=java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..s --run --dir src/test/data/pa3/sample/ --test
TESTB=java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..s --run --dir src/test/data/pa3/benchmarks/ --test
FILE=op_logical
FILE=op_mul
FILEB=exp
clean:
$(CLEAN)
test:
......@@ -17,8 +19,15 @@ assembly:
reference-assembly:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..r src/test/data/pa3/sample/$(FILE).py.ast.typed --out src/test/data/pa3/sample/$(FILE).py.s
testb:
test-bench:
$(TESTB)
clean-testb:
clean-test-bench:
$(CLEAN) ; $(TESTB)
single-test-bench:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrs --run src/test/data/pa3/benchmarks/$(FILEB).py
reference-bench:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrr --run src/test/data/pa3/benchmarks/$(FILEB).py
assembly-bench:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..s src/test/data/pa3/benchmarks/$(FILEB).py.ast.typed --out src/test/data/pa3/benchmarks/$(FILEB).py.s
reference-assembly-bench:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..r src/test/data/pa3/benchmarks/$(FILEB).py.ast.typed --out src/test/data/pa3/benchmarks/$(FILEB).py.s
......@@ -5,9 +5,9 @@ src/test/data/pa3/sample/id_global.py
src/test/data/pa3/sample/id_local.py
src/test/data/pa3/sample/var_assign.py
src/test/data/pa3/sample/call.py
src/test/data/pa3/sample/call_with_args.py
src/test/data/pa3/sample/nested.py
src/test/data/pa3/sample/nested2.py
src/test/data/pa3/sample/call_with_args.py # NOT DONE
src/test/data/pa3/sample/nested.py # NOT DONE
src/test/data/pa3/sample/nested2.py # NOT DONE
src/test/data/pa3/sample/op_add.py
src/test/data/pa3/sample/op_cmp_bool.py
src/test/data/pa3/sample/op_cmp_int.py
......@@ -19,5 +19,5 @@ src/test/data/pa3/sample/op_sub.py
src/test/data/pa3/sample/stmt_if.py
src/test/data/pa3/sample/stmt_while.py
src/test/data/pa3/sample/stmt_return_early.py
src/test/data/pa3/benchmarks/exp.py
src/test/data/pa3/benchmarks/prime.py
exp.py
prime.py
......@@ -367,7 +367,7 @@ public class CodeGenImpl extends CodeGenBase {
for(Stmt stmt : node.thenBody) {
stmt.dispatch(this);
}
backend.emitJ(exitLabel, "IfStmt: Else body done. jump to end.");
backend.emitJ(exitLabel, "IfStmt: THEN body done. jump to end.");
backend.emitLocalLabel(elseLabel, "IfStmt: ELSE");
for(Stmt stmt : node.elseBody) {
stmt.dispatch(this);
......@@ -495,12 +495,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitADD(T0, T0, T1, "Add operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "-":
......@@ -509,13 +508,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitSUB(T0, T1, T0, "Subtract operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "*":
......@@ -524,13 +521,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitMUL(T0, T1, T0, "Subtract operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "//":
......@@ -539,13 +534,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitDIV(T0, T1, T0, "Subtract operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "%":
......@@ -554,13 +547,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitREM(T0, T1, T0, "Subtract operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "==":
......@@ -570,13 +561,12 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitXOR(T0, T0, T1, "== operator on BOOL/INT");
backend.emitSEQZ(T0, T0, "Set to 1 if XOR results in 0, they were equal");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
......@@ -587,15 +577,14 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitXOR(T0, T0, T1, "!= operator on BOOL/INT");
backend.emitSNEZ(T0, T0, "Set to 1 if XOR was not 0, they were not equal");
// Don't think we need to do the SEQZ/SNEZ instructions here because XOR will already result in 1
// if they are not equal, which is the desired result.
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "<=":
......@@ -604,13 +593,12 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitADDI(T1, T1, -1, "decrement LEFT by 1");
backend.emitSLT(T1, T1, T0, "LEFT <=? RIGHT");
backend.emitSW(T1, SP, 0, "Push result onto stack");
betterBackend.emitPush(T1, "Push result onto stack");
return null;
}
case ">=":
......@@ -619,13 +607,12 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitADDI(T0, T0, -1, "decrement RIGHT by 1");
backend.emitSLT(T1, T0, T1, "LEFT >=? RIGHT");
backend.emitSW(T1, SP, 0, "Push result onto stack");
betterBackend.emitPush(T1, "Push result onto stack");
return null;
}
case "<":
......@@ -634,12 +621,11 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitSLT(T1, T1, T0, "LEFT <? RIGHT");
backend.emitSW(T1, SP, 0, "Push result onto stack");
betterBackend.emitPush(T1, "Push result onto stack");
return null;
}
case ">":
......@@ -648,42 +634,43 @@ public class CodeGenImpl extends CodeGenBase {
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitSLT(T1, T0, T1, "LEFT >? RIGHT");
backend.emitSW(T1, SP, 0, "Push result onto stack");
betterBackend.emitPush(T1, "Push result onto stack");
return null;
}
case "and":
if (binaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
if (binaryExpr.getInferredType().equals(SymbolType.BOOL_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T1, "Load operand 1 into t1");
backend.emitAND(T0, T1, T0, "AND operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
Label skipSecond = generateLocalLabel();
backend.emitBEQZ(T1, skipSecond, "If operand 1 is FALSE, don't eval second");
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
binaryExpr.right.dispatch(this);
betterBackend.emitPop(T0, "Load operand 2 into t0");
backend.emitAND(T1, T1, T0, "AND operands");
backend.emitLocalLabel(skipSecond, "After second operand");
betterBackend.emitPush(T1, "Push result onto stack");
return null;
}
case "or":
if (binaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
if (binaryExpr.getInferredType().equals(SymbolType.BOOL_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
binaryExpr.left.dispatch(this);
betterBackend.emitPop(T0, "Load operand 1 into t0");
Label skipSecond = generateLocalLabel();
backend.emitBNEZ(T0, skipSecond, "If first is not zero (it's true), skip second");
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
betterBackend.emitPop(T0, "Load operand 2 into t0");
backend.emitOR(T0, T1, T0, "OR operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
backend.emitLocalLabel(skipSecond, "Skip past second operand");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
}
......@@ -695,27 +682,23 @@ public class CodeGenImpl extends CodeGenBase {
public Void analyze(UnaryExpr unaryExpr) {
switch (unaryExpr.operator) {
case "-":
if (unaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
if (unaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
unaryExpr.operand.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
betterBackend.emitPop(T0, "Load operand into t0");
backend.emitSUB(T0, ZERO, T0, "Subtract operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
case "not":
if (unaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
if (unaryExpr.getInferredType().equals(SymbolType.BOOL_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
unaryExpr.operand.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
betterBackend.emitPop(T0, "Load operand into t0");
backend.emitSEQZ(T0, T0, "NOT operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
betterBackend.emitPush(T0, "Push result onto stack");
return null;
}
}
......
......@@ -15,10 +15,6 @@
.equiv @error_none, 4
.equiv @error_oom, 5
.equiv @error_nyi, 6
.equiv @listHeaderWords, 4
.equiv @strHeaderWords, 4
.equiv @bool.True, const_1
.equiv @bool.False, const_0
.data
......@@ -90,62 +86,64 @@ main:
add s11, s10, s11 # Set end of heap (= start of heap + heap size)
mv ra, zero # No normal return from main program.
mv fp, zero # No preceding frame.
mv fp, zero # Top saved FP is 0.
mv ra, zero # No function return from top level.
addi sp, sp, -@..main.size # Reserve space for stack frame.
sw ra, @..main.size-4(sp) # return address
sw fp, @..main.size-8(sp) # control link
addi fp, sp, @..main.size # New fp is at old SP.
jal initchars # Initialize one-character strings.
addi sp, fp, -16 # Set SP to last argument.
jal $f # Invoke function: f
addi sp, fp, -@..main.size # Set SP to stack frame top.
bnez a0, label_2 # Branch on true.
addi sp, fp, -16 # Set SP to last argument.
jal $g # Invoke function: g
addi sp, fp, -@..main.size # Set SP to stack frame top.
beqz a0, label_1 # Branch on false.
label_2::
addi sp, fp, -16 # Set SP to last argument.
jal $g # Invoke function: g
addi sp, fp, -@..main.size # Set SP to stack frame top.
beqz a0, label_4 # Branch on false.
addi sp, fp, -16 # Set SP to last argument.
jal $f # Invoke function: f
addi sp, fp, -@..main.size # Set SP to stack frame top.
beqz a0, label_4 # Branch on false.
la a0, const_2 # Load string literal
sw a0, -16(fp) # Push argument 0 from last.
addi sp, fp, -16 # Set SP to last argument.
jal $print # Invoke function: print
addi sp, fp, -@..main.size # Set SP to stack frame top.
j label_3 # Then body complete; jump to end-if
label_4: # Else body
addi sp, fp, -16 # Set SP to last argument.
jal $f # Invoke function: f
addi sp, fp, -@..main.size # Set SP to stack frame top.
beqz a0, label_5 # Operator and: short-circuit left operand
addi sp, fp, -16 # Set SP to last argument.
jal $g # Invoke function: g
addi sp, fp, -@..main.size # Set SP to stack frame top.
bnez a0, label_6 # Operator or: short-circuit left operand
addi sp, fp, -16 # Set SP to last argument.
jal $f # Invoke function: f
addi sp, fp, -@..main.size # Set SP to stack frame top.
label_6: # Done evaluating operator: or
label_5: # Done evaluating operator: and
seqz a0, a0 # Logical not
la t0, const_0 # Address of False object
slli a0, a0, 4 # Get offset of right bool object
add a0, t0, a0 # Get bool object
sw a0, -16(fp) # Push argument 0 from last.
addi sp, fp, -16 # Set SP to last argument.
jal $print # Invoke function: print
addi sp, fp, -@..main.size # Set SP to stack frame top.
label_3: # End of if-else statement
label_1: # End of if-else statement
.equiv @..main.size, 16
label_0: # End of program
addi sp, sp, -8 # Saved FP and saved RA (unused at top level).
sw zero, 0(sp) # Top saved FP is 0.
sw zero, 4(sp) # Top saved RA is 0.
addi fp, sp, 8 # Set FP to previous SP.
addi sp, sp, -4 # Increment by 1 for condition
addi sp, sp, -4 # Increment stack ptr for first operand
jal $f # Invoke function
lw t0, 0(sp) # Load operand 1 into t1
addi sp, sp, 4 # Decrement stack ptr for first operand
bnez t0, label_1 # If first is not zero (it's true), skip second
addi sp, sp, -4 # Increment stack ptr for second operand
jal $g # Invoke function
lw t0, 0(sp) # Load operand 2 into t0
addi sp, sp, 4 # Decrement stack ptr for second operand
or t0, t1, t0 # OR operands
label_1: # Skip past second operand
sw t0, 0(sp) # Push result onto stack
lw t6, 0(sp) # IfStmt: Get condition
addi sp, sp, 4 # IfStmt: Get condition
beq zero, t6, $if427.else # IfStmt: If condition is false, jump to else.
addi sp, sp, -4 # Increment by 1 for condition
addi sp, sp, -4 # Increment stack ptr for first operand
jal $g # Invoke function
lw t1, 0(sp) # Load operand 1 into t1
addi sp, sp, 4 # Decrement stack ptr for first operand
beqz t1, label_2 # If operand 1 is FALSE, don't eval second
addi sp, sp, -4 # Increment stack ptr for first operand
jal $f # Invoke function
lw t0, 0(sp) # Load operand 2 into t0
addi sp, sp, 4 # Decrement stack ptr for second operand
and t1, t1, t0 # AND operands
label_2: # After second operand
sw t1, 0(sp) # Push result onto stack
lw t6, 0(sp) # IfStmt: Get condition
addi sp, sp, 4 # IfStmt: Get condition
beq zero, t6, $if428.else # IfStmt: If condition is false, jump to else.
addi sp, sp, -4 # Increment stack ptr by 1
la a0, const_2 # Load string addr into a0
sw a0, 0(sp) # Push on stack
lw t0, 0(sp) # Load param for boxing
mv a0, t0 # move string ptr to A0
sw a0, 0(sp) # put boxed argument back on stack
jal $print # Invoke function
addi sp, sp, 4 # Decrement stack ptr by 1
j $if428.exit # IfStmt: Else body done. jump to end.
$if428.else: # IfStmt: ELSE
addi sp, sp, -4 # Increment stack ptr by 1
lw t0, 0(sp) # Load param for boxing
la a0, const_0 # Load FALSE bool
slli t0, t0, 4 # Compute offset to correct object
add a0, a0, t0 # Add offset to curr pointer
sw a0, 0(sp) # put boxed argument back on stack
jal $print # Invoke function
addi sp, sp, 4 # Decrement stack ptr by 1
$if428.exit: # IfStmt: DONE
j $if427.exit # IfStmt: Else body done. jump to end.
$if427.else: # IfStmt: ELSE
$if427.exit: # IfStmt: DONE
li a0, 10 # Code for ecall: exit
ecall
......@@ -243,46 +241,50 @@ $input:
.globl $f
$f:
addi sp, sp, -@f.size # Reserve space for stack frame.
sw ra, @f.size-4(sp) # return address
sw fp, @f.size-8(sp) # control link
addi fp, sp, @f.size # New fp is at old SP.
la a0, const_7 # Load string literal
sw a0, -16(fp) # Push argument 0 from last.
addi sp, fp, -16 # Set SP to last argument.
jal $print # Invoke function: print
addi sp, fp, -@f.size # Set SP to stack frame top.
li a0, 1 # Load boolean literal: true
j label_8 # Go to return
mv a0, zero # Load None
j label_8 # Jump to function epilogue
label_8: # Epilogue
.equiv @f.size, 16
lw ra, -4(fp) # Get return address
lw fp, -8(fp) # Use control link to restore caller's fp
addi sp, sp, @f.size # Restore stack pointer
sw fp, 0(sp) # Save old FP
sw ra, -4(sp) # Save RA
addi sp, sp, -8 # Increment stack pointer 2 places
addi fp, sp, 4 # FP is one slot below top of stack
addi sp, sp, -4 # Increment stack ptr by 1
la a0, const_7 # Load string addr into a0
sw a0, 0(sp) # Push on stack
lw t0, 0(sp) # Load param for boxing
mv a0, t0 # move string ptr to A0
sw a0, 0(sp) # put boxed argument back on stack
jal $print # Invoke function
addi sp, sp, 4 # Decrement stack ptr by 1
li a0, 1 # Load boolean literal into a0
sw a0, 0(sp) # Push on stack
lw a0, 0(sp) # Load return value into A0
j label_3 # Jump to epilogue
mv a0, zero # Returning None implicitly
label_3: # Epilogue
lw ra, 0(fp) # Restore RA
lw fp, 4(fp) # Restore old FP
jr ra # Return to caller
.globl $g
$g:
addi sp, sp, -@g.size # Reserve space for stack frame.
sw ra, @g.size-4(sp) # return address
sw fp, @g.size-8(sp) # control link
addi fp, sp, @g.size # New fp is at old SP.
la a0, const_8 # Load string literal
sw a0, -16(fp) # Push argument 0 from last.
addi sp, fp, -16 # Set SP to last argument.
jal $print # Invoke function: print
addi sp, fp, -@g.size # Set SP to stack frame top.
li a0, 0 # Load boolean literal: false
j label_10 # Go to return
mv a0, zero # Load None
j label_10 # Jump to function epilogue
label_10: # Epilogue
.equiv @g.size, 16
lw ra, -4(fp) # Get return address
lw fp, -8(fp) # Use control link to restore caller's fp
addi sp, sp, @g.size # Restore stack pointer
sw fp, 0(sp) # Save old FP
sw ra, -4(sp) # Save RA
addi sp, sp, -8 # Increment stack pointer 2 places
addi fp, sp, 4 # FP is one slot below top of stack
addi sp, sp, -4 # Increment stack ptr by 1
la a0, const_8 # Load string addr into a0
sw a0, 0(sp) # Push on stack
lw t0, 0(sp) # Load param for boxing
mv a0, t0 # move string ptr to A0
sw a0, 0(sp) # put boxed argument back on stack
jal $print # Invoke function
addi sp, sp, 4 # Decrement stack ptr by 1
li a0, 0 # Load boolean literal into a0
sw a0, 0(sp) # Push on stack
lw a0, 0(sp) # Load return value into A0
j label_4 # Jump to epilogue
mv a0, zero # Returning None implicitly
label_4: # Epilogue
lw ra, 0(fp) # Restore RA
lw fp, 4(fp) # Restore old FP
jr ra # Return to caller
.globl alloc
......@@ -345,219 +347,6 @@ heap.init:
ecall # Request A1 bytes
jr ra # Return to caller
.globl concat
concat:
addi sp, sp, -12
sw ra, 8(sp)
sw fp, 4(sp)
addi fp, sp, 12
lw t0, 4(fp)
lw t1, 0(fp)
beqz t0, concat_none
beqz t1, concat_none
lw t0, @.__len__(t0)
lw t1, @.__len__(t1)
add t1, t0, t1
sw t1, -12(fp)
addi a1, t1, @listHeaderWords
la a0, $.list$prototype
jal alloc2
lw t0, -12(fp)
sw t0, @.__len__(a0)
addi t2, a0, @.__elts__
lw t0, 4(fp)
lw t1, @.__len__(t0)
addi t0, t0, 16
concat_1:
beqz t1, concat_2
lw t3, 0(t0)
sw t3, 0(t2)
addi t1, t1, -1
addi t0, t0, 4
addi t2, t2, 4
j concat_1
concat_2:
lw t0, 0(fp)
lw t1, @.__len__(t0)
addi t0, t0, @.__elts__
concat_3:
beqz t1, concat_4
lw t3, 0(t0)
sw t3, 0(t2)
addi t1, t1, -1
addi t0, t0, 4
addi t2, t2, 4
j concat_3
concat_4:
lw ra, -4(fp)
lw fp, -8(fp)
addi sp, sp, 12
jr ra
concat_none:
j error.None
.globl conslist
conslist:
addi sp, sp, -8
sw ra, 4(sp)
sw fp, 0(sp)
addi fp, sp, 8
lw a1, 0(fp)
la a0, $.list$prototype
beqz a1, conslist_done
addi a1, a1, @listHeaderWords
jal alloc2
lw t0, 0(fp)
sw t0, @.__len__(a0)
slli t1, t0, 2
add t1, t1, fp
addi t2, a0, @.__elts__
conslist_1:
lw t3, 0(t1)
sw t3, 0(t2)
addi t1, t1, -4
addi t2, t2, 4
addi t0, t0, -1
bnez t0, conslist_1
conslist_done:
lw ra, -4(fp)
lw fp, -8(fp)
addi sp, sp, 8
jr ra
.globl strcat
strcat:
addi sp, sp, -12
sw ra, 8(sp)
sw fp, 4(sp)
addi fp, sp, 12
lw t0, 4(fp)
lw t1, 0(fp)
lw t0, @.__len__(t0)
beqz t0, strcat_4
lw t1, @.__len__(t1)
beqz t1, strcat_5
add t1, t0, t1
sw t1, -12(fp)
addi t1, t1, 4
srli t1, t1, 2
addi a1, t1, @listHeaderWords
la a0, $str$prototype
jal alloc2
lw t0, -12(fp)
sw t0, @.__len__(a0)
addi t2, a0, 16
lw t0, 4(fp)
lw t1, @.__len__(t0)
addi t0, t0, @.__str__
strcat_1:
beqz t1, strcat_2
lbu t3, 0(t0)
sb t3, 0(t2)
addi t1, t1, -1
addi t0, t0, 1
addi t2, t2, 1
j strcat_1
strcat_2:
lw t0, 0(fp)
lw t1, 12(t0)
addi t0, t0, 16
strcat_3:
beqz t1, strcat_6
lbu t3, 0(t0)
sb t3, 0(t2)
addi t1, t1, -1
addi t0, t0, 1
addi t2, t2, 1
j strcat_3
strcat_4:
lw a0, 0(fp)
j strcat_7
strcat_5:
lw a0, 4(fp)
j strcat_7
strcat_6:
sb zero, 0(t2)
strcat_7:
lw ra, -4(fp)
lw fp, -8(fp)
addi sp, sp, 12
jr ra
.globl streql
streql:
addi sp, sp, -8
sw ra, 4(sp)
sw fp, 0(sp)
addi fp, sp, 8
lw a1, 4(fp)
lw a2, 0(fp)
lw t0, @.__len__(a1)
lw t1, @.__len__(a2)
bne t0, t1, streql_no
streql_1:
lbu t2, @.__str__(a1)
lbu t3, @.__str__(a2)
bne t2, t3, streql_no
addi a1, a1, 1
addi a2, a2, 1
addi t0, t0, -1
bgtz t0, streql_1
li a0, 1
j streql_end
streql_no:
xor a0, a0, a0
streql_end:
lw ra, -4(fp)
lw fp, -8(fp)
addi sp, sp, 8
jr ra
.globl strneql
strneql:
addi sp, sp, -8
sw ra, 4(sp)
sw fp, 0(sp)
addi fp, sp, 8
lw a1, 4(fp)
lw a2, 0(fp)
lw t0, @.__len__(a1)
lw t1, @.__len__(a2)
bne t0, t1, strneql_yes
strneql_1:
lbu t2, @.__str__(a1)
lbu t3, @.__str__(a2)
bne t2, t3, strneql_yes
addi a1, a1, 1
addi a2, a2, 1
addi t0, t0, -1
bgtz t0, strneql_1
xor a0, a0, a0
j strneql_end
strneql_yes:
li a0, 1
strneql_end:
lw ra, -4(fp)
lw fp, -8(fp)
addi sp, sp, 8
jr ra
.globl initchars
initchars:
jr ra
.globl error.None
error.None:
li a0, 4 # Exit code for: Operation on None
......@@ -567,14 +356,14 @@ error.None:
.globl error.Div
error.Div:
li a0, 2 # Exit code for: Divison by zero
li a0, 4 # Exit code for: Divison by zero
la a1, const_11 # Load error message as str
addi a1, a1, 16 # Load address of attribute __str__
j abort # Abort
.globl error.OOB
error.OOB:
li a0, 3 # Exit code for: Index out of bounds
li a0, 4 # Exit code for: Index out of bounds
la a1, const_12 # Load error message as str
addi a1, a1, 16 # Load address of attribute __str__
j abort # Abort
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment