Skip to content

Commit

Permalink
Added support for p-registers to allow register access in calling fun…
Browse files Browse the repository at this point in the history
…ction's stack
  • Loading branch information
danielperano committed Feb 21, 2025
1 parent 3ea9a2e commit 8a508b2
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 9 deletions.
14 changes: 10 additions & 4 deletions src/main/java/myworld/hummingbird/assembler/Assembler.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public Assembler(){
labelUse = Pattern.compile("\\$(\\$)?\\w+");
symbolName = Pattern.compile("\\D\\w+");
symbolUse = Pattern.compile("%\\D\\w+");
register = Pattern.compile("r\\d+");
register = Pattern.compile("[rp]\\d+");
instruction = Pattern.compile("\\w+");
intLiteral = Pattern.compile("[IiLl]?(0x|0b|0o)?-?\\d+");
floatLiteral = Pattern.compile("[FfDd]-?\\d*((\\.)?\\d+)?([eE]-?\\d+)?");
Expand Down Expand Up @@ -316,10 +316,16 @@ protected int parseRegister(CharStream asm) throws AssemblyException {
try{
var sequence = consume(asm, register);
if(sequence != null) {
var str = sequence.subSequence(1, sequence.length()).toString(); // Drop leading 'r'
return Integer.parseInt(str);
return switch (sequence.charAt(0)){
// Drop leading 'r' or 'p' and parse reference.
case 'r' -> Integer.parseInt(sequence.subSequence(1, sequence.length()).toString());
case 'p' -> -(Integer.parseInt(sequence.subSequence(1, sequence.length()).toString()) + Fiber.CALL_FRAME_SAVED_REGISTERS + 1);
default -> throw new AssemblyException("Invalid register reference: " + asm.debug(10));
};
}
}catch (Exception e){}
}catch (Exception e){
throw new AssemblyException("Invalid register reference: " + asm.debug(10));
}
throw new AssemblyException("Invalid register reference: " + asm.debug(10));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ static int dispatchCall(Fiber fiber, Opcode ins, int regOffset, int ip, int targ
}

ip = target;
return ip;
return -ip;
}

static int foreignCall(Fiber fiber, Opcode ins, int regOffset, int ip, int symbolIndex){
Expand All @@ -33,6 +33,7 @@ static int foreignCall(Fiber fiber, Opcode ins, int regOffset, int ip, int symbo
ip = ip + 1;
try {
func.call(fiber.vm, fiber);
fiber.restoreCallContext();
} catch (Exception e) {
ip = fiber.vm.trap(e, fiber.registers, ip);
}
Expand Down
4 changes: 4 additions & 0 deletions src/test/java/myworld/hummingbird/test/TestPrograms.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ public class TestPrograms {
public final HummingbirdVM countOneMillion = load("myworld/hummingbird/test/programs/countOneMillion.hasm");
public final HummingbirdVM callOneMillion = load("myworld/hummingbird/test/programs/callOneMillion.hasm");
public final HummingbirdVM fibonacci30 = load("myworld/hummingbird/test/programs/fibonacci30.hasm");
public final HummingbirdVM fibonacci30Call0 = load("myworld/hummingbird/test/programs/fibonacci30Call0.hasm");
public final HummingbirdVM goldenRatio = load("myworld/hummingbird/test/programs/goldenRatio.hasm");
public final HummingbirdVM simpleFunction = load("myworld/hummingbird/test/programs/simpleFunction.hasm");
public final HummingbirdVM simpleFiber = load("myworld/hummingbird/test/programs/simpleFiber.hasm");
public final HummingbirdVM recursiveAdd = load("myworld/hummingbird/test/programs/recursiveAdd.hasm");
public final HummingbirdVM recursiveCountOneMillion = load("myworld/hummingbird/test/programs/recursiveCountOneMillion.hasm");
public final HummingbirdVM mathBench = load("myworld/hummingbird/test/programs/mathBench.hasm");

Expand All @@ -41,8 +43,10 @@ public Map<String, HummingbirdVM> hvmTestPrograms(){
programs.put("countOneMillion", countOneMillion);
programs.put("callOneMillion", callOneMillion);
programs.put("fibonacci30", fibonacci30);
programs.put("fibonacci30Call0", fibonacci30Call0);
programs.put("simpleFiber", simpleFiber);
programs.put("simpleFunction", simpleFunction);
programs.put("recursiveAdd", recursiveAdd);
programs.put("recursiveCountOneMillion", recursiveCountOneMillion);
programs.put("goldenRatio", goldenRatio);
programs.put("mathBench", mathBench);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
.code
CONST r0, 0
CONST r1, 1000000
CONST r2, 1
loop:
CALL0 r4, $callOneMillion
ADD r0, r0, r4
CALL0 r3, $callOneMillion
ADD r0, r0, r3
IFLT r0, r1, $loop
RETURN r0
callOneMillion:
CONST r0, 1
RETURN r0
RETURN p0
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
.symbols
fibonacci function $fibonacci
long
parameters 3
registers 7

.code
# fib(30)
CONST r1, 30
CALL0 r2, $fibonacci#, r1, 1
RETURN r2
fibonacci: # int fibonacci(n)
CONST r2, 2
IFGE p0, r2, $recurse
RETURN p0
recurse:
#fib(n - 1)
CONST r1, 1
SUB r3, p0, r1 # r0 = n - 1
#COPY r3, r0
CALL0 r4, $fibonacci #, r0, 1

#fib(n - 2)
SUB r5, r3, r1 # r0 = n - 2
#COPY r5, r0
CALL0 r6, $fibonacci #, r0, 1

ADD r0, r4, r6
RETURN r0
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.code
CONST r0, 1
CONST r1, 10
CALL0 r2, $add
RETURN r2
add:
IFEQ p0, p1, $done
CONST r1, 1
ADD r0, p1, r1
COPY r1, p0
CALL0 r2, $add
RETURN r2
done:
RETURN p1

0 comments on commit 8a508b2

Please sign in to comment.