@@ -151,6 +151,22 @@ static constexpr IntrinsicHandler handlers[]{
151151 {" atomicaddf" , &I::genAtomicAdd, {{{" a" , asAddr}, {" v" , asValue}}}, false },
152152 {" atomicaddi" , &I::genAtomicAdd, {{{" a" , asAddr}, {" v" , asValue}}}, false },
153153 {" atomicaddl" , &I::genAtomicAdd, {{{" a" , asAddr}, {" v" , asValue}}}, false },
154+ {" atomicandi" , &I::genAtomicAnd, {{{" a" , asAddr}, {" v" , asValue}}}, false },
155+ {" atomicdeci" , &I::genAtomicDec, {{{" a" , asAddr}, {" v" , asValue}}}, false },
156+ {" atomicinci" , &I::genAtomicInc, {{{" a" , asAddr}, {" v" , asValue}}}, false },
157+ {" atomicmaxd" , &I::genAtomicMax, {{{" a" , asAddr}, {" v" , asValue}}}, false },
158+ {" atomicmaxf" , &I::genAtomicMax, {{{" a" , asAddr}, {" v" , asValue}}}, false },
159+ {" atomicmaxi" , &I::genAtomicMax, {{{" a" , asAddr}, {" v" , asValue}}}, false },
160+ {" atomicmaxl" , &I::genAtomicMax, {{{" a" , asAddr}, {" v" , asValue}}}, false },
161+ {" atomicmind" , &I::genAtomicMin, {{{" a" , asAddr}, {" v" , asValue}}}, false },
162+ {" atomicminf" , &I::genAtomicMin, {{{" a" , asAddr}, {" v" , asValue}}}, false },
163+ {" atomicmini" , &I::genAtomicMin, {{{" a" , asAddr}, {" v" , asValue}}}, false },
164+ {" atomicminl" , &I::genAtomicMin, {{{" a" , asAddr}, {" v" , asValue}}}, false },
165+ {" atomicori" , &I::genAtomicOr, {{{" a" , asAddr}, {" v" , asValue}}}, false },
166+ {" atomicsubd" , &I::genAtomicSub, {{{" a" , asAddr}, {" v" , asValue}}}, false },
167+ {" atomicsubf" , &I::genAtomicSub, {{{" a" , asAddr}, {" v" , asValue}}}, false },
168+ {" atomicsubi" , &I::genAtomicSub, {{{" a" , asAddr}, {" v" , asValue}}}, false },
169+ {" atomicsubl" , &I::genAtomicSub, {{{" a" , asAddr}, {" v" , asValue}}}, false },
154170 {" bessel_jn" ,
155171 &I::genBesselJn,
156172 {{{" n1" , asValue}, {" n2" , asValue}, {" x" , asValue}}},
@@ -2600,6 +2616,75 @@ mlir::Value IntrinsicLibrary::genAtomicAdd(mlir::Type resultType,
26002616 return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
26012617}
26022618
2619+ mlir::Value IntrinsicLibrary::genAtomicSub (mlir::Type resultType,
2620+ llvm::ArrayRef<mlir::Value> args) {
2621+ assert (args.size () == 2 );
2622+
2623+ mlir::LLVM::AtomicBinOp binOp =
2624+ mlir::isa<mlir::IntegerType>(args[1 ].getType ())
2625+ ? mlir::LLVM::AtomicBinOp::sub
2626+ : mlir::LLVM::AtomicBinOp::fsub;
2627+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2628+ }
2629+
2630+ mlir::Value IntrinsicLibrary::genAtomicAnd (mlir::Type resultType,
2631+ llvm::ArrayRef<mlir::Value> args) {
2632+ assert (args.size () == 2 );
2633+ assert (mlir::isa<mlir::IntegerType>(args[1 ].getType ()));
2634+
2635+ mlir::LLVM::AtomicBinOp binOp = mlir::LLVM::AtomicBinOp::_and;
2636+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2637+ }
2638+
2639+ mlir::Value IntrinsicLibrary::genAtomicOr (mlir::Type resultType,
2640+ llvm::ArrayRef<mlir::Value> args) {
2641+ assert (args.size () == 2 );
2642+ assert (mlir::isa<mlir::IntegerType>(args[1 ].getType ()));
2643+
2644+ mlir::LLVM::AtomicBinOp binOp = mlir::LLVM::AtomicBinOp::_or;
2645+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2646+ }
2647+
2648+ mlir::Value IntrinsicLibrary::genAtomicDec (mlir::Type resultType,
2649+ llvm::ArrayRef<mlir::Value> args) {
2650+ assert (args.size () == 2 );
2651+ assert (mlir::isa<mlir::IntegerType>(args[1 ].getType ()));
2652+
2653+ mlir::LLVM::AtomicBinOp binOp = mlir::LLVM::AtomicBinOp::udec_wrap;
2654+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2655+ }
2656+
2657+ mlir::Value IntrinsicLibrary::genAtomicInc (mlir::Type resultType,
2658+ llvm::ArrayRef<mlir::Value> args) {
2659+ assert (args.size () == 2 );
2660+ assert (mlir::isa<mlir::IntegerType>(args[1 ].getType ()));
2661+
2662+ mlir::LLVM::AtomicBinOp binOp = mlir::LLVM::AtomicBinOp::uinc_wrap;
2663+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2664+ }
2665+
2666+ mlir::Value IntrinsicLibrary::genAtomicMax (mlir::Type resultType,
2667+ llvm::ArrayRef<mlir::Value> args) {
2668+ assert (args.size () == 2 );
2669+
2670+ mlir::LLVM::AtomicBinOp binOp =
2671+ mlir::isa<mlir::IntegerType>(args[1 ].getType ())
2672+ ? mlir::LLVM::AtomicBinOp::max
2673+ : mlir::LLVM::AtomicBinOp::fmax;
2674+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2675+ }
2676+
2677+ mlir::Value IntrinsicLibrary::genAtomicMin (mlir::Type resultType,
2678+ llvm::ArrayRef<mlir::Value> args) {
2679+ assert (args.size () == 2 );
2680+
2681+ mlir::LLVM::AtomicBinOp binOp =
2682+ mlir::isa<mlir::IntegerType>(args[1 ].getType ())
2683+ ? mlir::LLVM::AtomicBinOp::min
2684+ : mlir::LLVM::AtomicBinOp::fmin;
2685+ return genAtomBinOp (builder, loc, binOp, args[0 ], args[1 ]);
2686+ }
2687+
26032688// ASSOCIATED
26042689fir::ExtendedValue
26052690IntrinsicLibrary::genAssociated (mlir::Type resultType,
0 commit comments