@@ -1502,25 +1502,41 @@ bool Compiler<Emitter>::VisitFixedPointBinOp(const BinaryOperator *E) {
1502
1502
assert (LHS->getType ()->isFixedPointType () ||
1503
1503
RHS->getType ()->isFixedPointType ());
1504
1504
1505
+ auto LHSSema = Ctx.getASTContext ().getFixedPointSemantics (LHS->getType ());
1506
+ auto RHSSema = Ctx.getASTContext ().getFixedPointSemantics (RHS->getType ());
1507
+
1505
1508
if (!this ->visit (LHS))
1506
1509
return false ;
1507
1510
if (!LHS->getType ()->isFixedPointType ()) {
1508
- auto Sem = Ctx.getASTContext ().getFixedPointSemantics (LHS->getType ());
1509
1511
uint32_t I;
1510
- std::memcpy (&I, &Sem , sizeof (Sem ));
1512
+ std::memcpy (&I, &LHSSema , sizeof (llvm::FixedPointSemantics ));
1511
1513
if (!this ->emitCastIntegralFixedPoint (classifyPrim (LHS->getType ()), I, E))
1512
1514
return false ;
1513
1515
}
1516
+
1514
1517
if (!this ->visit (RHS))
1515
1518
return false ;
1516
1519
if (!RHS->getType ()->isFixedPointType ()) {
1517
- auto Sem = Ctx.getASTContext ().getFixedPointSemantics (RHS->getType ());
1518
1520
uint32_t I;
1519
- std::memcpy (&I, &Sem , sizeof (Sem ));
1521
+ std::memcpy (&I, &RHSSema , sizeof (llvm::FixedPointSemantics ));
1520
1522
if (!this ->emitCastIntegralFixedPoint (classifyPrim (RHS->getType ()), I, E))
1521
1523
return false ;
1522
1524
}
1523
1525
1526
+ // Convert the result to the target semantics.
1527
+ auto ConvertResult = [&](bool R) -> bool {
1528
+ if (!R)
1529
+ return false ;
1530
+ auto ResultSema = Ctx.getASTContext ().getFixedPointSemantics (E->getType ());
1531
+ auto CommonSema = LHSSema.getCommonSemantics (RHSSema);
1532
+ if (ResultSema != CommonSema) {
1533
+ uint32_t I;
1534
+ std::memcpy (&I, &ResultSema, sizeof (ResultSema));
1535
+ return this ->emitCastFixedPoint (I, E);
1536
+ }
1537
+ return true ;
1538
+ };
1539
+
1524
1540
switch (E->getOpcode ()) {
1525
1541
case BO_EQ:
1526
1542
return this ->emitEQFixedPoint (E);
@@ -1537,7 +1553,7 @@ bool Compiler<Emitter>::VisitFixedPointBinOp(const BinaryOperator *E) {
1537
1553
return this->emitGEFixedPoint(E);
1538
1554
#endif
1539
1555
case BO_Add:
1540
- return this ->emitAddFixedPoint (E);
1556
+ return ConvertResult ( this ->emitAddFixedPoint (E) );
1541
1557
1542
1558
default :
1543
1559
return this ->emitInvalid (E);
0 commit comments