Franck Pommereau

bugs fixed in cttc.py, libc/stdio passed trivial tests

......@@ -256,11 +256,11 @@ class CodeGenVisitor (Visitor) :
node.body.accept(self)
function_str = self.curr_str
self.curr_str = old_str
frame_size = self.stack.get_max_fp()
if frame_size > 0:
frame_size = abs(self.stack.get_max_fp())
if frame_size != 0:
self.o(" set R9 %X" % frame_size,
"Allocate %s words for local+temp vars" % frame_size)
self.o(" sub R9 SP SP", "... shift SP")
self.o(" sub SP R9 SP", "... shift SP")
self.stack.save_callee_saves()
self.curr_str.write(function_str.getvalue())
self._loc(node, "(exit function)")
......@@ -538,11 +538,13 @@ class CodeGenVisitor (Visitor) :
elif node.op == "<" :
self.o(" gt %s %s %s" % (right_reg, left_reg, reg), "Perform '<'")
elif node.op == ">=" :
self.o(" gt %s %s %s" % (right_reg, left_reg, reg), "Perform '>='")
self.o(" not %s %s" % (reg, reg), "... throught 'not <'")
self.o(" inc %s" % left_reg, "Perform 'a >= b'")
self.o(" gt %s %s %s" % (left_reg, right_reg, reg),
"... that is 'a+1 > b'")
elif node.op == "<=" :
self.o(" gt %s %s %s" % (left_reg, right_reg, reg), "Perform '<='")
self.o(" not %s %s" % (reg, reg), "... throught 'not >'")
self.o(" inc %s" % right_reg, "Perform 'a <= b'")
self.o(" gt %s %s %s" % (right_reg, left_reg, reg),
"... that is 'b+1 > a'")
else :
raise Exception("unsupported comparison %r" % node.op)
......@@ -550,10 +552,12 @@ class CodeGenVisitor (Visitor) :
self._loc(node)
if node.op in cparse.Binop.ASSIGN_OPS:
self._binop_assign(node)
elif node.op in ['+','-','*']:
elif node.op in ['+','-','*','/','%']:
self._binop_arith(node)
elif node.op in ['==', '!=', '<', '>', '<=', '>=']:
self._binop_compare(node)
else :
raise Exception("unsupported operation %r" % node.op)
def vNegative(self, node):
self._loc(node)
......
all:
python3 ../cct.py --arch=ttc -p -o stdio-c.asm stdio.c
cat stdio_putc.asm > stdio.asm
tail -n +14 stdio-c.asm >> stdio.asm
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
......@@ -84,8 +84,6 @@ int putu(int u, char f) {
int puti(int i) {
int n;
int s;
int r;
n = 0;
if (UINT(i) > 32767) {
n += putc(MINUS);
......@@ -137,16 +135,16 @@ int printf(char *str, ...) {
return n;
}
int main() {
puts("hello world\n");
puti(42);
puts(" => 42\n");
puti(-42);
puts(" => -42\n");
putu(42, XCHAR);
puts(" => 2A\n");
putu(42, UCHAR);
puts(" => 42\n");
printf("hello %s I'm %u (%x)\n", "stdio", 42, 42);
return 0;
}
/* int main() { */
/* puts("hello world\n"); */
/* putu(42, XCHAR); */
/* puts(" => 2A\n"); */
/* putu(42, UCHAR); */
/* puts(" => 42\n"); */
/* puti(42); */
/* puts(" => 42\n"); */
/* puti(-42); */
/* puts(" => -42\n"); */
/* printf("hello %s I'm %u (%x)\n", "stdio", 42, 42); */
/* return 0; */
/* } */
......
#
# extern int putc(char c)
#
putc:
set R8 3 # Point R8 towards argument c
add R8 SP R8 # ... located as SP+3
set R8 2 # Point R8 towards argument c
add R8 SP R8 # ... located as SP+2
ld R8 R8 # Load argument c
set R9 1012 # Put command for screen
bus R9 R8 R8 # Write char to screen
bus R9 R0 R8 # Write char to screen
set R0 1 # Set return value
ret
......