x64: ++
							parent
							
								
									d871595437
								
							
						
					
					
						commit
						9fe0ca5323
					
				| 
						 | 
					@ -177,19 +177,32 @@ fn (mut g Gen) cmp(reg Register, size Size, val i64) {
 | 
				
			||||||
	g.write8(int(val))
 | 
						g.write8(int(val))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (mut g Gen) get_var_offset(var_name string) int {
 | 
				
			||||||
 | 
						offset := g.var_offset[var_name]
 | 
				
			||||||
 | 
						if offset == 0 {
 | 
				
			||||||
 | 
							panic('0 offset for var `$var_name`')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return offset
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// `a == 1`
 | 
					// `a == 1`
 | 
				
			||||||
// `cmp DWORD [rbp-0x4],0x1`
 | 
					// `cmp DWORD [rbp-0x4],0x1`
 | 
				
			||||||
fn (mut g Gen) cmp_var(var_name string, val int) {
 | 
					fn (mut g Gen) cmp_var(var_name string, val int) {
 | 
				
			||||||
	g.write8(0x81) // 83 for 1 byte?
 | 
						g.write8(0x81) // 83 for 1 byte?
 | 
				
			||||||
	g.write8(0x7d)
 | 
						g.write8(0x7d)
 | 
				
			||||||
	offset := g.var_offset[var_name]
 | 
						offset := g.get_var_offset(var_name)
 | 
				
			||||||
	if offset == 0 {
 | 
					 | 
				
			||||||
		verror('cmp_var 0 offset $var_name')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	g.write8(0xff - offset + 1)
 | 
						g.write8(0xff - offset + 1)
 | 
				
			||||||
	g.write32(val)
 | 
						g.write32(val)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// `add DWORD [rbp-0x4], 1`
 | 
				
			||||||
 | 
					fn (mut g Gen) inc_var(var_name string) {
 | 
				
			||||||
 | 
						g.write16(0x4581) // 83 for 1 byte
 | 
				
			||||||
 | 
						offset := g.get_var_offset(var_name)
 | 
				
			||||||
 | 
						g.write8(0xff - offset + 1)
 | 
				
			||||||
 | 
						g.write32(1)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns the position of the address to jump to (set later).
 | 
					// Returns the position of the address to jump to (set later).
 | 
				
			||||||
fn (mut g Gen) jne() int {
 | 
					fn (mut g Gen) jne() int {
 | 
				
			||||||
	g.write16(0x850f)
 | 
						g.write16(0x850f)
 | 
				
			||||||
| 
						 | 
					@ -437,18 +450,8 @@ fn (mut g Gen) stmt(node ast.Stmt) {
 | 
				
			||||||
fn (mut g Gen) expr(node ast.Expr) {
 | 
					fn (mut g Gen) expr(node ast.Expr) {
 | 
				
			||||||
	// println('cgen expr()')
 | 
						// println('cgen expr()')
 | 
				
			||||||
	match node {
 | 
						match node {
 | 
				
			||||||
 | 
							ast.ArrayInit {}
 | 
				
			||||||
		ast.AssignExpr {}
 | 
							ast.AssignExpr {}
 | 
				
			||||||
		ast.IntegerLiteral {}
 | 
					 | 
				
			||||||
		ast.FloatLiteral {}
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		ast.UnaryExpr {
 | 
					 | 
				
			||||||
			g.expr(it.left)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
		ast.StringLiteral {}
 | 
					 | 
				
			||||||
		ast.InfixExpr {}
 | 
					 | 
				
			||||||
		// `user := User{name: 'Bob'}`
 | 
					 | 
				
			||||||
		ast.StructInit {}
 | 
					 | 
				
			||||||
		ast.CallExpr {
 | 
							ast.CallExpr {
 | 
				
			||||||
			if it.name in ['println', 'print', 'eprintln', 'eprint'] {
 | 
								if it.name in ['println', 'print', 'eprintln', 'eprint'] {
 | 
				
			||||||
				expr := it.args[0].expr
 | 
									expr := it.args[0].expr
 | 
				
			||||||
| 
						 | 
					@ -457,12 +460,19 @@ fn (mut g Gen) expr(node ast.Expr) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			g.call_fn(it.name)
 | 
								g.call_fn(it.name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ast.ArrayInit {}
 | 
							ast.FloatLiteral {}
 | 
				
			||||||
		ast.Ident {}
 | 
							ast.Ident {}
 | 
				
			||||||
		ast.BoolLiteral {}
 | 
					 | 
				
			||||||
		ast.IfExpr {
 | 
							ast.IfExpr {
 | 
				
			||||||
			g.if_expr(it)
 | 
								g.if_expr(it)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							ast.InfixExpr {}
 | 
				
			||||||
 | 
							ast.IntegerLiteral {}
 | 
				
			||||||
 | 
							ast.PostfixExpr {
 | 
				
			||||||
 | 
								g.postfix_expr(it)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ast.StringLiteral {}
 | 
				
			||||||
 | 
							ast.StructInit {}
 | 
				
			||||||
 | 
							ast.BoolLiteral {}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			// println(term.red('x64.expr(): bad node'))
 | 
								// println(term.red('x64.expr(): bad node'))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -563,6 +573,17 @@ fn (mut g Gen) fn_decl(it ast.FnDecl) {
 | 
				
			||||||
	g.ret()
 | 
						g.ret()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (mut g Gen) postfix_expr(node ast.PostfixExpr) {
 | 
				
			||||||
 | 
						if !(node.expr is ast.Ident) {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ident := node.expr as ast.Ident
 | 
				
			||||||
 | 
						var_name := ident.name
 | 
				
			||||||
 | 
						if node.op == .inc {
 | 
				
			||||||
 | 
							g.inc_var(var_name)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn verror(s string) {
 | 
					fn verror(s string) {
 | 
				
			||||||
	util.verror('x64 gen error', s)
 | 
						util.verror('x64 gen error', s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,10 @@ fn test() {
 | 
				
			||||||
	if a == 2 {
 | 
						if a == 2 {
 | 
				
			||||||
		println('a == 2')
 | 
							println('a == 2')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						a++
 | 
				
			||||||
 | 
						if a == 2 {
 | 
				
			||||||
 | 
							println('now a == 2')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,3 @@
 | 
				
			||||||
a == 1
 | 
					a == 1
 | 
				
			||||||
b == 2
 | 
					b == 2
 | 
				
			||||||
 | 
					now a == 2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue