radv: replace grid_components_used by uses_grid_size
[mesa.git] / src / amd / common / ac_nir_to_llvm.c
index 83b49b535c606d65ce1a714738dc83e47ceb2266..0e1d7e0082f81c44f77909d81184e537eef2e9c5 100644 (file)
@@ -122,7 +122,6 @@ struct nir_to_llvm_context {
        LLVMValueRef gs2vs_offset;
        LLVMValueRef gs_wave_id;
        LLVMValueRef gs_vtx_offset[6];
-       LLVMValueRef gs_prim_id, gs_invocation_id;
 
        LLVMValueRef esgs_ring;
        LLVMValueRef gsvs_ring;
@@ -134,35 +133,8 @@ struct nir_to_llvm_context {
        LLVMValueRef persp_sample, persp_center, persp_centroid;
        LLVMValueRef linear_sample, linear_center, linear_centroid;
 
-       LLVMTypeRef i1;
-       LLVMTypeRef i8;
-       LLVMTypeRef i16;
-       LLVMTypeRef i32;
-       LLVMTypeRef i64;
-       LLVMTypeRef v2i32;
-       LLVMTypeRef v3i32;
-       LLVMTypeRef v4i32;
-       LLVMTypeRef v8i32;
-       LLVMTypeRef f64;
-       LLVMTypeRef f32;
-       LLVMTypeRef f16;
-       LLVMTypeRef v2f32;
-       LLVMTypeRef v4f32;
-       LLVMTypeRef voidt;
-
-       LLVMValueRef i1true;
-       LLVMValueRef i1false;
-       LLVMValueRef i32zero;
-       LLVMValueRef i32one;
-       LLVMValueRef f32zero;
-       LLVMValueRef f32one;
-       LLVMValueRef v4f32empty;
-
-       unsigned uniform_md_kind;
-       LLVMValueRef empty_md;
        gl_shader_stage stage;
 
-       LLVMValueRef lds;
        LLVMValueRef inputs[RADEON_LLVM_MAX_INPUTS * 4];
 
        uint64_t input_mask;
@@ -177,6 +149,9 @@ struct nir_to_llvm_context {
        unsigned tes_primitive_mode;
        uint64_t tess_outputs_written;
        uint64_t tess_patch_outputs_written;
+
+       uint32_t tcs_patch_outputs_read;
+       uint64_t tcs_outputs_read;
 };
 
 static inline struct nir_to_llvm_context *
@@ -186,9 +161,32 @@ nir_to_llvm_context_from_abi(struct ac_shader_abi *abi)
        return container_of(abi, ctx, abi);
 }
 
+static LLVMTypeRef
+nir2llvmtype(struct ac_nir_context *ctx,
+            const struct glsl_type *type)
+{
+       switch (glsl_get_base_type(glsl_without_array(type))) {
+       case GLSL_TYPE_UINT:
+       case GLSL_TYPE_INT:
+               return ctx->ac.i32;
+       case GLSL_TYPE_UINT64:
+       case GLSL_TYPE_INT64:
+               return ctx->ac.i64;
+       case GLSL_TYPE_DOUBLE:
+               return ctx->ac.f64;
+       case GLSL_TYPE_FLOAT:
+               return ctx->ac.f32;
+       default:
+               assert(!"Unsupported type in nir2llvmtype()");
+               break;
+       }
+       return 0;
+}
+
 static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,
                                     const nir_deref_var *deref,
                                     enum ac_descriptor_type desc_type,
+                                    const nir_tex_instr *instr,
                                     bool image, bool write);
 
 static unsigned radeon_llvm_reg_index_soa(unsigned index, unsigned chan)
@@ -476,7 +474,7 @@ get_tcs_out_patch0_offset(struct nir_to_llvm_context *ctx)
 {
        return LLVMBuildMul(ctx->builder,
                            unpack_param(&ctx->ac, ctx->tcs_out_offsets, 0, 16),
-                           LLVMConstInt(ctx->i32, 4, false), "");
+                           LLVMConstInt(ctx->ac.i32, 4, false), "");
 }
 
 static LLVMValueRef
@@ -484,7 +482,7 @@ get_tcs_out_patch0_patch_data_offset(struct nir_to_llvm_context *ctx)
 {
        return LLVMBuildMul(ctx->builder,
                            unpack_param(&ctx->ac, ctx->tcs_out_offsets, 16, 16),
-                           LLVMConstInt(ctx->i32, 4, false), "");
+                           LLVMConstInt(ctx->ac.i32, 4, false), "");
 }
 
 static LLVMValueRef
@@ -548,14 +546,6 @@ static void set_userdata_location_indirect(struct ac_userdata_info *ud_info, uin
        ud_info->indirect_offset = indirect_offset;
 }
 
-static void declare_tess_lds(struct nir_to_llvm_context *ctx)
-{
-       unsigned lds_size = ctx->options->chip_class >= CIK ? 65536 : 32768;
-       ctx->lds = LLVMBuildIntToPtr(ctx->builder, ctx->i32zero,
-                                    LLVMPointerType(LLVMArrayType(ctx->i32, lds_size / 4), LOCAL_ADDR_SPACE),
-               "tess_lds");
-}
-
 struct user_sgpr_info {
        bool need_ring_offsets;
        uint8_t sgpr_count;
@@ -586,7 +576,8 @@ static void allocate_user_sgprs(struct nir_to_llvm_context *ctx,
 
        switch (ctx->stage) {
        case MESA_SHADER_COMPUTE:
-               user_sgpr_info->sgpr_count += ctx->shader_info->info.cs.grid_components_used;
+               if (ctx->shader_info->info.cs.uses_grid_size)
+                       user_sgpr_info->sgpr_count += 3;
                break;
        case MESA_SHADER_FRAGMENT:
                user_sgpr_info->sgpr_count += ctx->shader_info->info.ps.needs_sample_positions;
@@ -646,15 +637,15 @@ radv_define_common_user_sgprs_phase1(struct nir_to_llvm_context *ctx,
        if (!user_sgpr_info->indirect_all_descriptor_sets) {
                for (unsigned i = 0; i < num_sets; ++i) {
                        if (ctx->options->layout->set[i].layout->shader_stages & stage_mask) {
-                               add_user_sgpr_array_argument(args, const_array(ctx->i8, 1024 * 1024), &ctx->descriptor_sets[i]);
+                               add_user_sgpr_array_argument(args, const_array(ctx->ac.i8, 1024 * 1024), &ctx->descriptor_sets[i]);
                        }
                }
        } else
-               add_user_sgpr_array_argument(args, const_array(const_array(ctx->i8, 1024 * 1024), 32), desc_sets);
+               add_user_sgpr_array_argument(args, const_array(const_array(ctx->ac.i8, 1024 * 1024), 32), desc_sets);
 
        if (ctx->shader_info->info.needs_push_constants) {
                /* 1 for push constants and dynamic descriptors */
-               add_user_sgpr_array_argument(args, const_array(ctx->i8, 1024 * 1024), &ctx->push_constants);
+               add_user_sgpr_array_argument(args, const_array(ctx->ac.i8, 1024 * 1024), &ctx->push_constants);
        }
 }
 
@@ -686,7 +677,7 @@ radv_define_common_user_sgprs_phase2(struct nir_to_llvm_context *ctx,
                for (unsigned i = 0; i < num_sets; ++i) {
                        if (ctx->options->layout->set[i].layout->shader_stages & stage_mask) {
                                set_userdata_location_indirect(&ctx->shader_info->user_sgprs_locs.descriptor_sets[i], desc_sgpr_idx, 2, i * 8);
-                               ctx->descriptor_sets[i] = ac_build_load_to_sgpr(&ctx->ac, desc_sets, LLVMConstInt(ctx->i32, i, false));
+                               ctx->descriptor_sets[i] = ac_build_load_to_sgpr(&ctx->ac, desc_sets, LLVMConstInt(ctx->ac.i32, i, false));
 
                        } else
                                ctx->descriptor_sets[i] = NULL;
@@ -708,11 +699,11 @@ radv_define_vs_user_sgprs_phase1(struct nir_to_llvm_context *ctx,
 {
        if (!ctx->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX || (has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) {
                if (ctx->shader_info->info.vs.has_vertex_buffers)
-                       add_user_sgpr_argument(args, const_array(ctx->v4i32, 16), &ctx->vertex_buffers); /* vertex buffers */
-               add_user_sgpr_argument(args, ctx->i32, &ctx->abi.base_vertex); // base vertex
-               add_user_sgpr_argument(args, ctx->i32, &ctx->abi.start_instance);// start instance
+                       add_user_sgpr_argument(args, const_array(ctx->ac.v4i32, 16), &ctx->vertex_buffers); /* vertex buffers */
+               add_user_sgpr_argument(args, ctx->ac.i32, &ctx->abi.base_vertex); // base vertex
+               add_user_sgpr_argument(args, ctx->ac.i32, &ctx->abi.start_instance);// start instance
                if (ctx->shader_info->info.vs.needs_draw_id)
-                       add_user_sgpr_argument(args, ctx->i32, &ctx->abi.draw_id); // draw id
+                       add_user_sgpr_argument(args, ctx->ac.i32, &ctx->abi.draw_id); // draw id
        }
 }
 
@@ -749,172 +740,174 @@ static void create_function(struct nir_to_llvm_context *ctx,
        allocate_user_sgprs(ctx, &user_sgpr_info);
 
        if (user_sgpr_info.need_ring_offsets && !ctx->options->supports_spill) {
-               add_user_sgpr_argument(&args, const_array(ctx->v4i32, 16), &ctx->ring_offsets); /* address of rings */
+               add_user_sgpr_argument(&args, const_array(ctx->ac.v4i32, 16), &ctx->ring_offsets); /* address of rings */
        }
 
        switch (stage) {
        case MESA_SHADER_COMPUTE:
                radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
-               if (ctx->shader_info->info.cs.grid_components_used)
-                       add_user_sgpr_argument(&args, LLVMVectorType(ctx->i32, ctx->shader_info->info.cs.grid_components_used), &ctx->num_work_groups); /* grid size */
-               add_sgpr_argument(&args, LLVMVectorType(ctx->i32, 3), &ctx->workgroup_ids);
-               add_sgpr_argument(&args, ctx->i32, &ctx->tg_size);
-               add_vgpr_argument(&args, LLVMVectorType(ctx->i32, 3), &ctx->local_invocation_ids);
+               if (ctx->shader_info->info.cs.uses_grid_size) {
+                       add_user_sgpr_argument(&args, ctx->ac.v3i32,
+                                              &ctx->num_work_groups);
+               }
+               add_sgpr_argument(&args, ctx->ac.v3i32, &ctx->workgroup_ids);
+               add_sgpr_argument(&args, ctx->ac.i32, &ctx->tg_size);
+               add_vgpr_argument(&args, ctx->ac.v3i32, &ctx->local_invocation_ids);
                break;
        case MESA_SHADER_VERTEX:
                radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
                radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
                if (ctx->shader_info->info.needs_multiview_view_index || (!ctx->options->key.vs.as_es && !ctx->options->key.vs.as_ls && ctx->options->key.has_multiview_view_index))
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
                if (ctx->options->key.vs.as_es)
-                       add_sgpr_argument(&args, ctx->i32, &ctx->es2gs_offset); // es2gs offset
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->es2gs_offset); // es2gs offset
                else if (ctx->options->key.vs.as_ls)
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->ls_out_layout); // ls out layout
-               add_vgpr_argument(&args, ctx->i32, &ctx->abi.vertex_id); // vertex id
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->ls_out_layout); // ls out layout
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.vertex_id); // vertex id
                if (!ctx->is_gs_copy_shader) {
-                       add_vgpr_argument(&args, ctx->i32, &ctx->rel_auto_id); // rel auto id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->vs_prim_id); // vs prim id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->abi.instance_id); // instance id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->rel_auto_id); // rel auto id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->vs_prim_id); // vs prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.instance_id); // instance id
                }
                break;
        case MESA_SHADER_TESS_CTRL:
                if (has_previous_stage) {
                        // First 6 system regs
-                       add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // param oc lds
-                       add_sgpr_argument(&args, ctx->i32, &ctx->merged_wave_info); // merged wave info
-                       add_sgpr_argument(&args, ctx->i32, &ctx->tess_factor_offset); // tess factor offset
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->oc_lds); // param oc lds
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->merged_wave_info); // merged wave info
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->tess_factor_offset); // tess factor offset
 
-                       add_sgpr_argument(&args, ctx->i32, NULL); // scratch offset
-                       add_sgpr_argument(&args, ctx->i32, NULL); // unknown
-                       add_sgpr_argument(&args, ctx->i32, NULL); // unknown
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // scratch offset
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // unknown
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // unknown
 
                        radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
                        radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->ls_out_layout); // ls out layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->ls_out_layout); // ls out layout
 
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_offchip_layout); // tcs offchip layout
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_offsets); // tcs out offsets
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_layout); // tcs out layout
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_in_layout); // tcs in layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_offchip_layout); // tcs offchip layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_out_offsets); // tcs out offsets
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_out_layout); // tcs out layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_in_layout); // tcs in layout
                        if (ctx->shader_info->info.needs_multiview_view_index)
-                               add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
-
-                       add_vgpr_argument(&args, ctx->i32, &ctx->tcs_patch_id); // patch id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->tcs_rel_ids); // rel ids;
-                       add_vgpr_argument(&args, ctx->i32, &ctx->abi.vertex_id); // vertex id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->rel_auto_id); // rel auto id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->vs_prim_id); // vs prim id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->abi.instance_id); // instance id
+                               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
+
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->tcs_patch_id); // patch id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->tcs_rel_ids); // rel ids;
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.vertex_id); // vertex id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->rel_auto_id); // rel auto id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->vs_prim_id); // vs prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.instance_id); // instance id
                } else {
                        radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_offchip_layout); // tcs offchip layout
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_offsets); // tcs out offsets
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_layout); // tcs out layout
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_in_layout); // tcs in layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_offchip_layout); // tcs offchip layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_out_offsets); // tcs out offsets
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_out_layout); // tcs out layout
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_in_layout); // tcs in layout
                        if (ctx->shader_info->info.needs_multiview_view_index)
-                               add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
-                       add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // param oc lds
-                       add_sgpr_argument(&args, ctx->i32, &ctx->tess_factor_offset); // tess factor offset
-                       add_vgpr_argument(&args, ctx->i32, &ctx->tcs_patch_id); // patch id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->tcs_rel_ids); // rel ids;
+                               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->oc_lds); // param oc lds
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->tess_factor_offset); // tess factor offset
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->tcs_patch_id); // patch id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->tcs_rel_ids); // rel ids;
                }
                break;
        case MESA_SHADER_TESS_EVAL:
                radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
-               add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_offchip_layout); // tcs offchip layout
+               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_offchip_layout); // tcs offchip layout
                if (ctx->shader_info->info.needs_multiview_view_index || (!ctx->options->key.tes.as_es && ctx->options->key.has_multiview_view_index))
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
                if (ctx->options->key.tes.as_es) {
-                       add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // OC LDS
-                       add_sgpr_argument(&args, ctx->i32, NULL); //
-                       add_sgpr_argument(&args, ctx->i32, &ctx->es2gs_offset); // es2gs offset
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->oc_lds); // OC LDS
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); //
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->es2gs_offset); // es2gs offset
                } else {
-                       add_sgpr_argument(&args, ctx->i32, NULL); //
-                       add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // OC LDS
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); //
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->oc_lds); // OC LDS
                }
-               add_vgpr_argument(&args, ctx->f32, &ctx->tes_u); // tes_u
-               add_vgpr_argument(&args, ctx->f32, &ctx->tes_v); // tes_v
-               add_vgpr_argument(&args, ctx->i32, &ctx->tes_rel_patch_id); // tes rel patch id
-               add_vgpr_argument(&args, ctx->i32, &ctx->tes_patch_id); // tes patch id
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->tes_u); // tes_u
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->tes_v); // tes_v
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->tes_rel_patch_id); // tes rel patch id
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->tes_patch_id); // tes patch id
                break;
        case MESA_SHADER_GEOMETRY:
                if (has_previous_stage) {
                        // First 6 system regs
-                       add_sgpr_argument(&args, ctx->i32, &ctx->gs2vs_offset); // tess factor offset
-                       add_sgpr_argument(&args, ctx->i32, &ctx->merged_wave_info); // merged wave info
-                       add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // param oc lds
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->gs2vs_offset); // tess factor offset
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->merged_wave_info); // merged wave info
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->oc_lds); // param oc lds
 
-                       add_sgpr_argument(&args, ctx->i32, NULL); // scratch offset
-                       add_sgpr_argument(&args, ctx->i32, NULL); // unknown
-                       add_sgpr_argument(&args, ctx->i32, NULL); // unknown
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // scratch offset
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // unknown
+                       add_sgpr_argument(&args, ctx->ac.i32, NULL); // unknown
 
                        radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
                        if (previous_stage == MESA_SHADER_TESS_EVAL)
-                               add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_offchip_layout); // tcs offchip layout
+                               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->tcs_offchip_layout); // tcs offchip layout
                        else
                                radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_ring_stride); // gsvs stride
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_num_entries); // gsvs num entires
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->gsvs_ring_stride); // gsvs stride
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->gsvs_num_entries); // gsvs num entires
                        if (ctx->shader_info->info.needs_multiview_view_index)
-                               add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
+                               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
 
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[0]); // vtx01
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[2]); // vtx23
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_prim_id); // prim id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_invocation_id);
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[4]);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[0]); // vtx01
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[2]); // vtx23
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_prim_id); // prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_invocation_id);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[4]);
 
                        if (previous_stage == MESA_SHADER_VERTEX) {
-                               add_vgpr_argument(&args, ctx->i32, &ctx->abi.vertex_id); // vertex id
-                               add_vgpr_argument(&args, ctx->i32, &ctx->rel_auto_id); // rel auto id
-                               add_vgpr_argument(&args, ctx->i32, &ctx->vs_prim_id); // vs prim id
-                               add_vgpr_argument(&args, ctx->i32, &ctx->abi.instance_id); // instance id
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.vertex_id); // vertex id
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->rel_auto_id); // rel auto id
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->vs_prim_id); // vs prim id
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.instance_id); // instance id
                        } else {
-                               add_vgpr_argument(&args, ctx->f32, &ctx->tes_u); // tes_u
-                               add_vgpr_argument(&args, ctx->f32, &ctx->tes_v); // tes_v
-                               add_vgpr_argument(&args, ctx->i32, &ctx->tes_rel_patch_id); // tes rel patch id
-                               add_vgpr_argument(&args, ctx->i32, &ctx->tes_patch_id); // tes patch id
+                               add_vgpr_argument(&args, ctx->ac.f32, &ctx->tes_u); // tes_u
+                               add_vgpr_argument(&args, ctx->ac.f32, &ctx->tes_v); // tes_v
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->tes_rel_patch_id); // tes rel patch id
+                               add_vgpr_argument(&args, ctx->ac.i32, &ctx->tes_patch_id); // tes patch id
                        }
                } else {
                        radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
                        radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_ring_stride); // gsvs stride
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_num_entries); // gsvs num entires
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->gsvs_ring_stride); // gsvs stride
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->gsvs_num_entries); // gsvs num entires
                        if (ctx->shader_info->info.needs_multiview_view_index)
-                               add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
-                       add_sgpr_argument(&args, ctx->i32, &ctx->gs2vs_offset); // gs2vs offset
-                       add_sgpr_argument(&args, ctx->i32, &ctx->gs_wave_id); // wave id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[0]); // vtx0
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[1]); // vtx1
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_prim_id); // prim id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[2]);
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[3]);
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[4]);
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[5]);
-                       add_vgpr_argument(&args, ctx->i32, &ctx->gs_invocation_id);
+                               add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->view_index);
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->gs2vs_offset); // gs2vs offset
+                       add_sgpr_argument(&args, ctx->ac.i32, &ctx->gs_wave_id); // wave id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[0]); // vtx0
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[1]); // vtx1
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_prim_id); // prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[2]);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[3]);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[4]);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[5]);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_invocation_id);
                }
                break;
        case MESA_SHADER_FRAGMENT:
                radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
                if (ctx->shader_info->info.ps.needs_sample_positions)
-                       add_user_sgpr_argument(&args, ctx->i32, &ctx->sample_pos_offset); /* sample position offset */
-               add_sgpr_argument(&args, ctx->i32, &ctx->prim_mask); /* prim mask */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_sample); /* persp sample */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_center); /* persp center */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_centroid); /* persp centroid */
-               add_vgpr_argument(&args, ctx->v3i32, NULL); /* persp pull model */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_sample); /* linear sample */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_center); /* linear center */
-               add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_centroid); /* linear centroid */
-               add_vgpr_argument(&args, ctx->f32, NULL);  /* line stipple tex */
-               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[0]);  /* pos x float */
-               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[1]);  /* pos y float */
-               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[2]);  /* pos z float */
-               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[3]);  /* pos w float */
-               add_vgpr_argument(&args, ctx->i32, &ctx->abi.front_face);  /* front face */
-               add_vgpr_argument(&args, ctx->i32, &ctx->abi.ancillary);  /* ancillary */
-               add_vgpr_argument(&args, ctx->i32, &ctx->abi.sample_coverage);  /* sample coverage */
-               add_vgpr_argument(&args, ctx->i32, NULL);  /* fixed pt */
+                       add_user_sgpr_argument(&args, ctx->ac.i32, &ctx->sample_pos_offset); /* sample position offset */
+               add_sgpr_argument(&args, ctx->ac.i32, &ctx->prim_mask); /* prim mask */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->persp_sample); /* persp sample */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->persp_center); /* persp center */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->persp_centroid); /* persp centroid */
+               add_vgpr_argument(&args, ctx->ac.v3i32, NULL); /* persp pull model */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->linear_sample); /* linear sample */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->linear_center); /* linear center */
+               add_vgpr_argument(&args, ctx->ac.v2i32, &ctx->linear_centroid); /* linear centroid */
+               add_vgpr_argument(&args, ctx->ac.f32, NULL);  /* line stipple tex */
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->abi.frag_pos[0]);  /* pos x float */
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->abi.frag_pos[1]);  /* pos y float */
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->abi.frag_pos[2]);  /* pos z float */
+               add_vgpr_argument(&args, ctx->ac.f32, &ctx->abi.frag_pos[3]);  /* pos w float */
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.front_face);  /* front face */
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.ancillary);  /* ancillary */
+               add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.sample_coverage);  /* sample coverage */
+               add_vgpr_argument(&args, ctx->ac.i32, NULL);  /* fixed pt */
                break;
        default:
                unreachable("Shader stage not implemented");
@@ -943,10 +936,10 @@ static void create_function(struct nir_to_llvm_context *ctx,
                set_userdata_location_shader(ctx, AC_UD_SCRATCH_RING_OFFSETS, &user_sgpr_idx, 2);
                if (ctx->options->supports_spill) {
                        ctx->ring_offsets = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.implicit.buffer.ptr",
-                                                              LLVMPointerType(ctx->i8, CONST_ADDR_SPACE),
+                                                              LLVMPointerType(ctx->ac.i8, CONST_ADDR_SPACE),
                                                               NULL, 0, AC_FUNC_ATTR_READNONE);
                        ctx->ring_offsets = LLVMBuildBitCast(ctx->builder, ctx->ring_offsets,
-                                                            const_array(ctx->v4i32, 16), "");
+                                                            const_array(ctx->ac.v4i32, 16), "");
                }
        }
        
@@ -959,8 +952,9 @@ static void create_function(struct nir_to_llvm_context *ctx,
 
        switch (stage) {
        case MESA_SHADER_COMPUTE:
-               if (ctx->shader_info->info.cs.grid_components_used) {
-                       set_userdata_location_shader(ctx, AC_UD_CS_GRID_SIZE, &user_sgpr_idx, ctx->shader_info->info.cs.grid_components_used);
+               if (ctx->shader_info->info.cs.uses_grid_size) {
+                       set_userdata_location_shader(ctx, AC_UD_CS_GRID_SIZE,
+                                                    &user_sgpr_idx, 3);
                }
                break;
        case MESA_SHADER_VERTEX:
@@ -971,7 +965,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
                        set_userdata_location_shader(ctx, AC_UD_VS_LS_TCS_IN_LAYOUT, &user_sgpr_idx, 1);
                }
                if (ctx->options->key.vs.as_ls)
-                       declare_tess_lds(ctx);
+                       ac_declare_lds_as_pointer(&ctx->ac);
                break;
        case MESA_SHADER_TESS_CTRL:
                radv_define_vs_user_sgprs_phase2(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_idx);
@@ -980,7 +974,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
                set_userdata_location_shader(ctx, AC_UD_TCS_OFFCHIP_LAYOUT, &user_sgpr_idx, 4);
                if (ctx->view_index)
                        set_userdata_location_shader(ctx, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
-               declare_tess_lds(ctx);
+               ac_declare_lds_as_pointer(&ctx->ac);
                break;
        case MESA_SHADER_TESS_EVAL:
                set_userdata_location_shader(ctx, AC_UD_TES_OFFCHIP_LAYOUT, &user_sgpr_idx, 1);
@@ -998,7 +992,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
                if (ctx->view_index)
                        set_userdata_location_shader(ctx, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
                if (has_previous_stage)
-                       declare_tess_lds(ctx);
+                       ac_declare_lds_as_pointer(&ctx->ac);
                break;
        case MESA_SHADER_FRAGMENT:
                if (ctx->shader_info->info.ps.needs_sample_positions) {
@@ -1012,46 +1006,6 @@ static void create_function(struct nir_to_llvm_context *ctx,
        ctx->shader_info->num_user_sgprs = user_sgpr_idx;
 }
 
-static void setup_types(struct nir_to_llvm_context *ctx)
-{
-       LLVMValueRef args[4];
-
-       ctx->voidt = LLVMVoidTypeInContext(ctx->context);
-       ctx->i1 = LLVMIntTypeInContext(ctx->context, 1);
-       ctx->i8 = LLVMIntTypeInContext(ctx->context, 8);
-       ctx->i16 = LLVMIntTypeInContext(ctx->context, 16);
-       ctx->i32 = LLVMIntTypeInContext(ctx->context, 32);
-       ctx->i64 = LLVMIntTypeInContext(ctx->context, 64);
-       ctx->v2i32 = LLVMVectorType(ctx->i32, 2);
-       ctx->v3i32 = LLVMVectorType(ctx->i32, 3);
-       ctx->v4i32 = LLVMVectorType(ctx->i32, 4);
-       ctx->v8i32 = LLVMVectorType(ctx->i32, 8);
-       ctx->f32 = LLVMFloatTypeInContext(ctx->context);
-       ctx->f16 = LLVMHalfTypeInContext(ctx->context);
-       ctx->f64 = LLVMDoubleTypeInContext(ctx->context);
-       ctx->v2f32 = LLVMVectorType(ctx->f32, 2);
-       ctx->v4f32 = LLVMVectorType(ctx->f32, 4);
-
-       ctx->i1false = LLVMConstInt(ctx->i1, 0, false);
-       ctx->i1true = LLVMConstInt(ctx->i1, 1, false);
-       ctx->i32zero = LLVMConstInt(ctx->i32, 0, false);
-       ctx->i32one = LLVMConstInt(ctx->i32, 1, false);
-       ctx->f32zero = LLVMConstReal(ctx->f32, 0.0);
-       ctx->f32one = LLVMConstReal(ctx->f32, 1.0);
-
-       args[0] = ctx->f32zero;
-       args[1] = ctx->f32zero;
-       args[2] = ctx->f32zero;
-       args[3] = ctx->f32one;
-       ctx->v4f32empty = LLVMConstVector(args, 4);
-
-       ctx->uniform_md_kind =
-           LLVMGetMDKindIDInContext(ctx->context, "amdgpu.uniform", 14);
-       ctx->empty_md = LLVMMDNodeInContext(ctx->context, NULL, 0);
-
-       args[0] = LLVMConstReal(ctx->f32, 2.5);
-}
-
 static int get_llvm_num_components(LLVMValueRef value)
 {
        LLVMTypeRef type = LLVMTypeOf(value);
@@ -1067,7 +1021,6 @@ static LLVMValueRef llvm_extract_elem(struct ac_llvm_context *ac,
 {
        int count = get_llvm_num_components(value);
 
-       assert(index < count);
        if (count == 1)
                return value;
 
@@ -1262,46 +1215,6 @@ static LLVMValueRef emit_bcsel(struct ac_llvm_context *ctx,
        return LLVMBuildSelect(ctx->builder, v, src1, src2, "");
 }
 
-static LLVMValueRef emit_find_lsb(struct ac_llvm_context *ctx,
-                                 LLVMValueRef src0)
-{
-       LLVMValueRef params[2] = {
-               src0,
-
-               /* The value of 1 means that ffs(x=0) = undef, so LLVM won't
-                * add special code to check for x=0. The reason is that
-                * the LLVM behavior for x=0 is different from what we
-                * need here.
-                *
-                * The hardware already implements the correct behavior.
-                */
-               LLVMConstInt(ctx->i1, 1, false),
-       };
-
-       LLVMValueRef lsb = ac_build_intrinsic(ctx, "llvm.cttz.i32", ctx->i32,
-                                             params, 2,
-                                             AC_FUNC_ATTR_READNONE);
-
-       /* TODO: We need an intrinsic to skip this conditional. */
-       /* Check for zero: */
-       return LLVMBuildSelect(ctx->builder, LLVMBuildICmp(ctx->builder,
-                                                          LLVMIntEQ, src0,
-                                                          ctx->i32_0, ""),
-                              LLVMConstInt(ctx->i32, -1, 0), lsb, "");
-}
-
-static LLVMValueRef emit_ifind_msb(struct ac_llvm_context *ctx,
-                                  LLVMValueRef src0)
-{
-       return ac_build_imsb(ctx, src0, ctx->i32);
-}
-
-static LLVMValueRef emit_ufind_msb(struct ac_llvm_context *ctx,
-                                  LLVMValueRef src0)
-{
-       return ac_build_umsb(ctx, src0, ctx->i32);
-}
-
 static LLVMValueRef emit_minmax_int(struct ac_llvm_context *ctx,
                                    LLVMIntPredicate pred,
                                    LLVMValueRef src0, LLVMValueRef src1)
@@ -1412,21 +1325,21 @@ static LLVMValueRef emit_f2f16(struct nir_to_llvm_context *ctx,
        LLVMValueRef cond = NULL;
 
        src0 = ac_to_float(&ctx->ac, src0);
-       result = LLVMBuildFPTrunc(ctx->builder, src0, ctx->f16, "");
+       result = LLVMBuildFPTrunc(ctx->builder, src0, ctx->ac.f16, "");
 
        if (ctx->options->chip_class >= VI) {
                LLVMValueRef args[2];
                /* Check if the result is a denormal - and flush to 0 if so. */
                args[0] = result;
-               args[1] = LLVMConstInt(ctx->i32, N_SUBNORMAL | P_SUBNORMAL, false);
-               cond = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.class.f16", ctx->i1, args, 2, AC_FUNC_ATTR_READNONE);
+               args[1] = LLVMConstInt(ctx->ac.i32, N_SUBNORMAL | P_SUBNORMAL, false);
+               cond = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.class.f16", ctx->ac.i1, args, 2, AC_FUNC_ATTR_READNONE);
        }
 
        /* need to convert back up to f32 */
-       result = LLVMBuildFPExt(ctx->builder, result, ctx->f32, "");
+       result = LLVMBuildFPExt(ctx->builder, result, ctx->ac.f32, "");
 
        if (ctx->options->chip_class >= VI)
-               result = LLVMBuildSelect(ctx->builder, cond, ctx->f32zero, result, "");
+               result = LLVMBuildSelect(ctx->builder, cond, ctx->ac.f32_0, result, "");
        else {
                /* for SI/CIK */
                /* 0x38800000 is smallest half float value (2^-14) in 32-bit float,
@@ -1434,14 +1347,14 @@ static LLVMValueRef emit_f2f16(struct nir_to_llvm_context *ctx,
                 */
                LLVMValueRef temp, cond2;
                temp = emit_intrin_1f_param(&ctx->ac, "llvm.fabs",
-                                           ctx->f32, result);
+                                           ctx->ac.f32, result);
                cond = LLVMBuildFCmp(ctx->builder, LLVMRealUGT,
-                                    LLVMBuildBitCast(ctx->builder, LLVMConstInt(ctx->i32, 0x38800000, false), ctx->f32, ""),
+                                    LLVMBuildBitCast(ctx->builder, LLVMConstInt(ctx->ac.i32, 0x38800000, false), ctx->ac.f32, ""),
                                     temp, "");
                cond2 = LLVMBuildFCmp(ctx->builder, LLVMRealUNE,
-                                     temp, ctx->f32zero, "");
+                                     temp, ctx->ac.f32_0, "");
                cond = LLVMBuildAnd(ctx->builder, cond, cond2, "");
-               result = LLVMBuildSelect(ctx->builder, cond, ctx->f32zero, result, "");
+               result = LLVMBuildSelect(ctx->builder, cond, ctx->ac.f32_0, result, "");
        }
        return result;
 }
@@ -1517,23 +1430,13 @@ static LLVMValueRef emit_bitfield_insert(struct ac_llvm_context *ctx,
 static LLVMValueRef emit_pack_half_2x16(struct ac_llvm_context *ctx,
                                        LLVMValueRef src0)
 {
-       LLVMValueRef const16 = LLVMConstInt(ctx->i32, 16, false);
-       int i;
        LLVMValueRef comp[2];
 
        src0 = ac_to_float(ctx, src0);
        comp[0] = LLVMBuildExtractElement(ctx->builder, src0, ctx->i32_0, "");
        comp[1] = LLVMBuildExtractElement(ctx->builder, src0, ctx->i32_1, "");
-       for (i = 0; i < 2; i++) {
-               comp[i] = LLVMBuildFPTrunc(ctx->builder, comp[i], ctx->f16, "");
-               comp[i] = LLVMBuildBitCast(ctx->builder, comp[i], ctx->i16, "");
-               comp[i] = LLVMBuildZExt(ctx->builder, comp[i], ctx->i32, "");
-       }
 
-       comp[1] = LLVMBuildShl(ctx->builder, comp[1], const16, "");
-       comp[0] = LLVMBuildOr(ctx->builder, comp[0], comp[1], "");
-
-       return comp[0];
+       return ac_build_cvt_pkrtz_f16(ctx, comp);
 }
 
 static LLVMValueRef emit_unpack_half_2x16(struct ac_llvm_context *ctx,
@@ -1550,8 +1453,7 @@ static LLVMValueRef emit_unpack_half_2x16(struct ac_llvm_context *ctx,
                temps[i] = LLVMBuildFPExt(ctx->builder, val, ctx->f32, "");
        }
 
-       LLVMTypeRef v2f32 = LLVMVectorType(ctx->f32, 2);
-       result = LLVMBuildInsertElement(ctx->builder, LLVMGetUndef(v2f32), temps[0],
+       result = LLVMBuildInsertElement(ctx->builder, LLVMGetUndef(ctx->v2f32), temps[0],
                                        ctx->i32_0, "");
        result = LLVMBuildInsertElement(ctx->builder, result, temps[1],
                                        ctx->i32_1, "");
@@ -1904,6 +1806,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
                result = LLVMBuildUIToFP(ctx->ac.builder, src[0], ac_to_float_type(&ctx->ac, def_type), "");
                break;
        case nir_op_f2f64:
+               src[0] = ac_to_float(&ctx->ac, src[0]);
                result = LLVMBuildFPExt(ctx->ac.builder, src[0], ac_to_float_type(&ctx->ac, def_type), "");
                break;
        case nir_op_f2f32:
@@ -1930,15 +1833,15 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
                break;
        case nir_op_find_lsb:
                src[0] = ac_to_integer(&ctx->ac, src[0]);
-               result = emit_find_lsb(&ctx->ac, src[0]);
+               result = ac_find_lsb(&ctx->ac, ctx->ac.i32, src[0]);
                break;
        case nir_op_ufind_msb:
                src[0] = ac_to_integer(&ctx->ac, src[0]);
-               result = emit_ufind_msb(&ctx->ac, src[0]);
+               result = ac_build_umsb(&ctx->ac, src[0], ctx->ac.i32);
                break;
        case nir_op_ifind_msb:
                src[0] = ac_to_integer(&ctx->ac, src[0]);
-               result = emit_ifind_msb(&ctx->ac, src[0]);
+               result = ac_build_imsb(&ctx->ac, src[0], ctx->ac.i32);
                break;
        case nir_op_uadd_carry:
                src[0] = ac_to_integer(&ctx->ac, src[0]);
@@ -1994,7 +1897,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
        case nir_op_unpack_64_2x32_split_x: {
                assert(instr->src[0].src.ssa->num_components == 1);
                LLVMValueRef tmp = LLVMBuildBitCast(ctx->ac.builder, src[0],
-                                                   LLVMVectorType(ctx->ac.i32, 2),
+                                                   ctx->ac.v2i32,
                                                    "");
                result = LLVMBuildExtractElement(ctx->ac.builder, tmp,
                                                 ctx->ac.i32_0, "");
@@ -2004,7 +1907,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
        case nir_op_unpack_64_2x32_split_y: {
                assert(instr->src[0].src.ssa->num_components == 1);
                LLVMValueRef tmp = LLVMBuildBitCast(ctx->ac.builder, src[0],
-                                                   LLVMVectorType(ctx->ac.i32, 2),
+                                                   ctx->ac.v2i32,
                                                    "");
                result = LLVMBuildExtractElement(ctx->ac.builder, tmp,
                                                 ctx->ac.i32_1, "");
@@ -2012,7 +1915,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
        }
 
        case nir_op_pack_64_2x32_split: {
-               LLVMValueRef tmp = LLVMGetUndef(LLVMVectorType(ctx->ac.i32, 2));
+               LLVMValueRef tmp = LLVMGetUndef(ctx->ac.v2i32);
                tmp = LLVMBuildInsertElement(ctx->ac.builder, tmp,
                                             src[0], ctx->ac.i32_0, "");
                tmp = LLVMBuildInsertElement(ctx->ac.builder, tmp,
@@ -2317,19 +2220,30 @@ static LLVMValueRef visit_vulkan_resource_index(struct nir_to_llvm_context *ctx,
                        layout->binding[binding].dynamic_offset_offset;
                desc_ptr = ctx->push_constants;
                base_offset = pipeline_layout->push_constant_size + 16 * idx;
-               stride = LLVMConstInt(ctx->i32, 16, false);
+               stride = LLVMConstInt(ctx->ac.i32, 16, false);
        } else
-               stride = LLVMConstInt(ctx->i32, layout->binding[binding].size, false);
+               stride = LLVMConstInt(ctx->ac.i32, layout->binding[binding].size, false);
 
-       offset = LLVMConstInt(ctx->i32, base_offset, false);
+       offset = LLVMConstInt(ctx->ac.i32, base_offset, false);
        index = LLVMBuildMul(ctx->builder, index, stride, "");
        offset = LLVMBuildAdd(ctx->builder, offset, index, "");
        
        desc_ptr = ac_build_gep0(&ctx->ac, desc_ptr, offset);
-       desc_ptr = cast_ptr(ctx, desc_ptr, ctx->v4i32);
-       LLVMSetMetadata(desc_ptr, ctx->uniform_md_kind, ctx->empty_md);
+       desc_ptr = cast_ptr(ctx, desc_ptr, ctx->ac.v4i32);
+       LLVMSetMetadata(desc_ptr, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
+
+       return desc_ptr;
+}
+
+static LLVMValueRef visit_vulkan_resource_reindex(struct nir_to_llvm_context *ctx,
+                                                  nir_intrinsic_instr *instr)
+{
+       LLVMValueRef ptr = get_src(ctx->nir, instr->src[0]);
+       LLVMValueRef index = get_src(ctx->nir, instr->src[1]);
 
-       return LLVMBuildLoad(ctx->builder, desc_ptr, "");
+       LLVMValueRef result = LLVMBuildGEP(ctx->builder, ptr, &index, 1, "");
+       LLVMSetMetadata(result, ctx->ac.uniform_md_kind, ctx->ac.empty_md);
+       return result;
 }
 
 static LLVMValueRef visit_load_push_constant(struct nir_to_llvm_context *ctx,
@@ -2337,7 +2251,7 @@ static LLVMValueRef visit_load_push_constant(struct nir_to_llvm_context *ctx,
 {
        LLVMValueRef ptr, addr;
 
-       addr = LLVMConstInt(ctx->i32, nir_intrinsic_base(instr), 0);
+       addr = LLVMConstInt(ctx->ac.i32, nir_intrinsic_base(instr), 0);
        addr = LLVMBuildAdd(ctx->builder, addr, get_src(ctx->nir, instr->src[0]), "");
 
        ptr = ac_build_gep0(&ctx->ac, ctx->push_constants, addr);
@@ -2349,9 +2263,9 @@ static LLVMValueRef visit_load_push_constant(struct nir_to_llvm_context *ctx,
 static LLVMValueRef visit_get_buffer_size(struct ac_nir_context *ctx,
                                           const nir_intrinsic_instr *instr)
 {
-       LLVMValueRef desc = get_src(ctx, instr->src[0]);
+       LLVMValueRef ptr = get_src(ctx, instr->src[0]);
 
-       return get_buffer_size(ctx, desc, false);
+       return get_buffer_size(ctx, LLVMBuildLoad(ctx->ac.builder, ptr, ""), false);
 }
 static void visit_store_ssbo(struct ac_nir_context *ctx,
                              nir_intrinsic_instr *instr)
@@ -2364,13 +2278,12 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
        unsigned writemask = nir_intrinsic_write_mask(instr);
        LLVMValueRef base_data, base_offset;
        LLVMValueRef params[6];
-       LLVMValueRef i1false = LLVMConstInt(ctx->ac.i1, 0, false);
 
        params[1] = ctx->abi->load_ssbo(ctx->abi,
                                        get_src(ctx, instr->src[1]), true);
        params[2] = LLVMConstInt(ctx->ac.i32, 0, false); /* vindex */
-       params[4] = i1false;  /* glc */
-       params[5] = i1false;  /* slc */
+       params[4] = ctx->ac.i1false;  /* glc */
+       params[5] = ctx->ac.i1false;  /* slc */
 
        if (components_32bit > 1)
                data_type = LLVMVectorType(ctx->ac.f32, components_32bit);
@@ -2406,11 +2319,9 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
                        store_name = "llvm.amdgcn.buffer.store.v4f32";
                        data = base_data;
                } else if (count == 2) {
-                       LLVMTypeRef v2f32 = LLVMVectorType(ctx->ac.f32, 2);
-
                        tmp = LLVMBuildExtractElement(ctx->ac.builder,
                                                      base_data, LLVMConstInt(ctx->ac.i32, start, false), "");
-                       data = LLVMBuildInsertElement(ctx->ac.builder, LLVMGetUndef(v2f32), tmp,
+                       data = LLVMBuildInsertElement(ctx->ac.builder, LLVMGetUndef(ctx->ac.v2f32), tmp,
                                                      ctx->ac.i32_0, "");
 
                        tmp = LLVMBuildExtractElement(ctx->ac.builder,
@@ -2526,21 +2437,21 @@ static LLVMValueRef visit_load_buffer(struct ac_nir_context *ctx,
                else
                        unreachable("unhandled number of components");
 
-               LLVMValueRef i1false = LLVMConstInt(ctx->ac.i1, 0, false);
                LLVMValueRef params[] = {
                        ctx->abi->load_ssbo(ctx->abi,
                                            get_src(ctx, instr->src[0]),
                                            false),
                        LLVMConstInt(ctx->ac.i32, 0, false),
                        offset,
-                       i1false,
-                       i1false,
+                       ctx->ac.i1false,
+                       ctx->ac.i1false,
                };
 
                results[i] = ac_build_intrinsic(&ctx->ac, load_name, data_type, params, 5, 0);
 
        }
 
+       assume(results[0]);
        LLVMValueRef ret = results[0];
        if (num_components > 4 || num_components == 3) {
                LLVMValueRef masks[] = {
@@ -2586,7 +2497,7 @@ static LLVMValueRef visit_load_ubo_buffer(struct ac_nir_context *ctx,
        }
 
 
-       ret = ac_build_gather_values(&ctx->ac, results, instr->num_components);
+       ret = ac_build_gather_values(&ctx->ac, results, num_components);
        return LLVMBuildBitCast(ctx->ac.builder, ret,
                                get_def_type(ctx, &instr->dest.ssa), "");
 }
@@ -2670,23 +2581,6 @@ out:
        *indir_out = offset;
 }
 
-static LLVMValueRef
-lds_load(struct nir_to_llvm_context *ctx,
-        LLVMValueRef dw_addr)
-{
-       LLVMValueRef value;
-       value = ac_build_load(&ctx->ac, ctx->lds, dw_addr);
-       return value;
-}
-
-static void
-lds_store(struct nir_to_llvm_context *ctx,
-         LLVMValueRef dw_addr, LLVMValueRef value)
-{
-       value = LLVMBuildBitCast(ctx->builder, value, ctx->i32, "");
-       ac_build_indexed_store(&ctx->ac, ctx->lds,
-                              dw_addr, value);
-}
 
 /* The offchip buffer layout for TCS->TES is
  *
@@ -2719,7 +2613,7 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct nir_to_llvm_context *ctx,
        total_vertices = LLVMBuildMul(ctx->builder, vertices_per_patch,
                                      num_patches, "");
 
-       constant16 = LLVMConstInt(ctx->i32, 16, false);
+       constant16 = LLVMConstInt(ctx->ac.i32, 16, false);
        if (vertex_index) {
                base_addr = LLVMBuildMul(ctx->builder, rel_patch_id,
                                         vertices_per_patch, "");
@@ -2759,12 +2653,12 @@ static LLVMValueRef get_tcs_tes_buffer_address_params(struct nir_to_llvm_context
        LLVMValueRef param_index;
 
        if (indir_index)
-               param_index = LLVMBuildAdd(ctx->builder, LLVMConstInt(ctx->i32, param, false),
+               param_index = LLVMBuildAdd(ctx->builder, LLVMConstInt(ctx->ac.i32, param, false),
                                           indir_index, "");
        else {
                if (const_index && !is_compact)
                        param += const_index;
-               param_index = LLVMConstInt(ctx->i32, param, false);
+               param_index = LLVMConstInt(ctx->ac.i32, param, false);
        }
        return get_tcs_tes_buffer_address(ctx, vertex_index, param_index);
 }
@@ -2802,17 +2696,17 @@ get_dw_address(struct nir_to_llvm_context *ctx,
        if (indir_index)
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
                                       LLVMBuildMul(ctx->builder, indir_index,
-                                                   LLVMConstInt(ctx->i32, 4, false), ""), "");
+                                                   LLVMConstInt(ctx->ac.i32, 4, false), ""), "");
        else if (const_index && !compact_const_index)
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                                      LLVMConstInt(ctx->i32, const_index, false), "");
+                                      LLVMConstInt(ctx->ac.i32, const_index, false), "");
 
        dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                              LLVMConstInt(ctx->i32, param * 4, false), "");
+                              LLVMConstInt(ctx->ac.i32, param * 4, false), "");
 
        if (const_index && compact_const_index)
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                                      LLVMConstInt(ctx->i32, const_index, false), "");
+                                      LLVMConstInt(ctx->ac.i32, const_index, false), "");
        return dw_addr;
 }
 
@@ -2838,12 +2732,13 @@ load_tcs_input(struct nir_to_llvm_context *ctx,
        dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
                                 indir_index);
 
-       for (unsigned i = 0; i < instr->num_components; i++) {
-               value[i] = lds_load(ctx, dw_addr);
+       unsigned comp = instr->variables[0]->var->data.location_frac;
+       for (unsigned i = 0; i < instr->num_components + comp; i++) {
+               value[i] = ac_lds_load(&ctx->ac, dw_addr);
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                                      ctx->i32one, "");
+                                      ctx->ac.i32_1, "");
        }
-       result = ac_build_gather_values(&ctx->ac, value, instr->num_components);
+       result = ac_build_varying_gather_values(&ctx->ac, value, instr->num_components, comp);
        result = LLVMBuildBitCast(ctx->builder, result, get_def_type(ctx->nir, &instr->dest.ssa), "");
        return result;
 }
@@ -2876,12 +2771,13 @@ load_tcs_output(struct nir_to_llvm_context *ctx,
        dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
                                 indir_index);
 
-       for (unsigned i = 0; i < instr->num_components; i++) {
-               value[i] = lds_load(ctx, dw_addr);
+       unsigned comp = instr->variables[0]->var->data.location_frac;
+       for (unsigned i = comp; i < instr->num_components + comp; i++) {
+               value[i] = ac_lds_load(&ctx->ac, dw_addr);
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                                      ctx->i32one, "");
+                                      ctx->ac.i32_1, "");
        }
-       result = ac_build_gather_values(&ctx->ac, value, instr->num_components);
+       result = ac_build_varying_gather_values(&ctx->ac, value, instr->num_components, comp);
        result = LLVMBuildBitCast(ctx->builder, result, get_def_type(ctx->nir, &instr->dest.ssa), "");
        return result;
 }
@@ -2899,9 +2795,18 @@ store_tcs_output(struct nir_to_llvm_context *ctx,
        LLVMValueRef indir_index = NULL;
        unsigned const_index = 0;
        unsigned param;
+       const unsigned comp = instr->variables[0]->var->data.location_frac;
        const bool per_vertex = nir_is_per_vertex_io(instr->variables[0]->var, ctx->stage);
        const bool is_compact = instr->variables[0]->var->data.compact;
+       bool store_lds = true;
 
+       if (instr->variables[0]->var->data.patch) {
+               if (!(ctx->tcs_patch_outputs_read & (1U << instr->variables[0]->var->data.location)))
+                       store_lds = false;
+       } else {
+               if (!(ctx->tcs_outputs_read & (1ULL << instr->variables[0]->var->data.location)))
+                       store_lds = false;
+       }
        get_deref_offset(ctx->nir, instr->variables[0],
                         false, NULL, per_vertex ? &vertex_index : NULL,
                         &const_index, &indir_index);
@@ -2936,9 +2841,10 @@ store_tcs_output(struct nir_to_llvm_context *ctx,
        for (unsigned chan = 0; chan < 8; chan++) {
                if (!(writemask & (1 << chan)))
                        continue;
-               LLVMValueRef value = llvm_extract_elem(&ctx->ac, src, chan);
+               LLVMValueRef value = llvm_extract_elem(&ctx->ac, src, chan - comp);
 
-               lds_store(ctx, dw_addr, value);
+               if (store_lds || is_tess_factor)
+                       ac_lds_store(&ctx->ac, dw_addr, value);
 
                if (!is_tess_factor && writemask != 0xF)
                        ac_build_buffer_store_dword(&ctx->ac, ctx->hs_ring_tess_offchip, value, 1,
@@ -2946,7 +2852,7 @@ store_tcs_output(struct nir_to_llvm_context *ctx,
                                                    4 * (base + chan), 1, 0, true, false);
 
                dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
-                                      ctx->i32one, "");
+                                      ctx->ac.i32_1, "");
        }
 
        if (writemask == 0xF) {
@@ -2978,9 +2884,14 @@ load_tes_input(struct nir_to_llvm_context *ctx,
                const_index -= 3;
                param++;
        }
+
+       unsigned comp = instr->variables[0]->var->data.location_frac;
        buf_addr = get_tcs_tes_buffer_address_params(ctx, param, const_index,
                                                     is_compact, vertex_index, indir_index);
 
+       LLVMValueRef comp_offset = LLVMConstInt(ctx->ac.i32, comp * 4, false);
+       buf_addr = LLVMBuildAdd(ctx->builder, buf_addr, comp_offset, "");
+
        result = ac_build_buffer_load(&ctx->ac, ctx->hs_ring_tess_offchip, instr->num_components, NULL,
                                      buf_addr, ctx->oc_lds, is_compact ? (4 * const_index) : 0, 1, 0, true, false);
        result = trim_vector(&ctx->ac, result, instr->num_components);
@@ -2989,48 +2900,52 @@ load_tes_input(struct nir_to_llvm_context *ctx,
 }
 
 static LLVMValueRef
-load_gs_input(struct nir_to_llvm_context *ctx,
-             nir_intrinsic_instr *instr)
+load_gs_input(struct ac_shader_abi *abi,
+             unsigned location,
+             unsigned driver_location,
+             unsigned component,
+             unsigned num_components,
+             unsigned vertex_index,
+             unsigned const_index,
+             LLVMTypeRef type)
 {
-       LLVMValueRef indir_index, vtx_offset;
-       unsigned const_index;
+       struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi);
+       LLVMValueRef vtx_offset;
        LLVMValueRef args[9];
        unsigned param, vtx_offset_param;
        LLVMValueRef value[4], result;
-       unsigned vertex_index;
-       get_deref_offset(ctx->nir, instr->variables[0],
-                        false, &vertex_index, NULL,
-                        &const_index, &indir_index);
+
        vtx_offset_param = vertex_index;
        assert(vtx_offset_param < 6);
        vtx_offset = LLVMBuildMul(ctx->builder, ctx->gs_vtx_offset[vtx_offset_param],
-                                 LLVMConstInt(ctx->i32, 4, false), "");
+                                 LLVMConstInt(ctx->ac.i32, 4, false), "");
 
-       param = shader_io_get_unique_index(instr->variables[0]->var->data.location);
-       for (unsigned i = 0; i < instr->num_components; i++) {
+       param = shader_io_get_unique_index(location);
+
+       for (unsigned i = component; i < num_components + component; i++) {
                if (ctx->ac.chip_class >= GFX9) {
                        LLVMValueRef dw_addr = ctx->gs_vtx_offset[vtx_offset_param];
                        dw_addr = LLVMBuildAdd(ctx->ac.builder, dw_addr,
                                               LLVMConstInt(ctx->ac.i32, param * 4 + i + const_index, 0), "");
-                       value[i] = lds_load(ctx, dw_addr);
+                       value[i] = ac_lds_load(&ctx->ac, dw_addr);
                } else {
                        args[0] = ctx->esgs_ring;
                        args[1] = vtx_offset;
-                       args[2] = LLVMConstInt(ctx->i32, (param * 4 + i + const_index) * 256, false);
-                       args[3] = ctx->i32zero;
-                       args[4] = ctx->i32one; /* OFFEN */
-                       args[5] = ctx->i32zero; /* IDXEN */
-                       args[6] = ctx->i32one; /* GLC */
-                       args[7] = ctx->i32zero; /* SLC */
-                       args[8] = ctx->i32zero; /* TFE */
+                       args[2] = LLVMConstInt(ctx->ac.i32, (param * 4 + i + const_index) * 256, false);
+                       args[3] = ctx->ac.i32_0;
+                       args[4] = ctx->ac.i32_1; /* OFFEN */
+                       args[5] = ctx->ac.i32_0; /* IDXEN */
+                       args[6] = ctx->ac.i32_1; /* GLC */
+                       args[7] = ctx->ac.i32_0; /* SLC */
+                       args[8] = ctx->ac.i32_0; /* TFE */
 
                        value[i] = ac_build_intrinsic(&ctx->ac, "llvm.SI.buffer.load.dword.i32.i32",
-                                                     ctx->i32, args, 9,
+                                                     ctx->ac.i32, args, 9,
                                                      AC_FUNC_ATTR_READONLY |
                                                      AC_FUNC_ATTR_LEGACY);
                }
        }
-       result = ac_build_gather_values(&ctx->ac, value, instr->num_components);
+       result = ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
 
        return result;
 }
@@ -3080,6 +2995,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
        LLVMValueRef values[8];
        int idx = instr->variables[0]->var->data.driver_location;
        int ve = instr->dest.ssa.num_components;
+       unsigned comp = instr->variables[0]->var->data.location_frac;
        LLVMValueRef indir_index;
        LLVMValueRef ret;
        unsigned const_index;
@@ -3098,9 +3014,19 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
                if (ctx->stage == MESA_SHADER_TESS_EVAL)
                        return load_tes_input(ctx->nctx, instr);
                if (ctx->stage == MESA_SHADER_GEOMETRY) {
-                       return load_gs_input(ctx->nctx, instr);
+                               LLVMValueRef indir_index;
+                               unsigned const_index, vertex_index;
+                               get_deref_offset(ctx, instr->variables[0],
+                                                false, &vertex_index, NULL,
+                                                &const_index, &indir_index);
+                       return ctx->abi->load_inputs(ctx->abi, instr->variables[0]->var->data.location,
+                                                    instr->variables[0]->var->data.driver_location,
+                                                    instr->variables[0]->var->data.location_frac, ve,
+                                                    vertex_index, const_index,
+                                                    nir2llvmtype(ctx, instr->variables[0]->var->type));
                }
-               for (unsigned chan = 0; chan < ve; chan++) {
+
+               for (unsigned chan = comp; chan < ve + comp; chan++) {
                        if (indir_index) {
                                unsigned count = glsl_count_attribute_slots(
                                                instr->variables[0]->var->type,
@@ -3146,7 +3072,8 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
        case nir_var_shader_out:
                if (ctx->stage == MESA_SHADER_TESS_CTRL)
                        return load_tcs_output(ctx->nctx, instr);
-               for (unsigned chan = 0; chan < ve; chan++) {
+
+               for (unsigned chan = comp; chan < ve + comp; chan++) {
                        if (indir_index) {
                                unsigned count = glsl_count_attribute_slots(
                                                instr->variables[0]->var->type, false);
@@ -3168,7 +3095,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
        default:
                unreachable("unhandle variable mode");
        }
-       ret = ac_build_gather_values(&ctx->ac, values, ve);
+       ret = ac_build_varying_gather_values(&ctx->ac, values, ve, comp);
        return LLVMBuildBitCast(ctx->ac.builder, ret, get_def_type(ctx, &instr->dest.ssa), "");
 }
 
@@ -3178,8 +3105,9 @@ visit_store_var(struct ac_nir_context *ctx,
 {
        LLVMValueRef temp_ptr, value;
        int idx = instr->variables[0]->var->data.driver_location;
+       unsigned comp = instr->variables[0]->var->data.location_frac;
        LLVMValueRef src = ac_to_float(&ctx->ac, get_src(ctx, instr->src[0]));
-       int writemask = instr->const_index[0];
+       int writemask = instr->const_index[0] << comp;
        LLVMValueRef indir_index;
        unsigned const_index;
        get_deref_offset(ctx, instr->variables[0], false,
@@ -3212,7 +3140,7 @@ visit_store_var(struct ac_nir_context *ctx,
                        if (!(writemask & (1 << chan)))
                                continue;
 
-                       value = llvm_extract_elem(&ctx->ac, src, chan);
+                       value = llvm_extract_elem(&ctx->ac, src, chan - comp);
 
                        if (instr->variables[0]->var->data.compact)
                                stride = 1;
@@ -3449,7 +3377,7 @@ static LLVMValueRef get_image_coords(struct ac_nir_context *ctx,
                                                               fmask_load_address[1],
                                                               fmask_load_address[2],
                                                               sample_index,
-                                                              get_sampler_desc(ctx, instr->variables[0], AC_DESC_FMASK, true, false));
+                                                              get_sampler_desc(ctx, instr->variables[0], AC_DESC_FMASK, NULL, true, false));
        }
        if (count == 1 && !gfx9_1d) {
                if (instr->src[0].ssa->num_components)
@@ -3502,20 +3430,18 @@ static LLVMValueRef visit_image_load(struct ac_nir_context *ctx,
        char intrinsic_name[64];
        const nir_variable *var = instr->variables[0]->var;
        const struct glsl_type *type = var->type;
-       LLVMValueRef i1false = LLVMConstInt(ctx->ac.i1, 0, false);
-       LLVMValueRef i1true = LLVMConstInt(ctx->ac.i1, 1, false);
 
        if(instr->variables[0]->deref.child)
                type = instr->variables[0]->deref.child->type;
 
        type = glsl_without_array(type);
        if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
-               params[0] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_BUFFER, true, false);
+               params[0] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_BUFFER, NULL, true, false);
                params[1] = LLVMBuildExtractElement(ctx->ac.builder, get_src(ctx, instr->src[0]),
                                                    ctx->ac.i32_0, ""); /* vindex */
                params[2] = ctx->ac.i32_0; /* voffset */
-               params[3] = i1false;  /* glc */
-               params[4] = i1false;  /* slc */
+               params[3] = ctx->ac.i1false;  /* glc */
+               params[4] = ctx->ac.i1false;  /* slc */
                res = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.buffer.load.format.v4f32", ctx->ac.v4f32,
                                         params, 5, 0);
 
@@ -3526,20 +3452,20 @@ static LLVMValueRef visit_image_load(struct ac_nir_context *ctx,
                             glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_CUBE ||
                             glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_SUBPASS ||
                             glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_SUBPASS_MS;
-               LLVMValueRef da = is_da ? i1true : i1false;
-               LLVMValueRef glc = i1false;
-               LLVMValueRef slc = i1false;
+               LLVMValueRef da = is_da ? ctx->ac.i1true : ctx->ac.i1false;
+               LLVMValueRef glc = ctx->ac.i1false;
+               LLVMValueRef slc = ctx->ac.i1false;
 
                params[0] = get_image_coords(ctx, instr);
-               params[1] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, true, false);
+               params[1] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, NULL, true, false);
                params[2] = LLVMConstInt(ctx->ac.i32, 15, false); /* dmask */
                if (HAVE_LLVM <= 0x0309) {
-                       params[3] = i1false;  /* r128 */
+                       params[3] = ctx->ac.i1false;  /* r128 */
                        params[4] = da;
                        params[5] = glc;
                        params[6] = slc;
                } else {
-                       LLVMValueRef lwe = i1false;
+                       LLVMValueRef lwe = ctx->ac.i1false;
                        params[3] = glc;
                        params[4] = slc;
                        params[5] = lwe;
@@ -3565,40 +3491,38 @@ static void visit_image_store(struct ac_nir_context *ctx,
        char intrinsic_name[64];
        const nir_variable *var = instr->variables[0]->var;
        const struct glsl_type *type = glsl_without_array(var->type);
-       LLVMValueRef i1false = LLVMConstInt(ctx->ac.i1, 0, false);
-       LLVMValueRef i1true = LLVMConstInt(ctx->ac.i1, 1, false);
-       LLVMValueRef glc = i1false;
+       LLVMValueRef glc = ctx->ac.i1false;
        bool force_glc = ctx->ac.chip_class == SI;
        if (force_glc)
-               glc = i1true;
+               glc = ctx->ac.i1true;
 
        if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
                params[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[2])); /* data */
-               params[1] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_BUFFER, true, true);
+               params[1] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_BUFFER, NULL, true, true);
                params[2] = LLVMBuildExtractElement(ctx->ac.builder, get_src(ctx, instr->src[0]),
                                                    ctx->ac.i32_0, ""); /* vindex */
                params[3] = ctx->ac.i32_0; /* voffset */
                params[4] = glc;  /* glc */
-               params[5] = i1false;  /* slc */
+               params[5] = ctx->ac.i1false;  /* slc */
                ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.buffer.store.format.v4f32", ctx->ac.voidt,
                                   params, 6, 0);
        } else {
                bool is_da = glsl_sampler_type_is_array(type) ||
                             glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_CUBE;
-               LLVMValueRef da = is_da ? i1true : i1false;
-               LLVMValueRef slc = i1false;
+               LLVMValueRef da = is_da ? ctx->ac.i1true : ctx->ac.i1false;
+               LLVMValueRef slc = ctx->ac.i1false;
 
                params[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[2]));
                params[1] = get_image_coords(ctx, instr); /* coords */
-               params[2] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, true, true);
+               params[2] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, NULL, true, true);
                params[3] = LLVMConstInt(ctx->ac.i32, 15, false); /* dmask */
                if (HAVE_LLVM <= 0x0309) {
-                       params[4] = i1false;  /* r128 */
+                       params[4] = ctx->ac.i1false;  /* r128 */
                        params[5] = da;
                        params[6] = glc;
                        params[7] = slc;
                } else {
-                       LLVMValueRef lwe = i1false;
+                       LLVMValueRef lwe = ctx->ac.i1false;
                        params[4] = glc;
                        params[5] = slc;
                        params[6] = lwe;
@@ -3627,19 +3551,19 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,
        const char *atomic_name;
        char intrinsic_name[41];
        const struct glsl_type *type = glsl_without_array(var->type);
-       LLVMValueRef i1false = LLVMConstInt(ctx->ac.i1, 0, false);
-       LLVMValueRef i1true = LLVMConstInt(ctx->ac.i1, 1, false);
        MAYBE_UNUSED int length;
 
+       bool is_unsigned = glsl_get_sampler_result_type(type) == GLSL_TYPE_UINT;
+
        switch (instr->intrinsic) {
        case nir_intrinsic_image_atomic_add:
                atomic_name = "add";
                break;
        case nir_intrinsic_image_atomic_min:
-               atomic_name = "smin";
+               atomic_name = is_unsigned ? "umin" : "smin";
                break;
        case nir_intrinsic_image_atomic_max:
-               atomic_name = "smax";
+               atomic_name = is_unsigned ? "umax" : "smax";
                break;
        case nir_intrinsic_image_atomic_and:
                atomic_name = "and";
@@ -3666,11 +3590,11 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,
 
        if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
                params[param_count++] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_BUFFER,
-                                                        true, true);
+                                                        NULL, true, true);
                params[param_count++] = LLVMBuildExtractElement(ctx->ac.builder, get_src(ctx, instr->src[0]),
                                                                ctx->ac.i32_0, ""); /* vindex */
                params[param_count++] = ctx->ac.i32_0; /* voffset */
-               params[param_count++] = i1false;  /* slc */
+               params[param_count++] = ctx->ac.i1false;  /* slc */
 
                length = snprintf(intrinsic_name, sizeof(intrinsic_name),
                                  "llvm.amdgcn.buffer.atomic.%s", atomic_name);
@@ -3682,10 +3606,10 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,
 
                LLVMValueRef coords = params[param_count++] = get_image_coords(ctx, instr);
                params[param_count++] = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE,
-                                                        true, true);
-               params[param_count++] = i1false; /* r128 */
-               params[param_count++] = da ? i1true : i1false;      /* da */
-               params[param_count++] = i1false;  /* slc */
+                                                        NULL, true, true);
+               params[param_count++] = ctx->ac.i1false; /* r128 */
+               params[param_count++] = da ? ctx->ac.i1true : ctx->ac.i1false;      /* da */
+               params[param_count++] = ctx->ac.i1false;  /* slc */
 
                build_int_type_name(LLVMTypeOf(coords),
                                    coords_type, sizeof(coords_type));
@@ -3712,13 +3636,13 @@ static LLVMValueRef visit_image_size(struct ac_nir_context *ctx,
        if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF)
                return get_buffer_size(ctx,
                        get_sampler_desc(ctx, instr->variables[0],
-                                        AC_DESC_BUFFER, true, false), true);
+                                        AC_DESC_BUFFER, NULL, true, false), true);
 
        struct ac_image_args args = { 0 };
 
        args.da = da;
        args.dmask = 0xf;
-       args.resource = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, true, false);
+       args.resource = get_sampler_desc(ctx, instr->variables[0], AC_DESC_IMAGE, NULL, true, false);
        args.opcode = ac_image_get_resinfo;
        args.addr = ctx->ac.i32_0;
 
@@ -3752,10 +3676,35 @@ static void emit_waitcnt(struct nir_to_llvm_context *ctx,
                         unsigned simm16)
 {
        LLVMValueRef args[1] = {
-               LLVMConstInt(ctx->i32, simm16, false),
+               LLVMConstInt(ctx->ac.i32, simm16, false),
        };
        ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.s.waitcnt",
-                          ctx->voidt, args, 1, 0);
+                          ctx->ac.voidt, args, 1, 0);
+}
+
+static void emit_membar(struct nir_to_llvm_context *ctx,
+                       const nir_intrinsic_instr *instr)
+{
+       unsigned waitcnt = NOOP_WAITCNT;
+
+       switch (instr->intrinsic) {
+       case nir_intrinsic_memory_barrier:
+       case nir_intrinsic_group_memory_barrier:
+               waitcnt &= VM_CNT & LGKM_CNT;
+               break;
+       case nir_intrinsic_memory_barrier_atomic_counter:
+       case nir_intrinsic_memory_barrier_buffer:
+       case nir_intrinsic_memory_barrier_image:
+               waitcnt &= VM_CNT;
+               break;
+       case nir_intrinsic_memory_barrier_shared:
+               waitcnt &= LGKM_CNT;
+               break;
+       default:
+               break;
+       }
+       if (waitcnt != NOOP_WAITCNT)
+               emit_waitcnt(ctx, waitcnt);
 }
 
 static void emit_barrier(struct nir_to_llvm_context *ctx)
@@ -3770,7 +3719,7 @@ static void emit_barrier(struct nir_to_llvm_context *ctx)
                return;
        }
        ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.s.barrier",
-                          ctx->voidt, NULL, 0, AC_FUNC_ATTR_CONVERGENT);
+                          ctx->ac.voidt, NULL, 0, AC_FUNC_ATTR_CONVERGENT);
 }
 
 static void emit_discard_if(struct ac_nir_context *ctx,
@@ -3778,14 +3727,10 @@ static void emit_discard_if(struct ac_nir_context *ctx,
 {
        LLVMValueRef cond;
 
-       cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntNE,
+       cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
                             get_src(ctx, instr->src[0]),
                             ctx->ac.i32_0, "");
-
-       cond = LLVMBuildSelect(ctx->ac.builder, cond,
-                              LLVMConstReal(ctx->ac.f32, -1.0f),
-                              ctx->ac.f32_0, "");
-       ac_build_kill(&ctx->ac, cond);
+       ac_build_kill_if_false(&ctx->ac, cond);
 }
 
 static LLVMValueRef
@@ -3794,7 +3739,7 @@ visit_load_local_invocation_index(struct nir_to_llvm_context *ctx)
        LLVMValueRef result;
        LLVMValueRef thread_id = ac_get_thread_id(&ctx->ac);
        result = LLVMBuildAnd(ctx->builder, ctx->tg_size,
-                             LLVMConstInt(ctx->i32, 0xfc0, false), "");
+                             LLVMConstInt(ctx->ac.i32, 0xfc0, false), "");
 
        return LLVMBuildAdd(ctx->builder, result, thread_id, "");
 }
@@ -3890,10 +3835,10 @@ static LLVMValueRef load_sample_position(struct nir_to_llvm_context *ctx,
                                         LLVMValueRef sample_id)
 {
        LLVMValueRef result;
-       LLVMValueRef ptr = ac_build_gep0(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_PS_SAMPLE_POSITIONS, false));
+       LLVMValueRef ptr = ac_build_gep0(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_PS_SAMPLE_POSITIONS, false));
 
        ptr = LLVMBuildBitCast(ctx->builder, ptr,
-                              const_array(ctx->v2f32, 64), "");
+                              const_array(ctx->ac.v2f32, 64), "");
 
        sample_id = LLVMBuildAdd(ctx->builder, sample_id, ctx->sample_pos_offset, "");
        result = ac_build_load_invariant(&ctx->ac, ptr, sample_id);
@@ -3913,7 +3858,7 @@ static LLVMValueRef load_sample_pos(struct ac_nir_context *ctx)
 static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
                                 const nir_intrinsic_instr *instr)
 {
-       LLVMValueRef result[2];
+       LLVMValueRef result[4];
        LLVMValueRef interp_param, attr_number;
        unsigned location;
        unsigned chan;
@@ -3935,22 +3880,22 @@ static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
        }
 
        if (instr->intrinsic == nir_intrinsic_interp_var_at_offset) {
-               src_c0 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx->builder, src0, ctx->i32zero, ""));
-               src_c1 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx->builder, src0, ctx->i32one, ""));
+               src_c0 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx->builder, src0, ctx->ac.i32_0, ""));
+               src_c1 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx->builder, src0, ctx->ac.i32_1, ""));
        } else if (instr->intrinsic == nir_intrinsic_interp_var_at_sample) {
                LLVMValueRef sample_position;
-               LLVMValueRef halfval = LLVMConstReal(ctx->f32, 0.5f);
+               LLVMValueRef halfval = LLVMConstReal(ctx->ac.f32, 0.5f);
 
                /* fetch sample ID */
                sample_position = load_sample_position(ctx, src0);
 
-               src_c0 = LLVMBuildExtractElement(ctx->builder, sample_position, ctx->i32zero, "");
+               src_c0 = LLVMBuildExtractElement(ctx->builder, sample_position, ctx->ac.i32_0, "");
                src_c0 = LLVMBuildFSub(ctx->builder, src_c0, halfval, "");
-               src_c1 = LLVMBuildExtractElement(ctx->builder, sample_position, ctx->i32one, "");
+               src_c1 = LLVMBuildExtractElement(ctx->builder, sample_position, ctx->ac.i32_1, "");
                src_c1 = LLVMBuildFSub(ctx->builder, src_c1, halfval, "");
        }
        interp_param = lookup_interp_param(ctx, instr->variables[0]->var->data.interpolation, location);
-       attr_number = LLVMConstInt(ctx->i32, input_index, false);
+       attr_number = LLVMConstInt(ctx->ac.i32, input_index, false);
 
        if (location == INTERP_CENTER) {
                LLVMValueRef ij_out[2];
@@ -3965,8 +3910,8 @@ static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
                 * interp_param.J = ddy * offset/sample.y + temp1;
                 */
                for (unsigned i = 0; i < 2; i++) {
-                       LLVMValueRef ix_ll = LLVMConstInt(ctx->i32, i, false);
-                       LLVMValueRef iy_ll = LLVMConstInt(ctx->i32, i + 2, false);
+                       LLVMValueRef ix_ll = LLVMConstInt(ctx->ac.i32, i, false);
+                       LLVMValueRef iy_ll = LLVMConstInt(ctx->ac.i32, i + 2, false);
                        LLVMValueRef ddx_el = LLVMBuildExtractElement(ctx->builder,
                                                                      ddxy_out, ix_ll, "");
                        LLVMValueRef ddy_el = LLVMBuildExtractElement(ctx->builder,
@@ -3976,7 +3921,7 @@ static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
                        LLVMValueRef temp1, temp2;
 
                        interp_el = LLVMBuildBitCast(ctx->builder, interp_el,
-                                                    ctx->f32, "");
+                                                    ctx->ac.f32, "");
 
                        temp1 = LLVMBuildFMul(ctx->builder, ddx_el, src_c0, "");
                        temp1 = LLVMBuildFAdd(ctx->builder, temp1, interp_el, "");
@@ -3985,45 +3930,45 @@ static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
                        temp2 = LLVMBuildFAdd(ctx->builder, temp2, temp1, "");
 
                        ij_out[i] = LLVMBuildBitCast(ctx->builder,
-                                                    temp2, ctx->i32, "");
+                                                    temp2, ctx->ac.i32, "");
                }
                interp_param = ac_build_gather_values(&ctx->ac, ij_out, 2);
 
        }
 
-       for (chan = 0; chan < 2; chan++) {
-               LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, false);
+       for (chan = 0; chan < 4; chan++) {
+               LLVMValueRef llvm_chan = LLVMConstInt(ctx->ac.i32, chan, false);
 
                if (interp_param) {
                        interp_param = LLVMBuildBitCast(ctx->builder,
-                                                       interp_param, LLVMVectorType(ctx->f32, 2), "");
+                                                       interp_param, ctx->ac.v2f32, "");
                        LLVMValueRef i = LLVMBuildExtractElement(
-                               ctx->builder, interp_param, ctx->i32zero, "");
+                               ctx->builder, interp_param, ctx->ac.i32_0, "");
                        LLVMValueRef j = LLVMBuildExtractElement(
-                               ctx->builder, interp_param, ctx->i32one, "");
+                               ctx->builder, interp_param, ctx->ac.i32_1, "");
 
                        result[chan] = ac_build_fs_interp(&ctx->ac,
                                                          llvm_chan, attr_number,
                                                          ctx->prim_mask, i, j);
                } else {
                        result[chan] = ac_build_fs_interp_mov(&ctx->ac,
-                                                             LLVMConstInt(ctx->i32, 2, false),
+                                                             LLVMConstInt(ctx->ac.i32, 2, false),
                                                              llvm_chan, attr_number,
                                                              ctx->prim_mask);
                }
        }
-       return ac_build_gather_values(&ctx->ac, result, 2);
+       return ac_build_varying_gather_values(&ctx->ac, result, instr->num_components,
+                                             instr->variables[0]->var->data.location_frac);
 }
 
 static void
-visit_emit_vertex(struct nir_to_llvm_context *ctx,
-                 const nir_intrinsic_instr *instr)
+visit_emit_vertex(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addrs)
 {
        LLVMValueRef gs_next_vertex;
-       LLVMValueRef can_emit, kill;
+       LLVMValueRef can_emit;
        int idx;
+       struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi);
 
-       assert(instr->const_index[0] == 0);
        /* Write vertex attribute values to GSVS ring */
        gs_next_vertex = LLVMBuildLoad(ctx->builder,
                                       ctx->gs_next_vertex,
@@ -4035,17 +3980,13 @@ visit_emit_vertex(struct nir_to_llvm_context *ctx,
         * effects other than emitting vertices.
         */
        can_emit = LLVMBuildICmp(ctx->builder, LLVMIntULT, gs_next_vertex,
-                                LLVMConstInt(ctx->i32, ctx->gs_max_out_vertices, false), "");
-
-       kill = LLVMBuildSelect(ctx->builder, can_emit,
-                              LLVMConstReal(ctx->f32, 1.0f),
-                              LLVMConstReal(ctx->f32, -1.0f), "");
-       ac_build_kill(&ctx->ac, kill);
+                                LLVMConstInt(ctx->ac.i32, ctx->gs_max_out_vertices, false), "");
+       ac_build_kill_if_false(&ctx->ac, can_emit);
 
        /* loop num outputs */
        idx = 0;
        for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++i) {
-               LLVMValueRef *out_ptr = &ctx->nir->outputs[i * 4];
+               LLVMValueRef *out_ptr = &addrs[i * 4];
                int length = 4;
                int slot = idx;
                int slot_inc = 1;
@@ -4062,11 +4003,11 @@ visit_emit_vertex(struct nir_to_llvm_context *ctx,
                for (unsigned j = 0; j < length; j++) {
                        LLVMValueRef out_val = LLVMBuildLoad(ctx->builder,
                                                             out_ptr[j], "");
-                       LLVMValueRef voffset = LLVMConstInt(ctx->i32, (slot * 4 + j) * ctx->gs_max_out_vertices, false);
+                       LLVMValueRef voffset = LLVMConstInt(ctx->ac.i32, (slot * 4 + j) * ctx->gs_max_out_vertices, false);
                        voffset = LLVMBuildAdd(ctx->builder, voffset, gs_next_vertex, "");
-                       voffset = LLVMBuildMul(ctx->builder, voffset, LLVMConstInt(ctx->i32, 4, false), "");
+                       voffset = LLVMBuildMul(ctx->builder, voffset, LLVMConstInt(ctx->ac.i32, 4, false), "");
 
-                       out_val = LLVMBuildBitCast(ctx->builder, out_val, ctx->i32, "");
+                       out_val = LLVMBuildBitCast(ctx->builder, out_val, ctx->ac.i32, "");
 
                        ac_build_buffer_store_dword(&ctx->ac, ctx->gsvs_ring,
                                                    out_val, 1,
@@ -4077,7 +4018,7 @@ visit_emit_vertex(struct nir_to_llvm_context *ctx,
        }
 
        gs_next_vertex = LLVMBuildAdd(ctx->builder, gs_next_vertex,
-                                     ctx->i32one, "");
+                                     ctx->ac.i32_1, "");
        LLVMBuildStore(ctx->builder, gs_next_vertex, ctx->gs_next_vertex);
 
        ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_EMIT | AC_SENDMSG_GS | (0 << 8), ctx->gs_wave_id);
@@ -4097,12 +4038,12 @@ visit_load_tess_coord(struct nir_to_llvm_context *ctx,
        LLVMValueRef coord[4] = {
                ctx->tes_u,
                ctx->tes_v,
-               ctx->f32zero,
-               ctx->f32zero,
+               ctx->ac.f32_0,
+               ctx->ac.f32_0,
        };
 
        if (ctx->tes_primitive_mode == GL_TRIANGLES)
-               coord[2] = LLVMBuildFSub(ctx->builder, ctx->f32one,
+               coord[2] = LLVMBuildFSub(ctx->builder, ctx->ac.f32_1,
                                        LLVMBuildFAdd(ctx->builder, coord[0], coord[1], ""), "");
 
        LLVMValueRef result = ac_build_gather_values(&ctx->ac, coord, instr->num_components);
@@ -4145,12 +4086,13 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                if (ctx->stage == MESA_SHADER_TESS_CTRL)
                        result = unpack_param(&ctx->ac, ctx->nctx->tcs_rel_ids, 8, 5);
                else
-                       result = ctx->nctx->gs_invocation_id;
+                       result = ctx->abi->gs_invocation_id;
                break;
        case nir_intrinsic_load_primitive_id:
                if (ctx->stage == MESA_SHADER_GEOMETRY) {
-                       ctx->nctx->shader_info->gs.uses_prim_id = true;
-                       result = ctx->nctx->gs_prim_id;
+                       if (ctx->nctx)
+                               ctx->nctx->shader_info->gs.uses_prim_id = true;
+                       result = ctx->abi->gs_prim_id;
                } else if (ctx->stage == MESA_SHADER_TESS_CTRL) {
                        ctx->nctx->shader_info->tcs.uses_prim_id = true;
                        result = ctx->nctx->tcs_patch_id;
@@ -4197,6 +4139,9 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
        case nir_intrinsic_vulkan_resource_index:
                result = visit_vulkan_resource_index(ctx->nctx, instr);
                break;
+       case nir_intrinsic_vulkan_resource_reindex:
+               result = visit_vulkan_resource_reindex(ctx->nctx, instr);
+               break;
        case nir_intrinsic_store_ssbo:
                visit_store_ssbo(ctx, instr);
                break;
@@ -4255,7 +4200,12 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                emit_discard_if(ctx, instr);
                break;
        case nir_intrinsic_memory_barrier:
-               emit_waitcnt(ctx->nctx, VM_CNT);
+       case nir_intrinsic_group_memory_barrier:
+       case nir_intrinsic_memory_barrier_atomic_counter:
+       case nir_intrinsic_memory_barrier_buffer:
+       case nir_intrinsic_memory_barrier_image:
+       case nir_intrinsic_memory_barrier_shared:
+               emit_membar(ctx->nctx, instr);
                break;
        case nir_intrinsic_barrier:
                emit_barrier(ctx->nctx);
@@ -4278,7 +4228,8 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                result = visit_interp(ctx->nctx, instr);
                break;
        case nir_intrinsic_emit_vertex:
-               visit_emit_vertex(ctx->nctx, instr);
+               assert(instr->const_index[0] == 0);
+               ctx->abi->emit_vertex(ctx->abi, 0, ctx->outputs);
                break;
        case nir_intrinsic_end_primitive:
                visit_end_primitive(ctx->nctx, instr);
@@ -4301,14 +4252,21 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
 }
 
 static LLVMValueRef radv_load_ssbo(struct ac_shader_abi *abi,
-                                  LLVMValueRef buffer, bool write)
+                                  LLVMValueRef buffer_ptr, bool write)
 {
        struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi);
 
        if (write && ctx->stage == MESA_SHADER_FRAGMENT)
                ctx->shader_info->fs.writes_memory = true;
 
-       return buffer;
+       return LLVMBuildLoad(ctx->builder, buffer_ptr, "");
+}
+
+static LLVMValueRef radv_load_ubo(struct ac_shader_abi *abi, LLVMValueRef buffer_ptr)
+{
+       struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi);
+
+       return LLVMBuildLoad(ctx->builder, buffer_ptr, "");
 }
 
 static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi,
@@ -4336,23 +4294,23 @@ static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi,
 
        switch (desc_type) {
        case AC_DESC_IMAGE:
-               type = ctx->v8i32;
+               type = ctx->ac.v8i32;
                type_size = 32;
                break;
        case AC_DESC_FMASK:
-               type = ctx->v8i32;
+               type = ctx->ac.v8i32;
                offset += 32;
                type_size = 32;
                break;
        case AC_DESC_SAMPLER:
-               type = ctx->v4i32;
+               type = ctx->ac.v4i32;
                if (binding->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
                        offset += 64;
 
                type_size = 16;
                break;
        case AC_DESC_BUFFER:
-               type = ctx->v4i32;
+               type = ctx->ac.v4i32;
                type_size = 16;
                break;
        default:
@@ -4369,10 +4327,10 @@ static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi,
                const uint32_t *samplers = radv_immutable_samplers(layout, binding);
 
                LLVMValueRef constants[] = {
-                       LLVMConstInt(ctx->i32, samplers[constant_index * 4 + 0], 0),
-                       LLVMConstInt(ctx->i32, samplers[constant_index * 4 + 1], 0),
-                       LLVMConstInt(ctx->i32, samplers[constant_index * 4 + 2], 0),
-                       LLVMConstInt(ctx->i32, samplers[constant_index * 4 + 3], 0),
+                       LLVMConstInt(ctx->ac.i32, samplers[constant_index * 4 + 0], 0),
+                       LLVMConstInt(ctx->ac.i32, samplers[constant_index * 4 + 1], 0),
+                       LLVMConstInt(ctx->ac.i32, samplers[constant_index * 4 + 2], 0),
+                       LLVMConstInt(ctx->ac.i32, samplers[constant_index * 4 + 3], 0),
                };
                return ac_build_gather_values(&ctx->ac, constants, 4);
        }
@@ -4380,11 +4338,11 @@ static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi,
        assert(stride % type_size == 0);
 
        if (!index)
-               index = ctx->i32zero;
+               index = ctx->ac.i32_0;
 
-       index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, stride / type_size, 0), "");
+       index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->ac.i32, stride / type_size, 0), "");
 
-       list = ac_build_gep0(&ctx->ac, list, LLVMConstInt(ctx->i32, offset, 0));
+       list = ac_build_gep0(&ctx->ac, list, LLVMConstInt(ctx->ac.i32, offset, 0));
        list = LLVMBuildPointerCast(builder, list, const_array(type, 0), "");
 
        return ac_build_load_to_sgpr(&ctx->ac, list, index);
@@ -4393,41 +4351,52 @@ static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi,
 static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,
                                     const nir_deref_var *deref,
                                     enum ac_descriptor_type desc_type,
+                                    const nir_tex_instr *tex_instr,
                                     bool image, bool write)
 {
        LLVMValueRef index = NULL;
        unsigned constant_index = 0;
-       const nir_deref *tail = &deref->deref;
+       unsigned descriptor_set;
+       unsigned base_index;
 
-       while (tail->child) {
-               const nir_deref_array *child = nir_deref_as_array(tail->child);
-               unsigned array_size = glsl_get_aoa_size(tail->child->type);
+       if (!deref) {
+               assert(tex_instr && !image);
+               descriptor_set = 0;
+               base_index = tex_instr->sampler_index;
+       } else {
+               const nir_deref *tail = &deref->deref;
+               while (tail->child) {
+                       const nir_deref_array *child = nir_deref_as_array(tail->child);
+                       unsigned array_size = glsl_get_aoa_size(tail->child->type);
 
-               if (!array_size)
-                       array_size = 1;
+                       if (!array_size)
+                               array_size = 1;
 
-               assert(child->deref_array_type != nir_deref_array_type_wildcard);
+                       assert(child->deref_array_type != nir_deref_array_type_wildcard);
 
-               if (child->deref_array_type == nir_deref_array_type_indirect) {
-                       LLVMValueRef indirect = get_src(ctx, child->indirect);
+                       if (child->deref_array_type == nir_deref_array_type_indirect) {
+                               LLVMValueRef indirect = get_src(ctx, child->indirect);
 
-                       indirect = LLVMBuildMul(ctx->ac.builder, indirect,
-                               LLVMConstInt(ctx->ac.i32, array_size, false), "");
+                               indirect = LLVMBuildMul(ctx->ac.builder, indirect,
+                                       LLVMConstInt(ctx->ac.i32, array_size, false), "");
 
-                       if (!index)
-                               index = indirect;
-                       else
-                               index = LLVMBuildAdd(ctx->ac.builder, index, indirect, "");
-               }
+                               if (!index)
+                                       index = indirect;
+                               else
+                                       index = LLVMBuildAdd(ctx->ac.builder, index, indirect, "");
+                       }
 
-               constant_index += child->base_offset * array_size;
+                       constant_index += child->base_offset * array_size;
 
-               tail = &child->deref;
+                       tail = &child->deref;
+               }
+               descriptor_set = deref->var->data.descriptor_set;
+               base_index = deref->var->data.binding;
        }
 
        return ctx->abi->load_sampler_desc(ctx->abi,
-                                         deref->var->data.descriptor_set,
-                                         deref->var->data.binding,
+                                         descriptor_set,
+                                         base_index,
                                          constant_index, index,
                                          desc_type, image, write);
 }
@@ -4502,20 +4471,20 @@ static void tex_fetch_ptrs(struct ac_nir_context *ctx,
                           LLVMValueRef *fmask_ptr)
 {
        if (instr->sampler_dim  == GLSL_SAMPLER_DIM_BUF)
-               *res_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_BUFFER, false, false);
+               *res_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_BUFFER, instr, false, false);
        else
-               *res_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_IMAGE, false, false);
+               *res_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_IMAGE, instr, false, false);
        if (samp_ptr) {
                if (instr->sampler)
-                       *samp_ptr = get_sampler_desc(ctx, instr->sampler, AC_DESC_SAMPLER, false, false);
+                       *samp_ptr = get_sampler_desc(ctx, instr->sampler, AC_DESC_SAMPLER, instr, false, false);
                else
-                       *samp_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_SAMPLER, false, false);
+                       *samp_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_SAMPLER, instr, false, false);
                if (instr->sampler_dim < GLSL_SAMPLER_DIM_RECT)
                        *samp_ptr = sici_fix_sampler_aniso(ctx, *res_ptr, *samp_ptr);
        }
        if (fmask_ptr && !instr->sampler && (instr->op == nir_texop_txf_ms ||
                                             instr->op == nir_texop_samples_identical))
-               *fmask_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_FMASK, false, false);
+               *fmask_ptr = get_sampler_desc(ctx, instr->texture, AC_DESC_FMASK, instr, false, false);
 }
 
 static LLVMValueRef apply_round_slice(struct ac_llvm_context *ctx,
@@ -4652,14 +4621,14 @@ static void visit_tex(struct ac_nir_context *ctx, nir_tex_instr *instr)
                LLVMValueRef z = ac_to_float(&ctx->ac,
                                             llvm_extract_elem(&ctx->ac, comparator, 0));
 
-               /* TC-compatible HTILE promotes Z16 and Z24 to Z32_FLOAT,
+               /* TC-compatible HTILE on radeonsi promotes Z16 and Z24 to Z32_FLOAT,
                 * so the depth comparison value isn't clamped for Z16 and
                 * Z24 anymore. Do it manually here.
                 *
                 * It's unnecessary if the original texture format was
                 * Z32_FLOAT, but we don't know that here.
                 */
-               if (ctx->ac.chip_class == VI)
+               if (ctx->ac.chip_class == VI && ctx->abi->clamp_shadow_reference)
                        z = ac_build_clamp(&ctx->ac, z);
 
                address[count++] = z;
@@ -4747,7 +4716,9 @@ static void visit_tex(struct ac_nir_context *ctx, nir_tex_instr *instr)
                                filler = LLVMConstReal(ctx->ac.f32, 0.5);
 
                        if (instr->sampler_dim == GLSL_SAMPLER_DIM_1D) {
-                               if (instr->is_array) {
+                               /* No nir_texop_lod, because it does not take a slice
+                                * even with array textures. */
+                               if (instr->is_array && instr->op != nir_texop_lod ) {
                                        address[count] = address[count - 1];
                                        address[count - 1] = filler;
                                        count++;
@@ -5082,17 +5053,17 @@ handle_vs_input_decl(struct nir_to_llvm_context *ctx,
                                            ctx->abi.base_vertex, "");
 
        for (unsigned i = 0; i < attrib_count; ++i, ++idx) {
-               t_offset = LLVMConstInt(ctx->i32, index + i, false);
+               t_offset = LLVMConstInt(ctx->ac.i32, index + i, false);
 
                t_list = ac_build_load_to_sgpr(&ctx->ac, t_list_ptr, t_offset);
 
                input = ac_build_buffer_load_format(&ctx->ac, t_list,
                                                    buffer_index,
-                                                   LLVMConstInt(ctx->i32, 0, false),
+                                                   LLVMConstInt(ctx->ac.i32, 0, false),
                                                    true);
 
                for (unsigned chan = 0; chan < 4; chan++) {
-                       LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, false);
+                       LLVMValueRef llvm_chan = LLVMConstInt(ctx->ac.i32, chan, false);
                        ctx->inputs[radeon_llvm_reg_index_soa(idx, chan)] =
                                ac_to_integer(&ctx->ac, LLVMBuildExtractElement(ctx->builder,
                                                        input, llvm_chan, ""));
@@ -5111,7 +5082,7 @@ static void interp_fs_input(struct nir_to_llvm_context *ctx,
        LLVMValueRef i, j;
        bool interp = interp_param != NULL;
 
-       attr_number = LLVMConstInt(ctx->i32, attr, false);
+       attr_number = LLVMConstInt(ctx->ac.i32, attr, false);
 
        /* fs.constant returns the param from the middle vertex, so it's not
         * really useful for flat shading. It's meant to be used for custom
@@ -5125,16 +5096,16 @@ static void interp_fs_input(struct nir_to_llvm_context *ctx,
         */
        if (interp) {
                interp_param = LLVMBuildBitCast(ctx->builder, interp_param,
-                                               LLVMVectorType(ctx->f32, 2), "");
+                                               ctx->ac.v2f32, "");
 
                i = LLVMBuildExtractElement(ctx->builder, interp_param,
-                                               ctx->i32zero, "");
+                                               ctx->ac.i32_0, "");
                j = LLVMBuildExtractElement(ctx->builder, interp_param,
-                                               ctx->i32one, "");
+                                               ctx->ac.i32_1, "");
        }
 
        for (chan = 0; chan < 4; chan++) {
-               LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, false);
+               LLVMValueRef llvm_chan = LLVMConstInt(ctx->ac.i32, chan, false);
 
                if (interp) {
                        result[chan] = ac_build_fs_interp(&ctx->ac,
@@ -5143,7 +5114,7 @@ static void interp_fs_input(struct nir_to_llvm_context *ctx,
                                                          prim_mask, i, j);
                } else {
                        result[chan] = ac_build_fs_interp_mov(&ctx->ac,
-                                                             LLVMConstInt(ctx->i32, 2, false),
+                                                             LLVMConstInt(ctx->ac.i32, 2, false),
                                                              llvm_chan,
                                                              attr_number,
                                                              prim_mask);
@@ -5250,7 +5221,7 @@ handle_fs_inputs(struct nir_to_llvm_context *ctx,
                        for(int i = 0; i < 3; ++i)
                                inputs[i] = ctx->abi.frag_pos[i];
 
-                       inputs[3] = ac_build_fdiv(&ctx->ac, ctx->f32one,
+                       inputs[3] = ac_build_fdiv(&ctx->ac, ctx->ac.f32_1,
                                                  ctx->abi.frag_pos[3]);
                }
        }
@@ -5390,14 +5361,14 @@ glsl_base_to_llvm_type(struct nir_to_llvm_context *ctx,
        case GLSL_TYPE_UINT:
        case GLSL_TYPE_BOOL:
        case GLSL_TYPE_SUBROUTINE:
-               return ctx->i32;
+               return ctx->ac.i32;
        case GLSL_TYPE_FLOAT: /* TODO handle mediump */
-               return ctx->f32;
+               return ctx->ac.f32;
        case GLSL_TYPE_INT64:
        case GLSL_TYPE_UINT64:
-               return ctx->i64;
+               return ctx->ac.i64;
        case GLSL_TYPE_DOUBLE:
-               return ctx->f64;
+               return ctx->ac.f64;
        default:
                unreachable("unknown GLSL type");
        }
@@ -5492,11 +5463,11 @@ emit_float_saturate(struct ac_llvm_context *ctx, LLVMValueRef v, float lo, float
 static LLVMValueRef emit_pack_int16(struct nir_to_llvm_context *ctx,
                                        LLVMValueRef src0, LLVMValueRef src1)
 {
-       LLVMValueRef const16 = LLVMConstInt(ctx->i32, 16, false);
+       LLVMValueRef const16 = LLVMConstInt(ctx->ac.i32, 16, false);
        LLVMValueRef comp[2];
 
-       comp[0] = LLVMBuildAnd(ctx->builder, src0, LLVMConstInt(ctx-> i32, 65535, 0), "");
-       comp[1] = LLVMBuildAnd(ctx->builder, src1, LLVMConstInt(ctx-> i32, 65535, 0), "");
+       comp[0] = LLVMBuildAnd(ctx->builder, src0, LLVMConstInt(ctx->ac.i32, 65535, 0), "");
+       comp[1] = LLVMBuildAnd(ctx->builder, src1, LLVMConstInt(ctx->ac.i32, 65535, 0), "");
        comp[1] = LLVMBuildShl(ctx->builder, comp[1], const16, "");
        return LLVMBuildOr(ctx->builder, comp[0], comp[1], "");
 }
@@ -5521,10 +5492,10 @@ si_llvm_init_export_args(struct nir_to_llvm_context *ctx,
        args->target = target;
 
        args->compr = false;
-       args->out[0] = LLVMGetUndef(ctx->f32);
-       args->out[1] = LLVMGetUndef(ctx->f32);
-       args->out[2] = LLVMGetUndef(ctx->f32);
-       args->out[3] = LLVMGetUndef(ctx->f32);
+       args->out[0] = LLVMGetUndef(ctx->ac.f32);
+       args->out[1] = LLVMGetUndef(ctx->ac.f32);
+       args->out[2] = LLVMGetUndef(ctx->ac.f32);
+       args->out[3] = LLVMGetUndef(ctx->ac.f32);
 
        if (!values)
                return;
@@ -5578,11 +5549,11 @@ si_llvm_init_export_args(struct nir_to_llvm_context *ctx,
                        for (unsigned chan = 0; chan < 4; chan++) {
                                val[chan] = ac_build_clamp(&ctx->ac, values[chan]);
                                val[chan] = LLVMBuildFMul(ctx->builder, val[chan],
-                                                       LLVMConstReal(ctx->f32, 65535), "");
+                                                       LLVMConstReal(ctx->ac.f32, 65535), "");
                                val[chan] = LLVMBuildFAdd(ctx->builder, val[chan],
-                                                       LLVMConstReal(ctx->f32, 0.5), "");
+                                                       LLVMConstReal(ctx->ac.f32, 0.5), "");
                                val[chan] = LLVMBuildFPToUI(ctx->builder, val[chan],
-                                                       ctx->i32, "");
+                                                       ctx->ac.i32, "");
                        }
 
                        args->compr = 1;
@@ -5594,16 +5565,16 @@ si_llvm_init_export_args(struct nir_to_llvm_context *ctx,
                        for (unsigned chan = 0; chan < 4; chan++) {
                                val[chan] = emit_float_saturate(&ctx->ac, values[chan], -1, 1);
                                val[chan] = LLVMBuildFMul(ctx->builder, val[chan],
-                                                       LLVMConstReal(ctx->f32, 32767), "");
+                                                       LLVMConstReal(ctx->ac.f32, 32767), "");
 
                                /* If positive, add 0.5, else add -0.5. */
                                val[chan] = LLVMBuildFAdd(ctx->builder, val[chan],
                                                LLVMBuildSelect(ctx->builder,
                                                        LLVMBuildFCmp(ctx->builder, LLVMRealOGE,
-                                                               val[chan], ctx->f32zero, ""),
-                                                       LLVMConstReal(ctx->f32, 0.5),
-                                                       LLVMConstReal(ctx->f32, -0.5), ""), "");
-                               val[chan] = LLVMBuildFPToSI(ctx->builder, val[chan], ctx->i32, "");
+                                                               val[chan], ctx->ac.f32_0, ""),
+                                                       LLVMConstReal(ctx->ac.f32, 0.5),
+                                                       LLVMConstReal(ctx->ac.f32, -0.5), ""), "");
+                               val[chan] = LLVMBuildFPToSI(ctx->builder, val[chan], ctx->ac.i32, "");
                        }
 
                        args->compr = 1;
@@ -5612,9 +5583,9 @@ si_llvm_init_export_args(struct nir_to_llvm_context *ctx,
                        break;
 
                case V_028714_SPI_SHADER_UINT16_ABGR: {
-                       LLVMValueRef max_rgb = LLVMConstInt(ctx->i32,
+                       LLVMValueRef max_rgb = LLVMConstInt(ctx->ac.i32,
                                                            is_int8 ? 255 : is_int10 ? 1023 : 65535, 0);
-                       LLVMValueRef max_alpha = !is_int10 ? max_rgb : LLVMConstInt(ctx->i32, 3, 0);
+                       LLVMValueRef max_alpha = !is_int10 ? max_rgb : LLVMConstInt(ctx->ac.i32, 3, 0);
 
                        for (unsigned chan = 0; chan < 4; chan++) {
                                val[chan] = ac_to_integer(&ctx->ac, values[chan]);
@@ -5628,12 +5599,12 @@ si_llvm_init_export_args(struct nir_to_llvm_context *ctx,
                }
 
                case V_028714_SPI_SHADER_SINT16_ABGR: {
-                       LLVMValueRef max_rgb = LLVMConstInt(ctx->i32,
+                       LLVMValueRef max_rgb = LLVMConstInt(ctx->ac.i32,
                                                            is_int8 ? 127 : is_int10 ? 511 : 32767, 0);
-                       LLVMValueRef min_rgb = LLVMConstInt(ctx->i32,
+                       LLVMValueRef min_rgb = LLVMConstInt(ctx->ac.i32,
                                                            is_int8 ? -128 : is_int10 ? -512 : -32768, 0);
-                       LLVMValueRef max_alpha = !is_int10 ? max_rgb : ctx->i32one;
-                       LLVMValueRef min_alpha = !is_int10 ? min_rgb : LLVMConstInt(ctx->i32, -2, 0);
+                       LLVMValueRef max_alpha = !is_int10 ? max_rgb : ctx->ac.i32_1;
+                       LLVMValueRef min_alpha = !is_int10 ? min_rgb : LLVMConstInt(ctx->ac.i32, -2, 0);
 
                        /* Clamp. */
                        for (unsigned chan = 0; chan < 4; chan++) {
@@ -5700,7 +5671,7 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx,
                                                               ctx->nir->outputs[radeon_llvm_reg_index_soa(i, j)], ""));
 
                for (i = ctx->num_output_clips + ctx->num_output_culls; i < 8; i++)
-                       slots[i] = LLVMGetUndef(ctx->f32);
+                       slots[i] = LLVMGetUndef(ctx->ac.f32);
 
                if (ctx->num_output_clips + ctx->num_output_culls > 4) {
                        target = V_008DFC_SQ_EXP_POS + 3;
@@ -5716,7 +5687,7 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx,
 
        }
 
-       LLVMValueRef pos_values[4] = {ctx->f32zero, ctx->f32zero, ctx->f32zero, ctx->f32one};
+       LLVMValueRef pos_values[4] = {ctx->ac.f32_0, ctx->ac.f32_0, ctx->ac.f32_0, ctx->ac.f32_1};
        if (ctx->output_mask & (1ull << VARYING_SLOT_POS)) {
                for (unsigned j = 0; j < 4; j++)
                        pos_values[j] = LLVMBuildLoad(ctx->builder,
@@ -5751,10 +5722,10 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx,
                pos_args[1].done = 0;
                pos_args[1].target = V_008DFC_SQ_EXP_POS + 1;
                pos_args[1].compr = 0;
-               pos_args[1].out[0] = ctx->f32zero; /* X */
-               pos_args[1].out[1] = ctx->f32zero; /* Y */
-               pos_args[1].out[2] = ctx->f32zero; /* Z */
-               pos_args[1].out[3] = ctx->f32zero;  /* W */
+               pos_args[1].out[0] = ctx->ac.f32_0; /* X */
+               pos_args[1].out[1] = ctx->ac.f32_0; /* Y */
+               pos_args[1].out[2] = ctx->ac.f32_0; /* Z */
+               pos_args[1].out[3] = ctx->ac.f32_0;  /* W */
 
                if (outinfo->writes_pointsize == true)
                        pos_args[1].out[0] = psize_value;
@@ -5768,7 +5739,7 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx,
                                LLVMValueRef v = viewport_index_value;
                                v = ac_to_integer(&ctx->ac, v);
                                v = LLVMBuildShl(ctx->builder, v,
-                                                LLVMConstInt(ctx->i32, 16, false),
+                                                LLVMConstInt(ctx->ac.i32, 16, false),
                                                 "");
                                v = LLVMBuildOr(ctx->builder, v,
                                                ac_to_integer(&ctx->ac, pos_args[1].out[2]), "");
@@ -5844,7 +5815,7 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx,
                ctx->shader_info->vs.vgpr_comp_cnt = MAX2(2,
                                                          ctx->shader_info->vs.vgpr_comp_cnt);
                for (unsigned j = 1; j < 4; j++)
-                       values[j] = ctx->f32zero;
+                       values[j] = ctx->ac.f32_0;
                si_llvm_init_export_args(ctx, values, target, &args);
                ac_build_export(&ctx->ac, &args);
                outinfo->export_prim_id = true;
@@ -5887,9 +5858,9 @@ handle_es_outputs_post(struct nir_to_llvm_context *ctx,
                                                     LLVMConstInt(ctx->ac.i32, 4, false), false);
                vertex_idx = LLVMBuildOr(ctx->ac.builder, vertex_idx,
                                         LLVMBuildMul(ctx->ac.builder, wave_idx,
-                                                     LLVMConstInt(ctx->i32, 64, false), ""), "");
+                                                     LLVMConstInt(ctx->ac.i32, 64, false), ""), "");
                lds_base = LLVMBuildMul(ctx->ac.builder, vertex_idx,
-                                       LLVMConstInt(ctx->i32, itemsize_dw, 0), "");
+                                       LLVMConstInt(ctx->ac.i32, itemsize_dw, 0), "");
        }
 
        for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++i) {
@@ -5908,17 +5879,17 @@ handle_es_outputs_post(struct nir_to_llvm_context *ctx,
 
                if (lds_base) {
                        dw_addr = LLVMBuildAdd(ctx->builder, lds_base,
-                                              LLVMConstInt(ctx->i32, param_index * 4, false),
+                                              LLVMConstInt(ctx->ac.i32, param_index * 4, false),
                                               "");
                }
                for (j = 0; j < length; j++) {
                        LLVMValueRef out_val = LLVMBuildLoad(ctx->builder, out_ptr[j], "");
-                       out_val = LLVMBuildBitCast(ctx->builder, out_val, ctx->i32, "");
+                       out_val = LLVMBuildBitCast(ctx->builder, out_val, ctx->ac.i32, "");
 
                        if (ctx->ac.chip_class  >= GFX9) {
-                               lds_store(ctx, dw_addr,
-                                         LLVMBuildLoad(ctx->builder, out_ptr[j], ""));
-                               dw_addr = LLVMBuildAdd(ctx->builder, dw_addr, ctx->i32one, "");
+                               ac_lds_store(&ctx->ac, dw_addr,
+                                            LLVMBuildLoad(ctx->builder, out_ptr[j], ""));
+                               dw_addr = LLVMBuildAdd(ctx->builder, dw_addr, ctx->ac.i32_1, "");
                        } else {
                                ac_build_buffer_store_dword(&ctx->ac,
                                                            ctx->esgs_ring,
@@ -5953,12 +5924,12 @@ handle_ls_outputs_post(struct nir_to_llvm_context *ctx)
                if (length > 4)
                        mark_tess_output(ctx, false, param + 1);
                LLVMValueRef dw_addr = LLVMBuildAdd(ctx->builder, base_dw_addr,
-                                                   LLVMConstInt(ctx->i32, param * 4, false),
+                                                   LLVMConstInt(ctx->ac.i32, param * 4, false),
                                                    "");
                for (unsigned j = 0; j < length; j++) {
-                       lds_store(ctx, dw_addr,
-                                 LLVMBuildLoad(ctx->builder, out_ptr[j], ""));
-                       dw_addr = LLVMBuildAdd(ctx->builder, dw_addr, ctx->i32one, "");
+                       ac_lds_store(&ctx->ac, dw_addr,
+                                    LLVMBuildLoad(ctx->builder, out_ptr[j], ""));
+                       dw_addr = LLVMBuildAdd(ctx->builder, dw_addr, ctx->ac.i32_1, "");
                }
        }
 }
@@ -6089,7 +6060,7 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
 
        ac_nir_build_if(&if_ctx, ctx,
                        LLVMBuildICmp(ctx->builder, LLVMIntEQ,
-                                     invocation_id, ctx->i32zero, ""));
+                                     invocation_id, ctx->ac.i32_0, ""));
 
        tess_inner_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_INNER);
        tess_outer_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_OUTER);
@@ -6098,33 +6069,33 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
        mark_tess_output(ctx, true, tess_outer_index);
        lds_base = get_tcs_out_current_patch_data_offset(ctx);
        lds_inner = LLVMBuildAdd(ctx->builder, lds_base,
-                                LLVMConstInt(ctx->i32, tess_inner_index * 4, false), "");
+                                LLVMConstInt(ctx->ac.i32, tess_inner_index * 4, false), "");
        lds_outer = LLVMBuildAdd(ctx->builder, lds_base,
-                                LLVMConstInt(ctx->i32, tess_outer_index * 4, false), "");
+                                LLVMConstInt(ctx->ac.i32, tess_outer_index * 4, false), "");
 
        for (i = 0; i < 4; i++) {
-               inner[i] = LLVMGetUndef(ctx->i32);
-               outer[i] = LLVMGetUndef(ctx->i32);
+               inner[i] = LLVMGetUndef(ctx->ac.i32);
+               outer[i] = LLVMGetUndef(ctx->ac.i32);
        }
 
        // LINES reverseal
        if (ctx->options->key.tcs.primitive_mode == GL_ISOLINES) {
-               outer[0] = out[1] = lds_load(ctx, lds_outer);
+               outer[0] = out[1] = ac_lds_load(&ctx->ac, lds_outer);
                lds_outer = LLVMBuildAdd(ctx->builder, lds_outer,
-                                        LLVMConstInt(ctx->i32, 1, false), "");
-               outer[1] = out[0] = lds_load(ctx, lds_outer);
+                                        LLVMConstInt(ctx->ac.i32, 1, false), "");
+               outer[1] = out[0] = ac_lds_load(&ctx->ac, lds_outer);
        } else {
                for (i = 0; i < outer_comps; i++) {
                        outer[i] = out[i] =
-                               lds_load(ctx, lds_outer);
+                               ac_lds_load(&ctx->ac, lds_outer);
                        lds_outer = LLVMBuildAdd(ctx->builder, lds_outer,
-                                                LLVMConstInt(ctx->i32, 1, false), "");
+                                                LLVMConstInt(ctx->ac.i32, 1, false), "");
                }
                for (i = 0; i < inner_comps; i++) {
                        inner[i] = out[outer_comps+i] =
-                               lds_load(ctx, lds_inner);
+                               ac_lds_load(&ctx->ac, lds_inner);
                        lds_inner = LLVMBuildAdd(ctx->builder, lds_inner,
-                                                LLVMConstInt(ctx->i32, 1, false), "");
+                                                LLVMConstInt(ctx->ac.i32, 1, false), "");
                }
        }
 
@@ -6139,18 +6110,18 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
        buffer = ctx->hs_ring_tess_factor;
        tf_base = ctx->tess_factor_offset;
        byteoffset = LLVMBuildMul(ctx->builder, rel_patch_id,
-                                 LLVMConstInt(ctx->i32, 4 * stride, false), "");
+                                 LLVMConstInt(ctx->ac.i32, 4 * stride, false), "");
        unsigned tf_offset = 0;
 
        if (ctx->options->chip_class <= VI) {
                ac_nir_build_if(&inner_if_ctx, ctx,
                                LLVMBuildICmp(ctx->builder, LLVMIntEQ,
-                                             rel_patch_id, ctx->i32zero, ""));
+                                             rel_patch_id, ctx->ac.i32_0, ""));
 
                /* Store the dynamic HS control word. */
                ac_build_buffer_store_dword(&ctx->ac, buffer,
-                                           LLVMConstInt(ctx->i32, 0x80000000, false),
-                                           1, ctx->i32zero, tf_base,
+                                           LLVMConstInt(ctx->ac.i32, 0x80000000, false),
+                                           1, ctx->ac.i32_0, tf_base,
                                            0, 1, 0, true, false);
                tf_offset += 4;
 
@@ -6166,15 +6137,15 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
                                            stride - 4, byteoffset, tf_base,
                                            16 + tf_offset, 1, 0, true, false);
 
-       //TODO store to offchip for TES to read - only if TES reads them
-       if (1) {
+       //store to offchip for TES to read - only if TES reads them
+       if (ctx->options->key.tcs.tes_reads_tess_factors) {
                LLVMValueRef inner_vec, outer_vec, tf_outer_offset;
                LLVMValueRef tf_inner_offset;
                unsigned param_outer, param_inner;
 
                param_outer = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_OUTER);
                tf_outer_offset = get_tcs_tes_buffer_address(ctx, NULL,
-                                                            LLVMConstInt(ctx->i32, param_outer, 0));
+                                                            LLVMConstInt(ctx->ac.i32, param_outer, 0));
 
                outer_vec = ac_build_gather_values(&ctx->ac, outer,
                                                   util_next_power_of_two(outer_comps));
@@ -6185,7 +6156,7 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
                if (inner_comps) {
                        param_inner = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_INNER);
                        tf_inner_offset = get_tcs_tes_buffer_address(ctx, NULL,
-                                                                    LLVMConstInt(ctx->i32, param_inner, 0));
+                                                                    LLVMConstInt(ctx->ac.i32, param_inner, 0));
 
                        inner_vec = inner_comps == 1 ? inner[0] :
                                ac_build_gather_values(&ctx->ac, inner, inner_comps);
@@ -6234,10 +6205,10 @@ si_export_mrt_z(struct nir_to_llvm_context *ctx,
        args.target = V_008DFC_SQ_EXP_MRTZ;
        args.compr = false;
 
-       args.out[0] = LLVMGetUndef(ctx->f32); /* R, depth */
-       args.out[1] = LLVMGetUndef(ctx->f32); /* G, stencil test val[0:7], stencil op val[8:15] */
-       args.out[2] = LLVMGetUndef(ctx->f32); /* B, sample mask */
-       args.out[3] = LLVMGetUndef(ctx->f32); /* A, alpha to mask */
+       args.out[0] = LLVMGetUndef(ctx->ac.f32); /* R, depth */
+       args.out[1] = LLVMGetUndef(ctx->ac.f32); /* G, stencil test val[0:7], stencil op val[8:15] */
+       args.out[2] = LLVMGetUndef(ctx->ac.f32); /* B, sample mask */
+       args.out[3] = LLVMGetUndef(ctx->ac.f32); /* A, alpha to mask */
 
        if (depth) {
                args.out[0] = depth;
@@ -6423,29 +6394,29 @@ ac_setup_rings(struct nir_to_llvm_context *ctx)
 {
        if ((ctx->stage == MESA_SHADER_VERTEX && ctx->options->key.vs.as_es) ||
            (ctx->stage == MESA_SHADER_TESS_EVAL && ctx->options->key.tes.as_es)) {
-               ctx->esgs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_ESGS_VS, false));
+               ctx->esgs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_ESGS_VS, false));
        }
 
        if (ctx->is_gs_copy_shader) {
-               ctx->gsvs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_GSVS_VS, false));
+               ctx->gsvs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_GSVS_VS, false));
        }
        if (ctx->stage == MESA_SHADER_GEOMETRY) {
                LLVMValueRef tmp;
-               ctx->esgs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_ESGS_GS, false));
-               ctx->gsvs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_GSVS_GS, false));
+               ctx->esgs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_ESGS_GS, false));
+               ctx->gsvs_ring = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_GSVS_GS, false));
 
-               ctx->gsvs_ring = LLVMBuildBitCast(ctx->builder, ctx->gsvs_ring, ctx->v4i32, "");
+               ctx->gsvs_ring = LLVMBuildBitCast(ctx->builder, ctx->gsvs_ring, ctx->ac.v4i32, "");
 
-               ctx->gsvs_ring = LLVMBuildInsertElement(ctx->builder, ctx->gsvs_ring, ctx->gsvs_num_entries, LLVMConstInt(ctx->i32, 2, false), "");
-               tmp = LLVMBuildExtractElement(ctx->builder, ctx->gsvs_ring, ctx->i32one, "");
+               ctx->gsvs_ring = LLVMBuildInsertElement(ctx->builder, ctx->gsvs_ring, ctx->gsvs_num_entries, LLVMConstInt(ctx->ac.i32, 2, false), "");
+               tmp = LLVMBuildExtractElement(ctx->builder, ctx->gsvs_ring, ctx->ac.i32_1, "");
                tmp = LLVMBuildOr(ctx->builder, tmp, ctx->gsvs_ring_stride, "");
-               ctx->gsvs_ring = LLVMBuildInsertElement(ctx->builder, ctx->gsvs_ring, tmp, ctx->i32one, "");
+               ctx->gsvs_ring = LLVMBuildInsertElement(ctx->builder, ctx->gsvs_ring, tmp, ctx->ac.i32_1, "");
        }
 
        if (ctx->stage == MESA_SHADER_TESS_CTRL ||
            ctx->stage == MESA_SHADER_TESS_EVAL) {
-               ctx->hs_ring_tess_offchip = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_HS_TESS_OFFCHIP, false));
-               ctx->hs_ring_tess_factor = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->i32, RING_HS_TESS_FACTOR, false));
+               ctx->hs_ring_tess_offchip = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_HS_TESS_OFFCHIP, false));
+               ctx->hs_ring_tess_factor = ac_build_load_to_sgpr(&ctx->ac, ctx->ring_offsets, LLVMConstInt(ctx->ac.i32, RING_HS_TESS_FACTOR, false));
        }
 }
 
@@ -6570,7 +6541,6 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm,
        LLVMDisposeTargetData(data_layout);
        LLVMDisposeMessage(data_layout_str);
 
-       setup_types(&ctx);
        ctx.builder = LLVMCreateBuilderInContext(ctx.context);
        ctx.ac.builder = ctx.builder;
 
@@ -6596,8 +6566,11 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm,
 
        ctx.abi.inputs = &ctx.inputs[0];
        ctx.abi.emit_outputs = handle_shader_outputs_post;
+       ctx.abi.emit_vertex = visit_emit_vertex;
+       ctx.abi.load_ubo = radv_load_ubo;
        ctx.abi.load_ssbo = radv_load_ssbo;
        ctx.abi.load_sampler_desc = radv_get_sampler_desc;
+       ctx.abi.clamp_shadow_reference = false;
 
        if (shader_count >= 2)
                ac_init_exec_full_mask(&ctx.ac);
@@ -6614,9 +6587,12 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm,
                ctx.num_output_culls = shaders[i]->info.cull_distance_array_size;
 
                if (shaders[i]->info.stage == MESA_SHADER_GEOMETRY) {
-                       ctx.gs_next_vertex = ac_build_alloca(&ctx.ac, ctx.i32, "gs_next_vertex");
-
+                       ctx.gs_next_vertex = ac_build_alloca(&ctx.ac, ctx.ac.i32, "gs_next_vertex");
                        ctx.gs_max_out_vertices = shaders[i]->info.gs.vertices_out;
+                       ctx.abi.load_inputs = load_gs_input;
+               } else if (shaders[i]->info.stage == MESA_SHADER_TESS_CTRL) {
+                       ctx.tcs_outputs_read = shaders[i]->info.outputs_read;
+                       ctx.tcs_patch_outputs_read = shaders[i]->info.patch_outputs_read;
                } else if (shaders[i]->info.stage == MESA_SHADER_TESS_EVAL) {
                        ctx.tes_primitive_mode = shaders[i]->info.tess.primitive_mode;
                } else if (shaders[i]->info.stage == MESA_SHADER_VERTEX) {
@@ -6879,13 +6855,13 @@ ac_gs_copy_shader_emit(struct nir_to_llvm_context *ctx)
 {
        LLVMValueRef args[9];
        args[0] = ctx->gsvs_ring;
-       args[1] = LLVMBuildMul(ctx->builder, ctx->abi.vertex_id, LLVMConstInt(ctx->i32, 4, false), "");
-       args[3] = ctx->i32zero;
-       args[4] = ctx->i32one;  /* OFFEN */
-       args[5] = ctx->i32zero; /* IDXEN */
-       args[6] = ctx->i32one;  /* GLC */
-       args[7] = ctx->i32one;  /* SLC */
-       args[8] = ctx->i32zero; /* TFE */
+       args[1] = LLVMBuildMul(ctx->builder, ctx->abi.vertex_id, LLVMConstInt(ctx->ac.i32, 4, false), "");
+       args[3] = ctx->ac.i32_0;
+       args[4] = ctx->ac.i32_1;  /* OFFEN */
+       args[5] = ctx->ac.i32_0; /* IDXEN */
+       args[6] = ctx->ac.i32_1;  /* GLC */
+       args[7] = ctx->ac.i32_1;  /* SLC */
+       args[8] = ctx->ac.i32_0; /* TFE */
 
        int idx = 0;
 
@@ -6905,13 +6881,13 @@ ac_gs_copy_shader_emit(struct nir_to_llvm_context *ctx)
 
                for (unsigned j = 0; j < length; j++) {
                        LLVMValueRef value;
-                       args[2] = LLVMConstInt(ctx->i32,
+                       args[2] = LLVMConstInt(ctx->ac.i32,
                                               (slot * 4 + j) *
                                               ctx->gs_max_out_vertices * 16 * 4, false);
 
                        value = ac_build_intrinsic(&ctx->ac,
                                                   "llvm.SI.buffer.load.dword.i32.i32",
-                                                  ctx->i32, args, 9,
+                                                  ctx->ac.i32, args, 9,
                                                   AC_FUNC_ATTR_READONLY |
                                                   AC_FUNC_ATTR_LEGACY);
 
@@ -6942,7 +6918,6 @@ void ac_create_gs_copy_shader(LLVMTargetMachineRef tm,
 
        ctx.is_gs_copy_shader = true;
        LLVMSetTarget(ctx.module, "amdgcn--");
-       setup_types(&ctx);
 
        ctx.builder = LLVMCreateBuilderInContext(ctx.context);
        ctx.ac.builder = ctx.builder;