Add a load of binops
Этот коммит содержится в:
		
							родитель
							
								
									6607cff14e
								
							
						
					
					
						коммит
						cc5a29d759
					
				
					 1 изменённых файлов: 25 добавлений и 7 удалений
				
			
		
							
								
								
									
										32
									
								
								tgo.go
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								tgo.go
									
										
									
									
									
								
							| 
						 | 
					@ -199,8 +199,6 @@ func (c *Compiler) parseFuncDecl(pkgName string, f *ssa.Function) (*Frame, error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
 | 
					func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
 | 
				
			||||||
	fmt.Println("func:", f.Name())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	llvmFn := c.mod.NamedFunction(frame.name)
 | 
						llvmFn := c.mod.NamedFunction(frame.name)
 | 
				
			||||||
	start := c.ctx.AddBasicBlock(llvmFn, "start")
 | 
						start := c.ctx.AddBasicBlock(llvmFn, "start")
 | 
				
			||||||
	c.builder.SetInsertPointAtEnd(start)
 | 
						c.builder.SetInsertPointAtEnd(start)
 | 
				
			||||||
| 
						 | 
					@ -324,12 +322,32 @@ func (c *Compiler) parseBinOp(frame *Frame, binop *ssa.BinOp) (llvm.Value, error
 | 
				
			||||||
		return llvm.Value{}, err
 | 
							return llvm.Value{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	switch binop.Op {
 | 
						switch binop.Op {
 | 
				
			||||||
	case token.ADD:
 | 
						case token.ADD: // +
 | 
				
			||||||
		return c.builder.CreateBinOp(llvm.Add, x, y, ""), nil
 | 
							return c.builder.CreateAdd(x, y, ""), nil
 | 
				
			||||||
	case token.MUL:
 | 
						case token.SUB: // -
 | 
				
			||||||
		return c.builder.CreateBinOp(llvm.Mul, x, y, ""), nil
 | 
							return c.builder.CreateSub(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.MUL: // *
 | 
				
			||||||
 | 
							return c.builder.CreateMul(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.QUO: // /
 | 
				
			||||||
 | 
							return c.builder.CreateSDiv(x, y, ""), nil // TODO: UDiv (unsigned)
 | 
				
			||||||
 | 
						case token.REM: // %
 | 
				
			||||||
 | 
							return c.builder.CreateSRem(x, y, ""), nil // TODO: URem (unsigned)
 | 
				
			||||||
 | 
						case token.AND: // &
 | 
				
			||||||
 | 
							return c.builder.CreateAnd(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.OR:  // |
 | 
				
			||||||
 | 
							return c.builder.CreateOr(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.XOR: // ^
 | 
				
			||||||
 | 
							return c.builder.CreateXor(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.SHL: // <<
 | 
				
			||||||
 | 
							return c.builder.CreateShl(x, y, ""), nil
 | 
				
			||||||
 | 
						case token.SHR: // >>
 | 
				
			||||||
 | 
							return c.builder.CreateAShr(x, y, ""), nil // TODO: LShr (unsigned)
 | 
				
			||||||
 | 
						case token.AND_NOT: // &^
 | 
				
			||||||
 | 
							// Go specific. Calculate "and not" with x & (~y)
 | 
				
			||||||
 | 
							inv := c.builder.CreateNot(y, "") // ~y
 | 
				
			||||||
 | 
							return c.builder.CreateAnd(x, inv, ""), nil
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return llvm.Value{}, errors.New("todo: unknown binop")
 | 
							return llvm.Value{}, errors.New("todo: unknown binop: " + fmt.Sprintf("%#v", binop))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче