@@ -2,22 +2,30 @@ package compiler
22
33/* Math */
44func add (w * OutputWriter , command AssemblyCommand ) { /* add & addi instructions */
5- WriteIndentedString (w , "%s = %s + %s\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
5+ WriteIndentedString (w , "%s = i32( %s + %s) \n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
66}
77func sub (w * OutputWriter , command AssemblyCommand ) { /* sub & subi instructions */
8- WriteIndentedString (w , "%s = %s - %s\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
8+ WriteIndentedString (w , "%s = i32( %s - %s) \n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
99}
1010func mul (w * OutputWriter , command AssemblyCommand ) { /* mul & muli instructions */
11- WriteIndentedString (w , "%s = %s * %s\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
11+ WriteIndentedString (w , "%s = i32( %s * %s) \n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
1212}
1313func div (w * OutputWriter , command AssemblyCommand ) { /* div & divi instructions */
14- WriteIndentedString (w , "%s = idiv_trunc(%s, %s)\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
14+ if command .Name == "divu" {
15+ WriteIndentedString (w , "%s = u32(idiv_trunc(u32(%s), u32(%s)))\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
16+ } else {
17+ WriteIndentedString (w , "%s = i32(idiv_trunc(i32(%s), i32(%s)))\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
18+ }
1519}
1620func rem (w * OutputWriter , command AssemblyCommand ) { /* rem & remi instructions */
17- WriteIndentedString (w , "%s = %s %% %s\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
21+ if command .Name == "remu" {
22+ WriteIndentedString (w , "%s = u32(u32(%s) %% u32(%s))\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
23+ } else {
24+ WriteIndentedString (w , "%s = i32(i32(%s) %% i32(%s))\n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]), CompileRegister (w , command .Arguments [2 ]))
25+ }
1826}
1927func neg (w * OutputWriter , command AssemblyCommand ) { /* neg & negi instructions */
20- WriteIndentedString (w , "%s = -%s \n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]))
28+ WriteIndentedString (w , "%s = i32(-i32(%s)) \n " , CompileRegister (w , command .Arguments [0 ]), CompileRegister (w , command .Arguments [1 ]))
2129}
2230
2331/** Math Descendants */
0 commit comments