+ unsigned offset = nir_src_as_uint(instr->src[0]);
+ unsigned base = nir_intrinsic_base(instr);
+ unsigned range = nir_intrinsic_range(instr);
+ assert(base + range <= state->shader->constant_data_size);
+
+ nir_instr *new_instr = NULL;
+ if (offset >= range) {
+ nir_ssa_undef_instr *undef =
+ nir_ssa_undef_instr_create(state->shader,
+ instr->num_components,
+ instr->dest.ssa.bit_size);
+
+ nir_ssa_def_rewrite_uses(&instr->dest.ssa, nir_src_for_ssa(&undef->def));
+ new_instr = &undef->instr;
+ } else {
+ nir_load_const_instr *load_const =
+ nir_load_const_instr_create(state->shader,
+ instr->num_components,
+ instr->dest.ssa.bit_size);
+
+ uint8_t *data = (uint8_t*)state->shader->constant_data + base;
+ for (unsigned i = 0; i < instr->num_components; i++) {
+ unsigned bytes = instr->dest.ssa.bit_size / 8;
+ bytes = MIN2(bytes, range - offset);
+
+ memcpy(&load_const->value[i].u64, data + offset, bytes);
+ offset += bytes;
+ }
+
+ nir_ssa_def_rewrite_uses(&instr->dest.ssa, nir_src_for_ssa(&load_const->def));
+ new_instr = &load_const->instr;
+ }