case LLVMAtomicRMWBinOpUMin:
binop = llvm::AtomicRMWInst::UMin;
break;
+#if LLVM_VERSION_MAJOR >= 10
+ case LLVMAtomicRMWBinOpFAdd:
+ binop = llvm::AtomicRMWInst::FAdd;
+ break;
+#endif
default:
unreachable("invalid LLVMAtomicRMWBinOp");
break;
if (instr->intrinsic == nir_intrinsic_shared_atomic_fadd ||
instr->intrinsic == nir_intrinsic_deref_atomic_fadd) {
val = ac_to_float(&ctx->ac, src);
+
+ LLVMTypeRef ptr_type =
+ LLVMPointerType(LLVMTypeOf(val), LLVMGetPointerAddressSpace(LLVMTypeOf(ptr)));
+ ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ptr_type, "");
} else {
val = ac_to_integer(&ctx->ac, src);
}
result = ac_build_atomic_rmw(&ctx->ac, op, ptr, val, sync_scope);
+
+ if (instr->intrinsic == nir_intrinsic_shared_atomic_fadd ||
+ instr->intrinsic == nir_intrinsic_deref_atomic_fadd) {
+ result = ac_to_integer(&ctx->ac, result);
+ }
}
if (ctx->ac.postponed_kill)