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

str[index] and list[index] done

parent 76653770
No related branches found
No related tags found
No related merge requests found
Pipeline #473 failed with stages
in 26 minutes and 14 seconds
......@@ -967,8 +967,52 @@ public class CodeGenImpl extends CodeGenBase {
return null;
}
@Override
public Void analyze(IndexExpr node) {
node.list.dispatch(this);
node.index.dispatch(this);
RiscVBackend.Register listReg = T6, indexReg = T5, lenReg = A7;
betterBackend.emitPop(indexReg, "IndexExpr: Get Index");
betterBackend.emitPop(listReg, "IndexExpr: Get List/str ptr");
backend.emitLW(lenReg, listReg, 3*backend.getWordSize(), "IndexExpr: Get List/str length");
backend.emitADDI(listReg, listReg, 4*backend.getWordSize(), "IndexExpr: listPtr = list.data");
String labelPrefix = getLabelPrefix();
Label skipTranslateNegIndex = new Label(labelPrefix + ".fuckNegIndexEnd");
// Get real index.
backend.emitBGEZ(indexReg, skipTranslateNegIndex, "IndexExpr: Skip neg index op");
backend.emitADD(indexReg, indexReg, lenReg, "IndexExpr: Add length to negative index.");
backend.emitBLTZ(indexReg, errorOob, "IndexExpr: Exception: negative index still negative after adding length. FUCK IT!!!");
backend.emitLocalLabel(skipTranslateNegIndex, "IndexExpr: DO REAL ACCESS");
// Do real access!
backend.emitBGE(indexReg, lenReg, errorOob, "IndexExpr: Exception: index larger than length. FUCK IT.");
if(!node.list.getInferredType().equals(SymbolType.STR_TYPE)) {
assert backend.getWordSize() == 4;
backend.emitSLLI(indexReg, indexReg, 2, "IndexExpr: for list, element size = 4 char, so: indexReg *= 4");
}
backend.emitADD(listReg, listReg, indexReg, "IndexExpr: listPtr += index");
backend.emitLW(listReg, listReg, 0, "IndexExpr: result = *listPtr (reuse listPtr)");
// listReg,indexReg,lenReg die. listReg => elementReg.
if(node.list.getInferredType().equals(SymbolType.STR_TYPE)) {
// lenReg => newStrLenReg
backend.emitANDI(listReg, listReg, 0x000000FF, "IndexExpr: for string element, wipe higher 3 chars, leave only 1 char");
backend.emitLI(lenReg, 1+4, "IndexExpr: result string object size = 4+1 = 5");
betterBackend.emitAllocPrototype(SymbolType.STR_TYPE, lenReg);
backend.emitLI(lenReg, 1, "IndexExpr: result string len = 1");
backend.emitSW(lenReg, A0, 3*backend.getWordSize(), "IndexExpr: result string.len");
backend.emitSW(listReg, A0, 4*backend.getWordSize(), "IndexExpr: result string.data");
backend.emitMV(listReg, A0, "IndexExpr: move result string to resultReg");
}
// listReg => resultReg.
betterBackend.emitPush(listReg, "IndexExpr: push result!");
return null;
}
// FIXME: More, of course.
}
......
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