23 explicit Complex(
FirOpBuilder &builder, mlir::Location loc)
24 : builder(builder), loc(loc) {}
25 Complex(
const Complex &) =
delete;
29 enum class Part { Real = 0, Imag = 1 };
36 mlir::Value
createComplex(mlir::Type complexType, mlir::Value real,
40 mlir::Value
createComplex(mlir::Value real, mlir::Value imag);
44 return isImagPart ? extract<Part::Imag>(cplx) : extract<Part::Real>(cplx);
48 std::pair<mlir::Value, mlir::Value>
extractParts(mlir::Value cplx) {
49 return {extract<Part::Real>(cplx), extract<Part::Imag>(cplx)};
52 mlir::Value insertComplexPart(mlir::Value cplx, mlir::Value part,
54 return isImagPart ? insert<Part::Imag>(cplx, part)
55 : insert<Part::Real>(cplx, part);
59 template <Part partId>
60 mlir::Value extract(mlir::Value cplx) {
61 return fir::ExtractValueOp::create(
63 builder.getArrayAttr({builder.getIntegerAttr(
64 builder.getIndexType(), static_cast<int>(partId))}));
67 template <Part partId>
68 mlir::Value insert(mlir::Value cplx, mlir::Value part) {
69 return fir::InsertValueOp::create(
70 builder, loc, cplx.getType(), cplx, part,
71 builder.getArrayAttr({builder.getIntegerAttr(
72 builder.getIndexType(), static_cast<int>(partId))}));
75 template <Part partId>
76 mlir::Value createPartId() {
77 return builder.createIntegerConstant(loc, builder.getIndexType(),
78 static_cast<int>(partId));
82 FirOpBuilder &builder;