LLVMValueRef val = get_src(bld_base, instr->src[2]);
LLVMValueRef val2 = NULL;
int bitsize = nir_src_bit_size(instr->src[2]);
- if (instr->intrinsic == nir_intrinsic_ssbo_atomic_comp_swap)
+ if (instr->intrinsic == nir_intrinsic_ssbo_atomic_swap)
val2 = get_src(bld_base, instr->src[3]);
- bld_base->atomic_mem(bld_base, instr->intrinsic, bitsize, idx,
+ bld_base->atomic_mem(bld_base, nir_intrinsic_atomic_op(instr), bitsize, idx,
offset, val, val2, &result[0]);
}
bld_base->image_op(bld_base, ¶ms);
}
+LLVMAtomicRMWBinOp
+lp_translate_atomic_op(nir_atomic_op op)
+{
+ switch (op) {
+ case nir_atomic_op_iadd: return LLVMAtomicRMWBinOpAdd;
+ case nir_atomic_op_xchg: return LLVMAtomicRMWBinOpXchg;
+ case nir_atomic_op_iand: return LLVMAtomicRMWBinOpAnd;
+ case nir_atomic_op_ior: return LLVMAtomicRMWBinOpOr;
+ case nir_atomic_op_ixor: return LLVMAtomicRMWBinOpXor;
+ case nir_atomic_op_umin: return LLVMAtomicRMWBinOpUMin;
+ case nir_atomic_op_umax: return LLVMAtomicRMWBinOpUMax;
+ case nir_atomic_op_imin: return LLVMAtomicRMWBinOpMin;
+ case nir_atomic_op_imax: return LLVMAtomicRMWBinOpMax;
+ case nir_atomic_op_fadd: return LLVMAtomicRMWBinOpFAdd;
+#if LLVM_VERSION_MAJOR >= 15
+ case nir_atomic_op_fmin: return LLVMAtomicRMWBinOpFMin;
+ case nir_atomic_op_fmax: return LLVMAtomicRMWBinOpFMax;
+#endif
+ default: unreachable("Unexpected atomic");
+ }
+}
static void
visit_atomic_image(struct lp_build_nir_context *bld_base,
memset(¶ms, 0, sizeof(params));
- switch (instr->intrinsic) {
- case nir_intrinsic_image_atomic_add:
- params.op = LLVMAtomicRMWBinOpAdd;
- break;
- case nir_intrinsic_image_atomic_exchange:
- params.op = LLVMAtomicRMWBinOpXchg;
- break;
- case nir_intrinsic_image_atomic_and:
- params.op = LLVMAtomicRMWBinOpAnd;
- break;
- case nir_intrinsic_image_atomic_or:
- params.op = LLVMAtomicRMWBinOpOr;
- break;
- case nir_intrinsic_image_atomic_xor:
- params.op = LLVMAtomicRMWBinOpXor;
- break;
- case nir_intrinsic_image_atomic_umin:
- params.op = LLVMAtomicRMWBinOpUMin;
- break;
- case nir_intrinsic_image_atomic_umax:
- params.op = LLVMAtomicRMWBinOpUMax;
- break;
- case nir_intrinsic_image_atomic_imin:
- params.op = LLVMAtomicRMWBinOpMin;
- break;
- case nir_intrinsic_image_atomic_imax:
- params.op = LLVMAtomicRMWBinOpMax;
- break;
- case nir_intrinsic_image_atomic_fadd:
- params.op = LLVMAtomicRMWBinOpFAdd;
- break;
-#if LLVM_VERSION_MAJOR >= 15
- case nir_intrinsic_image_atomic_fmin:
- params.op = LLVMAtomicRMWBinOpFMin;
- break;
- case nir_intrinsic_image_atomic_fmax:
- params.op = LLVMAtomicRMWBinOpFMax;
- break;
-#endif
- default:
- break;
- }
+ if (instr->intrinsic != nir_intrinsic_image_atomic_swap)
+ params.op = lp_translate_atomic_op(nir_intrinsic_atomic_op(instr));
params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr),
nir_intrinsic_image_array(instr));
if (nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS)
params.ms_index = get_src(bld_base, instr->src[2]);
- if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap) {
+ if (instr->intrinsic == nir_intrinsic_image_atomic_swap) {
LLVMValueRef cas_val = get_src(bld_base, instr->src[4]);
params.indata[0] = in_val;
params.indata2[0] = cas_val;
params.outdata = result;
params.img_op =
- (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap)
+ (instr->intrinsic == nir_intrinsic_image_atomic_swap)
? LP_IMG_ATOMIC_CAS : LP_IMG_ATOMIC;
if (nir_src_is_const(instr->src[0]))
params.image_index = nir_src_as_int(instr->src[0]);
LLVMValueRef val = get_src(bld_base, instr->src[1]);
LLVMValueRef val2 = NULL;
int bitsize = nir_src_bit_size(instr->src[1]);
- if (instr->intrinsic == nir_intrinsic_shared_atomic_comp_swap)
+ if (instr->intrinsic == nir_intrinsic_shared_atomic_swap)
val2 = get_src(bld_base, instr->src[2]);
- bld_base->atomic_mem(bld_base, instr->intrinsic, bitsize, NULL,
+ bld_base->atomic_mem(bld_base, nir_intrinsic_atomic_op(instr), bitsize, NULL,
offset, val, val2, &result[0]);
}
LLVMValueRef val2 = NULL;
int addr_bitsize = nir_src_bit_size(instr->src[0]);
int val_bitsize = nir_src_bit_size(instr->src[1]);
- if (instr->intrinsic == nir_intrinsic_global_atomic_comp_swap)
+ if (instr->intrinsic == nir_intrinsic_global_atomic_swap)
val2 = get_src(bld_base, instr->src[2]);
- bld_base->atomic_global(bld_base, instr->intrinsic, addr_bitsize,
- val_bitsize, addr, val, val2, &result[0]);
+ bld_base->atomic_global(bld_base, nir_intrinsic_atomic_op(instr),
+ addr_bitsize, val_bitsize, addr, val, val2,
+ &result[0]);
}
#if LLVM_VERSION_MAJOR >= 10
case nir_intrinsic_end_primitive:
bld_base->end_primitive(bld_base, nir_intrinsic_stream_id(instr));
break;
- case nir_intrinsic_ssbo_atomic_add:
- case nir_intrinsic_ssbo_atomic_imin:
- case nir_intrinsic_ssbo_atomic_imax:
- case nir_intrinsic_ssbo_atomic_umin:
- case nir_intrinsic_ssbo_atomic_umax:
- case nir_intrinsic_ssbo_atomic_and:
- case nir_intrinsic_ssbo_atomic_or:
- case nir_intrinsic_ssbo_atomic_xor:
- case nir_intrinsic_ssbo_atomic_exchange:
- case nir_intrinsic_ssbo_atomic_comp_swap:
- case nir_intrinsic_ssbo_atomic_fadd:
- case nir_intrinsic_ssbo_atomic_fmin:
- case nir_intrinsic_ssbo_atomic_fmax:
+ case nir_intrinsic_ssbo_atomic:
+ case nir_intrinsic_ssbo_atomic_swap:
visit_ssbo_atomic(bld_base, instr, result);
break;
case nir_intrinsic_image_load:
case nir_intrinsic_image_store:
visit_store_image(bld_base, instr);
break;
- case nir_intrinsic_image_atomic_add:
- case nir_intrinsic_image_atomic_imin:
- case nir_intrinsic_image_atomic_imax:
- case nir_intrinsic_image_atomic_umin:
- case nir_intrinsic_image_atomic_umax:
- case nir_intrinsic_image_atomic_and:
- case nir_intrinsic_image_atomic_or:
- case nir_intrinsic_image_atomic_xor:
- case nir_intrinsic_image_atomic_exchange:
- case nir_intrinsic_image_atomic_comp_swap:
- case nir_intrinsic_image_atomic_fadd:
- case nir_intrinsic_image_atomic_fmin:
- case nir_intrinsic_image_atomic_fmax:
+ case nir_intrinsic_image_atomic:
+ case nir_intrinsic_image_atomic_swap:
visit_atomic_image(bld_base, instr, result);
break;
case nir_intrinsic_image_size:
case nir_intrinsic_store_shared:
visit_shared_store(bld_base, instr);
break;
- case nir_intrinsic_shared_atomic_add:
- case nir_intrinsic_shared_atomic_imin:
- case nir_intrinsic_shared_atomic_umin:
- case nir_intrinsic_shared_atomic_imax:
- case nir_intrinsic_shared_atomic_umax:
- case nir_intrinsic_shared_atomic_and:
- case nir_intrinsic_shared_atomic_or:
- case nir_intrinsic_shared_atomic_xor:
- case nir_intrinsic_shared_atomic_exchange:
- case nir_intrinsic_shared_atomic_comp_swap:
- case nir_intrinsic_shared_atomic_fadd:
- case nir_intrinsic_shared_atomic_fmin:
- case nir_intrinsic_shared_atomic_fmax:
+ case nir_intrinsic_shared_atomic:
+ case nir_intrinsic_shared_atomic_swap:
visit_shared_atomic(bld_base, instr, result);
break;
case nir_intrinsic_scoped_barrier:
case nir_intrinsic_store_global:
visit_store_global(bld_base, instr);
break;
- case nir_intrinsic_global_atomic_add:
- case nir_intrinsic_global_atomic_imin:
- case nir_intrinsic_global_atomic_umin:
- case nir_intrinsic_global_atomic_imax:
- case nir_intrinsic_global_atomic_umax:
- case nir_intrinsic_global_atomic_and:
- case nir_intrinsic_global_atomic_or:
- case nir_intrinsic_global_atomic_xor:
- case nir_intrinsic_global_atomic_exchange:
- case nir_intrinsic_global_atomic_comp_swap:
- case nir_intrinsic_global_atomic_fadd:
- case nir_intrinsic_global_atomic_fmin:
- case nir_intrinsic_global_atomic_fmax:
+ case nir_intrinsic_global_atomic:
+ case nir_intrinsic_global_atomic_swap:
visit_global_atomic(bld_base, instr, result);
break;
case nir_intrinsic_vote_all:
nir_lower_locals_to_regs(nir);
nir_remove_dead_derefs(nir);
nir_remove_dead_variables(nir, nir_var_function_temp, NULL);
+ nir_lower_legacy_atomics(nir);
if (is_aos(bld_base)) {
nir_move_vec_src_uses_to_dest(nir);
}
}
-static bool atomic_op_is_float(nir_intrinsic_op nir_op)
-{
- switch (nir_op) {
- case nir_intrinsic_shared_atomic_fadd:
- case nir_intrinsic_shared_atomic_fmin:
- case nir_intrinsic_shared_atomic_fmax:
- case nir_intrinsic_global_atomic_fadd:
- case nir_intrinsic_global_atomic_fmin:
- case nir_intrinsic_global_atomic_fmax:
- case nir_intrinsic_ssbo_atomic_fadd:
- case nir_intrinsic_ssbo_atomic_fmin:
- case nir_intrinsic_ssbo_atomic_fmax:
- return true;
- default:
- break;
- }
- return false;
-}
-
static void emit_atomic_global(struct lp_build_nir_context *bld_base,
- nir_intrinsic_op nir_op,
+ nir_atomic_op nir_op,
unsigned addr_bit_size,
unsigned val_bit_size,
LLVMValueRef addr,
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
struct lp_build_context *uint_bld = &bld_base->uint_bld;
- bool is_flt = atomic_op_is_float(nir_op);
+ bool is_flt = nir_atomic_op_type(nir_op) == nir_type_float;
struct lp_build_context *atom_bld = is_flt ? get_flt_bld(bld_base, val_bit_size) : get_int_bld(bld_base, true, val_bit_size);
if (is_flt)
val = LLVMBuildBitCast(builder, val, atom_bld->vec_type, "");
lp_build_if(&ifthen, gallivm, cond);
addr_ptr = LLVMBuildBitCast(gallivm->builder, addr_ptr, LLVMPointerType(LLVMTypeOf(value_ptr), 0), "");
- if (nir_op == nir_intrinsic_global_atomic_comp_swap) {
+ if (val2 != NULL /* compare-and-swap */) {
LLVMValueRef cas_src_ptr = LLVMBuildExtractElement(gallivm->builder, val2,
loop_state.counter, "");
cas_src_ptr = LLVMBuildBitCast(gallivm->builder, cas_src_ptr, atom_bld->elem_type, "");
false);
scalar = LLVMBuildExtractValue(gallivm->builder, scalar, 0, "");
} else {
- LLVMAtomicRMWBinOp op;
- switch (nir_op) {
- case nir_intrinsic_global_atomic_add:
- op = LLVMAtomicRMWBinOpAdd;
- break;
- case nir_intrinsic_global_atomic_exchange:
-
- op = LLVMAtomicRMWBinOpXchg;
- break;
- case nir_intrinsic_global_atomic_and:
- op = LLVMAtomicRMWBinOpAnd;
- break;
- case nir_intrinsic_global_atomic_or:
- op = LLVMAtomicRMWBinOpOr;
- break;
- case nir_intrinsic_global_atomic_xor:
- op = LLVMAtomicRMWBinOpXor;
- break;
- case nir_intrinsic_global_atomic_umin:
- op = LLVMAtomicRMWBinOpUMin;
- break;
- case nir_intrinsic_global_atomic_umax:
- op = LLVMAtomicRMWBinOpUMax;
- break;
- case nir_intrinsic_global_atomic_imin:
- op = LLVMAtomicRMWBinOpMin;
- break;
- case nir_intrinsic_global_atomic_imax:
- op = LLVMAtomicRMWBinOpMax;
- break;
- case nir_intrinsic_global_atomic_fadd:
- op = LLVMAtomicRMWBinOpFAdd;
- break;
-#if LLVM_VERSION_MAJOR >= 15
- case nir_intrinsic_global_atomic_fmin:
- op = LLVMAtomicRMWBinOpFMin;
- break;
- case nir_intrinsic_global_atomic_fmax:
- op = LLVMAtomicRMWBinOpFMax;
- break;
-#endif
- default:
- unreachable("unknown atomic op");
- }
-
- scalar = LLVMBuildAtomicRMW(builder, op,
+ scalar = LLVMBuildAtomicRMW(builder, lp_translate_atomic_op(nir_op),
addr_ptr, value_ptr,
LLVMAtomicOrderingSequentiallyConsistent,
false);
static void emit_atomic_mem(struct lp_build_nir_context *bld_base,
- nir_intrinsic_op nir_op,
+ nir_atomic_op nir_op,
uint32_t bit_size,
LLVMValueRef index, LLVMValueRef offset,
LLVMValueRef val, LLVMValueRef val2,
LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
struct lp_build_context *uint_bld = &bld_base->uint_bld;
uint32_t shift_val = bit_size_to_shift_size(bit_size);
- bool is_float = atomic_op_is_float(nir_op);
+ bool is_float = nir_atomic_op_type(nir_op) == nir_type_float;
struct lp_build_context *atomic_bld = is_float ? get_flt_bld(bld_base, bit_size) : get_int_bld(bld_base, true, bit_size);
offset = lp_build_shr_imm(uint_bld, offset, shift_val);
inner_cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, do_fetch, lp_build_const_int32(gallivm, 0), "");
lp_build_if(&ifthen, gallivm, inner_cond);
- if (nir_op == nir_intrinsic_ssbo_atomic_comp_swap || nir_op == nir_intrinsic_shared_atomic_comp_swap) {
+ if (val2 != NULL) {
LLVMValueRef cas_src_ptr = LLVMBuildExtractElement(gallivm->builder, val2,
loop_state.counter, "");
cas_src_ptr = LLVMBuildBitCast(gallivm->builder, cas_src_ptr, atomic_bld->elem_type, "");
false);
scalar = LLVMBuildExtractValue(gallivm->builder, scalar, 0, "");
} else {
- LLVMAtomicRMWBinOp op;
-
- switch (nir_op) {
- case nir_intrinsic_shared_atomic_add:
- case nir_intrinsic_ssbo_atomic_add:
- op = LLVMAtomicRMWBinOpAdd;
- break;
- case nir_intrinsic_shared_atomic_exchange:
- case nir_intrinsic_ssbo_atomic_exchange:
- op = LLVMAtomicRMWBinOpXchg;
- break;
- case nir_intrinsic_shared_atomic_and:
- case nir_intrinsic_ssbo_atomic_and:
- op = LLVMAtomicRMWBinOpAnd;
- break;
- case nir_intrinsic_shared_atomic_or:
- case nir_intrinsic_ssbo_atomic_or:
- op = LLVMAtomicRMWBinOpOr;
- break;
- case nir_intrinsic_shared_atomic_xor:
- case nir_intrinsic_ssbo_atomic_xor:
- op = LLVMAtomicRMWBinOpXor;
- break;
- case nir_intrinsic_shared_atomic_umin:
- case nir_intrinsic_ssbo_atomic_umin:
- op = LLVMAtomicRMWBinOpUMin;
- break;
- case nir_intrinsic_shared_atomic_umax:
- case nir_intrinsic_ssbo_atomic_umax:
- op = LLVMAtomicRMWBinOpUMax;
- break;
- case nir_intrinsic_ssbo_atomic_imin:
- case nir_intrinsic_shared_atomic_imin:
- op = LLVMAtomicRMWBinOpMin;
- break;
- case nir_intrinsic_ssbo_atomic_imax:
- case nir_intrinsic_shared_atomic_imax:
- op = LLVMAtomicRMWBinOpMax;
- break;
- case nir_intrinsic_shared_atomic_fadd:
- case nir_intrinsic_ssbo_atomic_fadd:
- op = LLVMAtomicRMWBinOpFAdd;
- break;
-#if LLVM_VERSION_MAJOR >= 15
- case nir_intrinsic_shared_atomic_fmin:
- case nir_intrinsic_ssbo_atomic_fmin:
- op = LLVMAtomicRMWBinOpFMin;
- break;
- case nir_intrinsic_shared_atomic_fmax:
- case nir_intrinsic_ssbo_atomic_fmax:
- op = LLVMAtomicRMWBinOpFMax;
- break;
-#endif
- default:
- unreachable("unknown atomic op");
- }
- scalar = LLVMBuildAtomicRMW(builder, op,
+ scalar = LLVMBuildAtomicRMW(builder, lp_translate_atomic_op(nir_op),
scalar_ptr, value_ptr,
LLVMAtomicOrderingSequentiallyConsistent,
false);