@@ -2400,7 +2400,7 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2400
2400
return c .builder .CreateICmp (llvm .IntUGE , x , y , "" ), nil
2401
2401
}
2402
2402
default :
2403
- return llvm. Value {}, c . makeError ( pos , "todo: binop on integer: "+ op .String ())
2403
+ panic ( " binop on integer: " + op .String ())
2404
2404
}
2405
2405
} else if typ .Info ()& types .IsFloat != 0 {
2406
2406
// Operations on floats
@@ -2413,8 +2413,6 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2413
2413
return c .builder .CreateFMul (x , y , "" ), nil
2414
2414
case token .QUO : // /
2415
2415
return c .builder .CreateFDiv (x , y , "" ), nil
2416
- case token .REM : // %
2417
- return c .builder .CreateFRem (x , y , "" ), nil
2418
2416
case token .EQL : // ==
2419
2417
return c .builder .CreateFCmp (llvm .FloatOEQ , x , y , "" ), nil
2420
2418
case token .NEQ : // !=
@@ -2428,7 +2426,27 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2428
2426
case token .GEQ : // >=
2429
2427
return c .builder .CreateFCmp (llvm .FloatOGE , x , y , "" ), nil
2430
2428
default :
2431
- return llvm.Value {}, c .makeError (pos , "todo: binop on float: " + op .String ())
2429
+ panic ("binop on float: " + op .String ())
2430
+ }
2431
+ } else if typ .Info ()& types .IsComplex != 0 {
2432
+ indexr := llvm .ConstInt (c .ctx .Int32Type (), 0 , false )
2433
+ indexi := llvm .ConstInt (c .ctx .Int32Type (), 1 , false )
2434
+ r1 := c .builder .CreateExtractElement (x , indexr , "r1" )
2435
+ r2 := c .builder .CreateExtractElement (y , indexr , "r2" )
2436
+ i1 := c .builder .CreateExtractElement (x , indexi , "i1" )
2437
+ i2 := c .builder .CreateExtractElement (y , indexi , "i2" )
2438
+ switch op {
2439
+ case token .EQL : // ==
2440
+ req := c .builder .CreateFCmp (llvm .FloatOEQ , r1 , r2 , "" )
2441
+ ieq := c .builder .CreateFCmp (llvm .FloatOEQ , i1 , i2 , "" )
2442
+ return c .builder .CreateAnd (req , ieq , "" ), nil
2443
+ case token .NEQ : // !=
2444
+ req := c .builder .CreateFCmp (llvm .FloatOEQ , r1 , r2 , "" )
2445
+ ieq := c .builder .CreateFCmp (llvm .FloatOEQ , i1 , i2 , "" )
2446
+ neq := c .builder .CreateAnd (req , ieq , "" )
2447
+ return c .builder .CreateNot (neq , "" ), nil
2448
+ default :
2449
+ return llvm.Value {}, c .makeError (pos , "todo: binop on complex number: " + op .String ())
2432
2450
}
2433
2451
} else if typ .Info ()& types .IsBoolean != 0 {
2434
2452
// Operations on booleans
@@ -2438,7 +2456,7 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2438
2456
case token .NEQ : // !=
2439
2457
return c .builder .CreateICmp (llvm .IntNE , x , y , "" ), nil
2440
2458
default :
2441
- return llvm. Value {}, c . makeError ( pos , "todo: binop on boolean : "+ op .String ())
2459
+ panic ( " binop on bool : " + op .String ())
2442
2460
}
2443
2461
} else if typ .Kind () == types .UnsafePointer {
2444
2462
// Operations on pointers
@@ -2448,7 +2466,7 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2448
2466
case token .NEQ : // !=
2449
2467
return c .builder .CreateICmp (llvm .IntNE , x , y , "" ), nil
2450
2468
default :
2451
- return llvm. Value {}, c . makeError ( pos , "todo: binop on pointer: "+ op .String ())
2469
+ panic ( " binop on pointer: " + op .String ())
2452
2470
}
2453
2471
} else if typ .Info ()& types .IsString != 0 {
2454
2472
// Operations on strings
@@ -2471,7 +2489,7 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p
2471
2489
case token .GEQ : // >=
2472
2490
return c .createRuntimeCall ("stringLess" , []llvm.Value {y , x }, "" ), nil
2473
2491
default :
2474
- return llvm. Value {}, c . makeError ( pos , "todo: binop on string: "+ op .String ())
2492
+ panic ( " binop on string: " + op .String ())
2475
2493
}
2476
2494
} else {
2477
2495
return llvm.Value {}, c .makeError (pos , "todo: unknown basic type in binop: " + typ .String ())
0 commit comments