@@ -689,20 +689,18 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
689
689
if (!this ->visit (SubExpr))
690
690
return false ;
691
691
692
- auto Sem = Ctx.getASTContext ().getFixedPointSemantics (CE->getType ());
693
- uint32_t I;
694
- std::memcpy (&I, &Sem, sizeof (Sem));
695
- return this ->emitCastIntegralFixedPoint (classifyPrim (SubExpr->getType ()), I,
696
- CE);
692
+ auto Sem =
693
+ Ctx.getASTContext ().getFixedPointSemantics (CE->getType ()).toOpaqueInt ();
694
+ return this ->emitCastIntegralFixedPoint (classifyPrim (SubExpr->getType ()),
695
+ Sem, CE);
697
696
}
698
697
case CK_FloatingToFixedPoint: {
699
698
if (!this ->visit (SubExpr))
700
699
return false ;
701
700
702
- auto Sem = Ctx.getASTContext ().getFixedPointSemantics (CE->getType ());
703
- uint32_t I;
704
- std::memcpy (&I, &Sem, sizeof (Sem));
705
- return this ->emitCastFloatingFixedPoint (I, CE);
701
+ auto Sem =
702
+ Ctx.getASTContext ().getFixedPointSemantics (CE->getType ()).toOpaqueInt ();
703
+ return this ->emitCastFloatingFixedPoint (Sem, CE);
706
704
}
707
705
case CK_FixedPointToFloating: {
708
706
if (!this ->visit (SubExpr))
@@ -718,10 +716,9 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
718
716
case CK_FixedPointCast: {
719
717
if (!this ->visit (SubExpr))
720
718
return false ;
721
- auto Sem = Ctx.getASTContext ().getFixedPointSemantics (CE->getType ());
722
- uint32_t I;
723
- std::memcpy (&I, &Sem, sizeof (Sem));
724
- return this ->emitCastFixedPoint (I, CE);
719
+ auto Sem =
720
+ Ctx.getASTContext ().getFixedPointSemantics (CE->getType ()).toOpaqueInt ();
721
+ return this ->emitCastFixedPoint (Sem, CE);
725
722
}
726
723
727
724
case CK_ToVoid:
@@ -1522,42 +1519,40 @@ template <class Emitter>
1522
1519
bool Compiler<Emitter>::VisitFixedPointBinOp(const BinaryOperator *E) {
1523
1520
const Expr *LHS = E->getLHS ();
1524
1521
const Expr *RHS = E->getRHS ();
1522
+ const ASTContext &ASTCtx = Ctx.getASTContext ();
1525
1523
1526
1524
assert (LHS->getType ()->isFixedPointType () ||
1527
1525
RHS->getType ()->isFixedPointType ());
1528
1526
1529
- auto LHSSema = Ctx.getASTContext ().getFixedPointSemantics (LHS->getType ());
1530
- auto RHSSema = Ctx.getASTContext ().getFixedPointSemantics (RHS->getType ());
1527
+ auto LHSSema = ASTCtx.getFixedPointSemantics (LHS->getType ());
1528
+ auto LHSSemaInt = LHSSema.toOpaqueInt ();
1529
+ auto RHSSema = ASTCtx.getFixedPointSemantics (RHS->getType ());
1530
+ auto RHSSemaInt = RHSSema.toOpaqueInt ();
1531
1531
1532
1532
if (!this ->visit (LHS))
1533
1533
return false ;
1534
1534
if (!LHS->getType ()->isFixedPointType ()) {
1535
- uint32_t I;
1536
- std::memcpy (&I, &LHSSema, sizeof (llvm::FixedPointSemantics));
1537
- if (!this ->emitCastIntegralFixedPoint (classifyPrim (LHS->getType ()), I, E))
1535
+ if (!this ->emitCastIntegralFixedPoint (classifyPrim (LHS->getType ()),
1536
+ LHSSemaInt, E))
1538
1537
return false ;
1539
1538
}
1540
1539
1541
1540
if (!this ->visit (RHS))
1542
1541
return false ;
1543
1542
if (!RHS->getType ()->isFixedPointType ()) {
1544
- uint32_t I;
1545
- std::memcpy (&I, &RHSSema, sizeof (llvm::FixedPointSemantics));
1546
- if (!this ->emitCastIntegralFixedPoint (classifyPrim (RHS->getType ()), I, E))
1543
+ if (!this ->emitCastIntegralFixedPoint (classifyPrim (RHS->getType ()),
1544
+ RHSSemaInt, E))
1547
1545
return false ;
1548
1546
}
1549
1547
1550
1548
// Convert the result to the target semantics.
1551
1549
auto ConvertResult = [&](bool R) -> bool {
1552
1550
if (!R)
1553
1551
return false ;
1554
- auto ResultSema = Ctx.getASTContext ().getFixedPointSemantics (E->getType ());
1555
- auto CommonSema = LHSSema.getCommonSemantics (RHSSema);
1556
- if (ResultSema != CommonSema) {
1557
- uint32_t I;
1558
- std::memcpy (&I, &ResultSema, sizeof (ResultSema));
1559
- return this ->emitCastFixedPoint (I, E);
1560
- }
1552
+ auto ResultSema = ASTCtx.getFixedPointSemantics (E->getType ()).toOpaqueInt ();
1553
+ auto CommonSema = LHSSema.getCommonSemantics (RHSSema).toOpaqueInt ();
1554
+ if (ResultSema != CommonSema)
1555
+ return this ->emitCastFixedPoint (ResultSema, E);
1561
1556
return true ;
1562
1557
};
1563
1558
0 commit comments