diff lwcc/cc-gencode.c @ 501:f3e9732973f1

Add basic integer operations to lwcc Add +, -, *, and / to lwcc parser and code generator. Multiplication and division require helper functions in a yet to be created support library. These operations are integer only for the moment.
author William Astle <lost@l-w.ca>
date Tue, 24 Sep 2019 22:07:56 -0600
parents c3099c5d9d3e
children 14a40f8bb4eb
line wrap: on
line diff
--- a/lwcc/cc-gencode.c	Thu Aug 29 17:00:17 2019 -0600
+++ b/lwcc/cc-gencode.c	Tue Sep 24 22:07:56 2019 -0600
@@ -43,6 +43,34 @@
         fprintf(output, "\tldd #%s\n", n->strval);
         break;
 
+    case NODE_OPER_PLUS:
+        generate_code(n->children, output);
+        fprintf(output, "\tpshs d\n");
+        generate_code(n->children->next_child, output);
+        fprintf(output, "\taddd ,s++\n");
+        break;
+    
+    case NODE_OPER_MINUS:
+        generate_code(n->children, output);
+        fprintf(output, "\tpshs d,x\n");
+        generate_code(n->children->next_child, output);
+        fprintf(output, "\tstd 2,s\n\tpuls d\n\tsubd ,s++\n");
+        break;
+
+    case NODE_OPER_TIMES:
+        generate_code(n -> children, output);
+        fprintf(output, "\tpshs d\n");
+        generate_code(n->children->next_child, output);
+        fprintf(output, "\tjsr ___mul16i\n");
+        break;
+
+    case NODE_OPER_DIVIDE:
+        generate_code(n -> children, output);
+        fprintf(output, "\tpshs d\n");
+        generate_code(n->children->next_child, output);
+        fprintf(output, "\tjsr ___div16i\n");
+        break;
+
     default:
         for (nn = n -> children; nn; nn = nn -> next_child)
             generate_code(nn, output);