diff --git a/CMakeLists.txt b/CMakeLists.txt index be92fb9f9c81ccdd583630843d17c5b9252e1302..ca20a702bce8de85c110246b462ed4e5dd8e388c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -376,7 +376,7 @@ set(ZIG_STAGE2_SOURCES lib/std/Target.zig lib/std/Target/Query.zig lib/std/Target/aarch64.zig - lib/std/Target/amdgpu.zig + lib/std/Target/amdgcn.zig lib/std/Target/arm.zig lib/std/Target/avr.zig lib/std/Target/bpf.zig diff --git a/lib/compiler_rt/atomics.zig b/lib/compiler_rt/atomics.zig index db1e9b4b70cf49afa5fdcf58eb84016533fb90ca..2cec3987329296aecdff17b50ca5ceb914a84364 100644 --- a/lib/compiler_rt/atomics.zig +++ b/lib/compiler_rt/atomics.zig @@ -42,7 +42,7 @@ const largest_atomic_size = switch (arch) { // Objects smaller than this threshold are implemented in terms of compare-exchange // of a larger value. const smallest_atomic_fetch_exch_size = switch (arch) { - // On AMDGPU, there are no instructions for atomic operations other than load and store + // On AMDGCN, there are no instructions for atomic operations other than load and store // (as of LLVM 15), and so these need to be implemented in terms of atomic CAS. .amdgcn => @sizeOf(u32), else => @sizeOf(u8), diff --git a/lib/std/Target.zig b/lib/std/Target.zig index beed459ec4333a2d3be38a657c0b07fe503b3226..298da21187b055c0c755e6ace61d3ec1f61bf8ac 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -719,7 +719,7 @@ pub const Os = struct { pub const aarch64 = @import("Target/aarch64.zig"); pub const arc = @import("Target/arc.zig"); -pub const amdgpu = @import("Target/amdgpu.zig"); +pub const amdgcn = @import("Target/amdgcn.zig"); pub const arm = @import("Target/arm.zig"); pub const avr = @import("Target/avr.zig"); pub const bpf = @import("Target/bpf.zig"); @@ -1592,7 +1592,6 @@ pub const Cpu = struct { .loongarch32, .loongarch64 => "loongarch", .mips, .mipsel, .mips64, .mips64el => "mips", .powerpc, .powerpcle, .powerpc64, .powerpc64le => "powerpc", - .amdgcn => "amdgpu", .riscv32, .riscv64 => "riscv", .sparc, .sparc64 => "sparc", .s390x => "s390x", @@ -1621,7 +1620,7 @@ pub const Cpu = struct { .mips, .mipsel, .mips64, .mips64el => &mips.all_features, .msp430 => &msp430.all_features, .powerpc, .powerpcle, .powerpc64, .powerpc64le => &powerpc.all_features, - .amdgcn => &amdgpu.all_features, + .amdgcn => &amdgcn.all_features, .riscv32, .riscv64 => &riscv.all_features, .sparc, .sparc64 => &sparc.all_features, .spirv, .spirv32, .spirv64 => &spirv.all_features, @@ -1653,7 +1652,7 @@ pub const Cpu = struct { .mips, .mipsel, .mips64, .mips64el => comptime allCpusFromDecls(mips.cpu), .msp430 => comptime allCpusFromDecls(msp430.cpu), .powerpc, .powerpcle, .powerpc64, .powerpc64le => comptime allCpusFromDecls(powerpc.cpu), - .amdgcn => comptime allCpusFromDecls(amdgpu.cpu), + .amdgcn => comptime allCpusFromDecls(amdgcn.cpu), .riscv32, .riscv64 => comptime allCpusFromDecls(riscv.cpu), .sparc, .sparc64 => comptime allCpusFromDecls(sparc.cpu), .spirv, .spirv32, .spirv64 => comptime allCpusFromDecls(spirv.cpu), @@ -1891,7 +1890,7 @@ pub const Cpu = struct { }; }; return switch (arch) { - .amdgcn => &amdgpu.cpu.gfx600, + .amdgcn => &amdgcn.cpu.gfx600, .arc => &arc.cpu.generic, .arm, .armeb, .thumb, .thumbeb => &arm.cpu.generic, .aarch64, .aarch64_be => &aarch64.cpu.generic, @@ -1940,7 +1939,7 @@ pub const Cpu = struct { /// `Os.Tag.freestanding`. pub fn baseline(arch: Arch, os: Os) *const Model { return switch (arch) { - .amdgcn => &amdgpu.cpu.gfx906, + .amdgcn => &amdgcn.cpu.gfx906, .arm, .armeb, .thumb, .thumbeb => &arm.cpu.baseline, .aarch64 => switch (os.tag) { .bridgeos, .driverkit, .macos => &aarch64.cpu.apple_m1, @@ -3308,6 +3307,7 @@ pub fn cCallingConvention(target: Target) ?std.builtin.CallingConvention { }, .arm, .armeb, .thumb, .thumbeb => switch (target.os.tag) { .netbsd => .{ .arm_apcs = .{} }, + .watchos => .{ .arm_aapcs16_vfp = .{} }, else => switch (target.abi.floatAbi()) { .soft => .{ .arm_aapcs = .{} }, .hard => .{ .arm_aapcs_vfp = .{} }, diff --git a/lib/std/Target/amdgcn.zig b/lib/std/Target/amdgcn.zig new file mode 100644 index 0000000000000000000000000000000000000000..a12e1b0c0bf18706eb71942e738dca9d837207c3 --- /dev/null +++ b/lib/std/Target/amdgcn.zig @@ -0,0 +1,2728 @@ +//! This file is auto-generated by tools/update_cpu_features.zig. + +const std = @import("../std.zig"); +const CpuFeature = std.Target.Cpu.Feature; +const CpuModel = std.Target.Cpu.Model; + +pub const Feature = enum { + @"16_bit_insts", + a16, + add_no_carry_insts, + agent_scope_fine_grained_remote_memory_atomics, + allocate1_5xvgprs, + aperture_regs, + architected_flat_scratch, + architected_sgprs, + atomic_buffer_global_pk_add_f16_insts, + atomic_buffer_global_pk_add_f16_no_rtn_insts, + atomic_buffer_pk_add_bf16_inst, + atomic_csub_no_rtn_insts, + atomic_ds_pk_add_16_insts, + atomic_fadd_no_rtn_insts, + atomic_fadd_rtn_insts, + atomic_flat_pk_add_16_insts, + atomic_fmin_fmax_flat_f32, + atomic_fmin_fmax_flat_f64, + atomic_fmin_fmax_global_f32, + atomic_fmin_fmax_global_f64, + atomic_global_pk_add_bf16_inst, + auto_waitcnt_before_barrier, + back_off_barrier, + ci_insts, + cumode, + default_component_broadcast, + default_component_zero, + dl_insts, + dot10_insts, + dot11_insts, + dot1_insts, + dot2_insts, + dot3_insts, + dot4_insts, + dot5_insts, + dot6_insts, + dot7_insts, + dot8_insts, + dot9_insts, + dpp, + dpp8, + dpp_64bit, + dpp_src1_sgpr, + ds128, + ds_src2_insts, + extended_image_insts, + fast_denormal_f32, + fast_fmaf, + flat_address_space, + flat_atomic_fadd_f32_inst, + flat_buffer_global_fadd_f64_inst, + flat_for_global, + flat_global_insts, + flat_inst_offsets, + flat_scratch, + flat_scratch_insts, + flat_segment_offset_bug, + fma_mix_insts, + fmacf64_inst, + fmaf, + force_store_sc0_sc1, + fp64, + fp8_conversion_insts, + fp8_insts, + full_rate_64_ops, + g16, + gcn3_encoding, + gds, + get_wave_id_inst, + gfx10, + gfx10_3_insts, + gfx10_a_encoding, + gfx10_b_encoding, + gfx10_insts, + gfx11, + gfx11_insts, + gfx12, + gfx12_insts, + gfx7_gfx8_gfx9_insts, + gfx8_insts, + gfx9, + gfx90a_insts, + gfx940_insts, + gfx9_insts, + gws, + half_rate_64_ops, + image_gather4_d16_bug, + image_insts, + image_store_d16_bug, + inst_fwd_prefetch_bug, + int_clamp_insts, + inv_2pi_inline_imm, + kernarg_preload, + lds_branch_vmem_war_hazard, + lds_misaligned_bug, + ldsbankcount16, + ldsbankcount32, + load_store_opt, + localmemorysize32768, + localmemorysize65536, + mad_intra_fwd_bug, + mad_mac_f32_insts, + mad_mix_insts, + mai_insts, + max_hard_clause_length_32, + max_hard_clause_length_63, + max_private_element_size_16, + max_private_element_size_4, + max_private_element_size_8, + memory_atomic_fadd_f32_denormal_support, + mfma_inline_literal_bug, + mimg_r128, + movrel, + msaa_load_dst_sel_bug, + negative_scratch_offset_bug, + negative_unaligned_scratch_offset_bug, + no_data_dep_hazard, + no_sdst_cmpx, + nsa_clause_bug, + nsa_encoding, + nsa_to_vmem_bug, + offset_3f_bug, + packed_fp32_ops, + packed_tid, + partial_nsa_encoding, + pk_fmac_f16_inst, + precise_memory, + priv_enabled_trap2_nop_bug, + promote_alloca, + prt_strict_null, + pseudo_scalar_trans, + r128_a16, + real_true16, + required_export_priority, + requires_cov6, + restricted_soffset, + s_memrealtime, + s_memtime_inst, + salu_float, + scalar_atomics, + scalar_dwordx3_loads, + scalar_flat_scratch_insts, + scalar_stores, + sdwa, + sdwa_mav, + sdwa_omod, + sdwa_out_mods_vopc, + sdwa_scalar, + sdwa_sdst, + sea_islands, + sgpr_init_bug, + shader_cycles_hi_lo_registers, + shader_cycles_register, + si_scheduler, + smem_to_vector_write_hazard, + southern_islands, + sramecc, + sramecc_support, + tgsplit, + trap_handler, + trig_reduced_range, + true16, + unaligned_access_mode, + unaligned_buffer_access, + unaligned_ds_access, + unaligned_scratch_access, + unpacked_d16_vmem, + unsafe_ds_offset_folding, + user_sgpr_init16_bug, + valu_trans_use_hazard, + vcmpx_exec_war_hazard, + vcmpx_permlane_hazard, + vgpr_index_mode, + vgpr_singleuse_hint, + vmem_to_scalar_write_hazard, + vmem_write_vgpr_in_order, + volcanic_islands, + vop3_literal, + vop3p, + vopd, + vscnt, + wavefrontsize16, + wavefrontsize32, + wavefrontsize64, + xnack, + xnack_support, +}; + +pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet; +pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas; +pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny; +pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll; + +pub const all_features = blk: { + const len = @typeInfo(Feature).@"enum".fields.len; + std.debug.assert(len <= CpuFeature.Set.needed_bit_count); + var result: [len]CpuFeature = undefined; + result[@intFromEnum(Feature.@"16_bit_insts")] = .{ + .llvm_name = "16-bit-insts", + .description = "Has i16/f16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.a16)] = .{ + .llvm_name = "a16", + .description = "Support A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.add_no_carry_insts)] = .{ + .llvm_name = "add-no-carry-insts", + .description = "Have VALU add/sub instructions without carry out", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.agent_scope_fine_grained_remote_memory_atomics)] = .{ + .llvm_name = "agent-scope-fine-grained-remote-memory-atomics", + .description = "Agent (device) scoped atomic operations, excluding those directly supported by PCIe (i.e. integer atomic add, exchange, and compare-and-swap), are functional for allocations in host or peer device memory.", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.allocate1_5xvgprs)] = .{ + .llvm_name = "allocate1_5xvgprs", + .description = "Has 50% more physical VGPRs and 50% larger allocation granule", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.aperture_regs)] = .{ + .llvm_name = "aperture-regs", + .description = "Has Memory Aperture Base and Size Registers", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.architected_flat_scratch)] = .{ + .llvm_name = "architected-flat-scratch", + .description = "Flat Scratch register is a readonly SPI initialized architected register", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.architected_sgprs)] = .{ + .llvm_name = "architected-sgprs", + .description = "Enable the architected SGPRs", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_insts)] = .{ + .llvm_name = "atomic-buffer-global-pk-add-f16-insts", + .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that can return original value", + .dependencies = featureSet(&[_]Feature{ + .flat_global_insts, + }), + }; + result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_no_rtn_insts)] = .{ + .llvm_name = "atomic-buffer-global-pk-add-f16-no-rtn-insts", + .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that don't return original value", + .dependencies = featureSet(&[_]Feature{ + .flat_global_insts, + }), + }; + result[@intFromEnum(Feature.atomic_buffer_pk_add_bf16_inst)] = .{ + .llvm_name = "atomic-buffer-pk-add-bf16-inst", + .description = "Has buffer_atomic_pk_add_bf16 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_csub_no_rtn_insts)] = .{ + .llvm_name = "atomic-csub-no-rtn-insts", + .description = "Has buffer_atomic_csub and global_atomic_csub instructions that don't return original value", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_ds_pk_add_16_insts)] = .{ + .llvm_name = "atomic-ds-pk-add-16-insts", + .description = "Has ds_pk_add_bf16, ds_pk_add_f16, ds_pk_add_rtn_bf16, ds_pk_add_rtn_f16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_fadd_no_rtn_insts)] = .{ + .llvm_name = "atomic-fadd-no-rtn-insts", + .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that don't return original value", + .dependencies = featureSet(&[_]Feature{ + .flat_global_insts, + }), + }; + result[@intFromEnum(Feature.atomic_fadd_rtn_insts)] = .{ + .llvm_name = "atomic-fadd-rtn-insts", + .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that return original value", + .dependencies = featureSet(&[_]Feature{ + .flat_global_insts, + }), + }; + result[@intFromEnum(Feature.atomic_flat_pk_add_16_insts)] = .{ + .llvm_name = "atomic-flat-pk-add-16-insts", + .description = "Has flat_atomic_pk_add_f16 and flat_atomic_pk_add_bf16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_fmin_fmax_flat_f32)] = .{ + .llvm_name = "atomic-fmin-fmax-flat-f32", + .description = "Has flat memory instructions for atomicrmw fmin/fmax for float", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_fmin_fmax_flat_f64)] = .{ + .llvm_name = "atomic-fmin-fmax-flat-f64", + .description = "Has flat memory instructions for atomicrmw fmin/fmax for double", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_fmin_fmax_global_f32)] = .{ + .llvm_name = "atomic-fmin-fmax-global-f32", + .description = "Has global/buffer instructions for atomicrmw fmin/fmax for float", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_fmin_fmax_global_f64)] = .{ + .llvm_name = "atomic-fmin-fmax-global-f64", + .description = "Has global/buffer instructions for atomicrmw fmin/fmax for float", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.atomic_global_pk_add_bf16_inst)] = .{ + .llvm_name = "atomic-global-pk-add-bf16-inst", + .description = "Has global_atomic_pk_add_bf16 instruction", + .dependencies = featureSet(&[_]Feature{ + .flat_global_insts, + }), + }; + result[@intFromEnum(Feature.auto_waitcnt_before_barrier)] = .{ + .llvm_name = "auto-waitcnt-before-barrier", + .description = "Hardware automatically inserts waitcnt before barrier", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.back_off_barrier)] = .{ + .llvm_name = "back-off-barrier", + .description = "Hardware supports backing off s_barrier if an exception occurs", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.ci_insts)] = .{ + .llvm_name = "ci-insts", + .description = "Additional instructions for CI+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.cumode)] = .{ + .llvm_name = "cumode", + .description = "Enable CU wavefront execution mode", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.default_component_broadcast)] = .{ + .llvm_name = "default-component-broadcast", + .description = "BUFFER/IMAGE store instructions set unspecified components to x component (GFX12)", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.default_component_zero)] = .{ + .llvm_name = "default-component-zero", + .description = "BUFFER/IMAGE store instructions set unspecified components to zero (before GFX12)", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dl_insts)] = .{ + .llvm_name = "dl-insts", + .description = "Has v_fmac_f32 and v_xnor_b32 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot10_insts)] = .{ + .llvm_name = "dot10-insts", + .description = "Has v_dot2_f32_f16 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot11_insts)] = .{ + .llvm_name = "dot11-insts", + .description = "Has v_dot4_f32_fp8_fp8, v_dot4_f32_fp8_bf8, v_dot4_f32_bf8_fp8, v_dot4_f32_bf8_bf8 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot1_insts)] = .{ + .llvm_name = "dot1-insts", + .description = "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot2_insts)] = .{ + .llvm_name = "dot2-insts", + .description = "Has v_dot2_i32_i16, v_dot2_u32_u16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot3_insts)] = .{ + .llvm_name = "dot3-insts", + .description = "Has v_dot8c_i32_i4 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot4_insts)] = .{ + .llvm_name = "dot4-insts", + .description = "Has v_dot2c_i32_i16 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot5_insts)] = .{ + .llvm_name = "dot5-insts", + .description = "Has v_dot2c_f32_f16 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot6_insts)] = .{ + .llvm_name = "dot6-insts", + .description = "Has v_dot4c_i32_i8 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot7_insts)] = .{ + .llvm_name = "dot7-insts", + .description = "Has v_dot4_u32_u8, v_dot8_u32_u4 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot8_insts)] = .{ + .llvm_name = "dot8-insts", + .description = "Has v_dot4_i32_iu8, v_dot8_i32_iu4 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dot9_insts)] = .{ + .llvm_name = "dot9-insts", + .description = "Has v_dot2_f16_f16, v_dot2_bf16_bf16, v_dot2_f32_bf16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dpp)] = .{ + .llvm_name = "dpp", + .description = "Support DPP (Data Parallel Primitives) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dpp8)] = .{ + .llvm_name = "dpp8", + .description = "Support DPP8 (Data Parallel Primitives) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dpp_64bit)] = .{ + .llvm_name = "dpp-64bit", + .description = "Support DPP (Data Parallel Primitives) extension in DP ALU", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.dpp_src1_sgpr)] = .{ + .llvm_name = "dpp-src1-sgpr", + .description = "Support SGPR for Src1 of DPP instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.ds128)] = .{ + .llvm_name = "enable-ds128", + .description = "Use ds_{read|write}_b128", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.ds_src2_insts)] = .{ + .llvm_name = "ds-src2-insts", + .description = "Has ds_*_src2 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.extended_image_insts)] = .{ + .llvm_name = "extended-image-insts", + .description = "Support mips != 0, lod != 0, gather4, and get_lod", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fast_denormal_f32)] = .{ + .llvm_name = "fast-denormal-f32", + .description = "Enabling denormals does not cause f32 instructions to run at f64 rates", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fast_fmaf)] = .{ + .llvm_name = "fast-fmaf", + .description = "Assuming f32 fma is at least as fast as mul + add", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_address_space)] = .{ + .llvm_name = "flat-address-space", + .description = "Support flat address space", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_atomic_fadd_f32_inst)] = .{ + .llvm_name = "flat-atomic-fadd-f32-inst", + .description = "Has flat_atomic_add_f32 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_buffer_global_fadd_f64_inst)] = .{ + .llvm_name = "flat-buffer-global-fadd-f64-inst", + .description = "Has flat, buffer, and global instructions for f64 atomic fadd", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_for_global)] = .{ + .llvm_name = "flat-for-global", + .description = "Force to generate flat instruction for global", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_global_insts)] = .{ + .llvm_name = "flat-global-insts", + .description = "Have global_* flat memory instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_inst_offsets)] = .{ + .llvm_name = "flat-inst-offsets", + .description = "Flat instructions have immediate offset addressing mode", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_scratch)] = .{ + .llvm_name = "enable-flat-scratch", + .description = "Use scratch_* flat memory instructions to access scratch", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_scratch_insts)] = .{ + .llvm_name = "flat-scratch-insts", + .description = "Have scratch_* flat memory instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.flat_segment_offset_bug)] = .{ + .llvm_name = "flat-segment-offset-bug", + .description = "GFX10 bug where inst_offset is ignored when flat instructions access global memory", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fma_mix_insts)] = .{ + .llvm_name = "fma-mix-insts", + .description = "Has v_fma_mix_f32, v_fma_mixlo_f16, v_fma_mixhi_f16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fmacf64_inst)] = .{ + .llvm_name = "fmacf64-inst", + .description = "Has v_fmac_f64 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fmaf)] = .{ + .llvm_name = "fmaf", + .description = "Enable single precision FMA (not as fast as mul+add, but fused)", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.force_store_sc0_sc1)] = .{ + .llvm_name = "force-store-sc0-sc1", + .description = "Has SC0 and SC1 on stores", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fp64)] = .{ + .llvm_name = "fp64", + .description = "Enable double precision operations", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fp8_conversion_insts)] = .{ + .llvm_name = "fp8-conversion-insts", + .description = "Has fp8 and bf8 conversion instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fp8_insts)] = .{ + .llvm_name = "fp8-insts", + .description = "Has fp8 and bf8 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.full_rate_64_ops)] = .{ + .llvm_name = "full-rate-64-ops", + .description = "Most fp64 instructions are full rate", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.g16)] = .{ + .llvm_name = "g16", + .description = "Support G16 for 16-bit gradient image operands", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gcn3_encoding)] = .{ + .llvm_name = "gcn3-encoding", + .description = "Encoding format for VI", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gds)] = .{ + .llvm_name = "gds", + .description = "Has Global Data Share", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.get_wave_id_inst)] = .{ + .llvm_name = "get-wave-id-inst", + .description = "Has s_get_waveid_in_workgroup instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx10)] = .{ + .llvm_name = "gfx10", + .description = "GFX10 GPU generation", + .dependencies = featureSet(&[_]Feature{ + .@"16_bit_insts", + .a16, + .add_no_carry_insts, + .aperture_regs, + .atomic_fmin_fmax_flat_f32, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f32, + .atomic_fmin_fmax_global_f64, + .ci_insts, + .default_component_zero, + .dpp, + .dpp8, + .extended_image_insts, + .fast_denormal_f32, + .fast_fmaf, + .flat_address_space, + .flat_global_insts, + .flat_inst_offsets, + .flat_scratch_insts, + .fma_mix_insts, + .fp64, + .g16, + .gds, + .gfx10_insts, + .gfx8_insts, + .gfx9_insts, + .gws, + .image_insts, + .int_clamp_insts, + .inv_2pi_inline_imm, + .localmemorysize65536, + .max_hard_clause_length_63, + .mimg_r128, + .movrel, + .no_data_dep_hazard, + .no_sdst_cmpx, + .pk_fmac_f16_inst, + .s_memrealtime, + .s_memtime_inst, + .sdwa, + .sdwa_omod, + .sdwa_scalar, + .sdwa_sdst, + .unaligned_buffer_access, + .unaligned_ds_access, + .vmem_write_vgpr_in_order, + .vop3_literal, + .vop3p, + .vscnt, + }), + }; + result[@intFromEnum(Feature.gfx10_3_insts)] = .{ + .llvm_name = "gfx10-3-insts", + .description = "Additional instructions for GFX10.3", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx10_a_encoding)] = .{ + .llvm_name = "gfx10_a-encoding", + .description = "Has BVH ray tracing instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx10_b_encoding)] = .{ + .llvm_name = "gfx10_b-encoding", + .description = "Encoding format GFX10_B", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx10_insts)] = .{ + .llvm_name = "gfx10-insts", + .description = "Additional instructions for GFX10+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx11)] = .{ + .llvm_name = "gfx11", + .description = "GFX11 GPU generation", + .dependencies = featureSet(&[_]Feature{ + .@"16_bit_insts", + .a16, + .add_no_carry_insts, + .aperture_regs, + .atomic_fmin_fmax_flat_f32, + .atomic_fmin_fmax_global_f32, + .ci_insts, + .default_component_zero, + .dpp, + .dpp8, + .extended_image_insts, + .fast_denormal_f32, + .fast_fmaf, + .flat_address_space, + .flat_global_insts, + .flat_inst_offsets, + .flat_scratch_insts, + .fma_mix_insts, + .fp64, + .g16, + .gds, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .gfx10_insts, + .gfx11_insts, + .gfx8_insts, + .gfx9_insts, + .gws, + .int_clamp_insts, + .inv_2pi_inline_imm, + .localmemorysize65536, + .max_hard_clause_length_32, + .mimg_r128, + .movrel, + .no_data_dep_hazard, + .no_sdst_cmpx, + .pk_fmac_f16_inst, + .true16, + .unaligned_buffer_access, + .unaligned_ds_access, + .vmem_write_vgpr_in_order, + .vop3_literal, + .vop3p, + .vopd, + .vscnt, + }), + }; + result[@intFromEnum(Feature.gfx11_insts)] = .{ + .llvm_name = "gfx11-insts", + .description = "Additional instructions for GFX11+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx12)] = .{ + .llvm_name = "gfx12", + .description = "GFX12 GPU generation", + .dependencies = featureSet(&[_]Feature{ + .@"16_bit_insts", + .a16, + .add_no_carry_insts, + .agent_scope_fine_grained_remote_memory_atomics, + .aperture_regs, + .atomic_fmin_fmax_flat_f32, + .atomic_fmin_fmax_global_f32, + .ci_insts, + .default_component_broadcast, + .dpp, + .dpp8, + .fast_denormal_f32, + .fast_fmaf, + .flat_address_space, + .flat_global_insts, + .flat_inst_offsets, + .flat_scratch_insts, + .fma_mix_insts, + .fp64, + .g16, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .gfx10_insts, + .gfx11_insts, + .gfx12_insts, + .gfx8_insts, + .gfx9_insts, + .int_clamp_insts, + .inv_2pi_inline_imm, + .localmemorysize65536, + .max_hard_clause_length_32, + .mimg_r128, + .movrel, + .no_data_dep_hazard, + .no_sdst_cmpx, + .pk_fmac_f16_inst, + .true16, + .unaligned_buffer_access, + .unaligned_ds_access, + .vop3_literal, + .vop3p, + .vopd, + .vscnt, + }), + }; + result[@intFromEnum(Feature.gfx12_insts)] = .{ + .llvm_name = "gfx12-insts", + .description = "Additional instructions for GFX12+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx7_gfx8_gfx9_insts)] = .{ + .llvm_name = "gfx7-gfx8-gfx9-insts", + .description = "Instructions shared in GFX7, GFX8, GFX9", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx8_insts)] = .{ + .llvm_name = "gfx8-insts", + .description = "Additional instructions for GFX8+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx9)] = .{ + .llvm_name = "gfx9", + .description = "GFX9 GPU generation", + .dependencies = featureSet(&[_]Feature{ + .@"16_bit_insts", + .a16, + .add_no_carry_insts, + .aperture_regs, + .ci_insts, + .default_component_zero, + .dpp, + .fast_denormal_f32, + .fast_fmaf, + .flat_address_space, + .flat_global_insts, + .flat_inst_offsets, + .flat_scratch_insts, + .fp64, + .gcn3_encoding, + .gfx7_gfx8_gfx9_insts, + .gfx8_insts, + .gfx9_insts, + .gws, + .int_clamp_insts, + .inv_2pi_inline_imm, + .localmemorysize65536, + .negative_scratch_offset_bug, + .r128_a16, + .s_memrealtime, + .s_memtime_inst, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .sdwa, + .sdwa_omod, + .sdwa_scalar, + .sdwa_sdst, + .unaligned_buffer_access, + .unaligned_ds_access, + .vgpr_index_mode, + .vmem_write_vgpr_in_order, + .vop3p, + .wavefrontsize64, + .xnack_support, + }), + }; + result[@intFromEnum(Feature.gfx90a_insts)] = .{ + .llvm_name = "gfx90a-insts", + .description = "Additional instructions for GFX90A+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx940_insts)] = .{ + .llvm_name = "gfx940-insts", + .description = "Additional instructions for GFX940+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gfx9_insts)] = .{ + .llvm_name = "gfx9-insts", + .description = "Additional instructions for GFX9+", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.gws)] = .{ + .llvm_name = "gws", + .description = "Has Global Wave Sync", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.half_rate_64_ops)] = .{ + .llvm_name = "half-rate-64-ops", + .description = "Most fp64 instructions are half rate instead of quarter", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.image_gather4_d16_bug)] = .{ + .llvm_name = "image-gather4-d16-bug", + .description = "Image Gather4 D16 hardware bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.image_insts)] = .{ + .llvm_name = "image-insts", + .description = "Support image instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.image_store_d16_bug)] = .{ + .llvm_name = "image-store-d16-bug", + .description = "Image Store D16 hardware bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.inst_fwd_prefetch_bug)] = .{ + .llvm_name = "inst-fwd-prefetch-bug", + .description = "S_INST_PREFETCH instruction causes shader to hang", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.int_clamp_insts)] = .{ + .llvm_name = "int-clamp-insts", + .description = "Support clamp for integer destination", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.inv_2pi_inline_imm)] = .{ + .llvm_name = "inv-2pi-inline-imm", + .description = "Has 1 / (2 * pi) as inline immediate", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.kernarg_preload)] = .{ + .llvm_name = "kernarg-preload", + .description = "Hardware supports preloading of kernel arguments in user SGPRs.", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.lds_branch_vmem_war_hazard)] = .{ + .llvm_name = "lds-branch-vmem-war-hazard", + .description = "Switching between LDS and VMEM-tex not waiting VM_VSRC=0", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.lds_misaligned_bug)] = .{ + .llvm_name = "lds-misaligned-bug", + .description = "Some GFX10 bug with multi-dword LDS and flat access that is not naturally aligned in WGP mode", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.ldsbankcount16)] = .{ + .llvm_name = "ldsbankcount16", + .description = "The number of LDS banks per compute unit.", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.ldsbankcount32)] = .{ + .llvm_name = "ldsbankcount32", + .description = "The number of LDS banks per compute unit.", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.load_store_opt)] = .{ + .llvm_name = "load-store-opt", + .description = "Enable SI load/store optimizer pass", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.localmemorysize32768)] = .{ + .llvm_name = "localmemorysize32768", + .description = "The size of local memory in bytes", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.localmemorysize65536)] = .{ + .llvm_name = "localmemorysize65536", + .description = "The size of local memory in bytes", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mad_intra_fwd_bug)] = .{ + .llvm_name = "mad-intra-fwd-bug", + .description = "MAD_U64/I64 intra instruction forwarding bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mad_mac_f32_insts)] = .{ + .llvm_name = "mad-mac-f32-insts", + .description = "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mad_mix_insts)] = .{ + .llvm_name = "mad-mix-insts", + .description = "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mai_insts)] = .{ + .llvm_name = "mai-insts", + .description = "Has mAI instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max_hard_clause_length_32)] = .{ + .llvm_name = "max-hard-clause-length-32", + .description = "Maximum number of instructions in an explicit S_CLAUSE is 32", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max_hard_clause_length_63)] = .{ + .llvm_name = "max-hard-clause-length-63", + .description = "Maximum number of instructions in an explicit S_CLAUSE is 63", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max_private_element_size_16)] = .{ + .llvm_name = "max-private-element-size-16", + .description = "Maximum private access size may be 16", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max_private_element_size_4)] = .{ + .llvm_name = "max-private-element-size-4", + .description = "Maximum private access size may be 4", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max_private_element_size_8)] = .{ + .llvm_name = "max-private-element-size-8", + .description = "Maximum private access size may be 8", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.memory_atomic_fadd_f32_denormal_support)] = .{ + .llvm_name = "memory-atomic-fadd-f32-denormal-support", + .description = "global/flat/buffer atomic fadd for float supports denormal handling", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mfma_inline_literal_bug)] = .{ + .llvm_name = "mfma-inline-literal-bug", + .description = "MFMA cannot use inline literal as SrcC", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.mimg_r128)] = .{ + .llvm_name = "mimg-r128", + .description = "Support 128-bit texture resources", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.movrel)] = .{ + .llvm_name = "movrel", + .description = "Has v_movrel*_b32 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.msaa_load_dst_sel_bug)] = .{ + .llvm_name = "msaa-load-dst-sel-bug", + .description = "MSAA loads not honoring dst_sel bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.negative_scratch_offset_bug)] = .{ + .llvm_name = "negative-scratch-offset-bug", + .description = "Negative immediate offsets in scratch instructions with an SGPR offset page fault on GFX9", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.negative_unaligned_scratch_offset_bug)] = .{ + .llvm_name = "negative-unaligned-scratch-offset-bug", + .description = "Scratch instructions with a VGPR offset and a negative immediate offset that is not a multiple of 4 read wrong memory on GFX10", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.no_data_dep_hazard)] = .{ + .llvm_name = "no-data-dep-hazard", + .description = "Does not need SW waitstates", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.no_sdst_cmpx)] = .{ + .llvm_name = "no-sdst-cmpx", + .description = "V_CMPX does not write VCC/SGPR in addition to EXEC", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.nsa_clause_bug)] = .{ + .llvm_name = "nsa-clause-bug", + .description = "MIMG-NSA in a hard clause has unpredictable results on GFX10.1", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.nsa_encoding)] = .{ + .llvm_name = "nsa-encoding", + .description = "Support NSA encoding for image instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.nsa_to_vmem_bug)] = .{ + .llvm_name = "nsa-to-vmem-bug", + .description = "MIMG-NSA followed by VMEM fail if EXEC_LO or EXEC_HI equals zero", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.offset_3f_bug)] = .{ + .llvm_name = "offset-3f-bug", + .description = "Branch offset of 3f hardware bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.packed_fp32_ops)] = .{ + .llvm_name = "packed-fp32-ops", + .description = "Support packed fp32 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.packed_tid)] = .{ + .llvm_name = "packed-tid", + .description = "Workitem IDs are packed into v0 at kernel launch", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.partial_nsa_encoding)] = .{ + .llvm_name = "partial-nsa-encoding", + .description = "Support partial NSA encoding for image instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.pk_fmac_f16_inst)] = .{ + .llvm_name = "pk-fmac-f16-inst", + .description = "Has v_pk_fmac_f16 instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.precise_memory)] = .{ + .llvm_name = "precise-memory", + .description = "Enable precise memory mode", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.priv_enabled_trap2_nop_bug)] = .{ + .llvm_name = "priv-enabled-trap2-nop-bug", + .description = "Hardware that runs with PRIV=1 interpreting 's_trap 2' as a nop bug", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.promote_alloca)] = .{ + .llvm_name = "promote-alloca", + .description = "Enable promote alloca pass", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.prt_strict_null)] = .{ + .llvm_name = "enable-prt-strict-null", + .description = "Enable zeroing of result registers for sparse texture fetches", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.pseudo_scalar_trans)] = .{ + .llvm_name = "pseudo-scalar-trans", + .description = "Has Pseudo Scalar Transcendental instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.r128_a16)] = .{ + .llvm_name = "r128-a16", + .description = "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.real_true16)] = .{ + .llvm_name = "real-true16", + .description = "Use true 16-bit registers", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.required_export_priority)] = .{ + .llvm_name = "required-export-priority", + .description = "Export priority must be explicitly manipulated on GFX11.5", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.requires_cov6)] = .{ + .llvm_name = "requires-cov6", + .description = "Target Requires Code Object V6", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.restricted_soffset)] = .{ + .llvm_name = "restricted-soffset", + .description = "Has restricted SOffset (immediate not supported).", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.s_memrealtime)] = .{ + .llvm_name = "s-memrealtime", + .description = "Has s_memrealtime instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.s_memtime_inst)] = .{ + .llvm_name = "s-memtime-inst", + .description = "Has s_memtime instruction", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.salu_float)] = .{ + .llvm_name = "salu-float", + .description = "Has SALU floating point instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.scalar_atomics)] = .{ + .llvm_name = "scalar-atomics", + .description = "Has atomic scalar memory instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.scalar_dwordx3_loads)] = .{ + .llvm_name = "scalar-dwordx3-loads", + .description = "Has 96-bit scalar load instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.scalar_flat_scratch_insts)] = .{ + .llvm_name = "scalar-flat-scratch-insts", + .description = "Have s_scratch_* flat memory instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.scalar_stores)] = .{ + .llvm_name = "scalar-stores", + .description = "Has store scalar memory instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa)] = .{ + .llvm_name = "sdwa", + .description = "Support SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa_mav)] = .{ + .llvm_name = "sdwa-mav", + .description = "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa_omod)] = .{ + .llvm_name = "sdwa-omod", + .description = "Support OMod with SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa_out_mods_vopc)] = .{ + .llvm_name = "sdwa-out-mods-vopc", + .description = "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa_scalar)] = .{ + .llvm_name = "sdwa-scalar", + .description = "Support scalar register with SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sdwa_sdst)] = .{ + .llvm_name = "sdwa-sdst", + .description = "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sea_islands)] = .{ + .llvm_name = "sea-islands", + .description = "SEA_ISLANDS GPU generation", + .dependencies = featureSet(&[_]Feature{ + .atomic_fmin_fmax_flat_f32, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f32, + .atomic_fmin_fmax_global_f64, + .ci_insts, + .default_component_zero, + .ds_src2_insts, + .extended_image_insts, + .flat_address_space, + .fp64, + .gds, + .gfx7_gfx8_gfx9_insts, + .gws, + .image_insts, + .localmemorysize65536, + .mad_mac_f32_insts, + .mimg_r128, + .movrel, + .s_memtime_inst, + .trig_reduced_range, + .unaligned_buffer_access, + .vmem_write_vgpr_in_order, + .wavefrontsize64, + }), + }; + result[@intFromEnum(Feature.sgpr_init_bug)] = .{ + .llvm_name = "sgpr-init-bug", + .description = "VI SGPR initialization bug requiring a fixed SGPR allocation size", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.shader_cycles_hi_lo_registers)] = .{ + .llvm_name = "shader-cycles-hi-lo-registers", + .description = "Has SHADER_CYCLES_HI/LO hardware registers", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.shader_cycles_register)] = .{ + .llvm_name = "shader-cycles-register", + .description = "Has SHADER_CYCLES hardware register", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.si_scheduler)] = .{ + .llvm_name = "si-scheduler", + .description = "Enable SI Machine Scheduler", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.smem_to_vector_write_hazard)] = .{ + .llvm_name = "smem-to-vector-write-hazard", + .description = "s_load_dword followed by v_cmp page faults", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.southern_islands)] = .{ + .llvm_name = "southern-islands", + .description = "SOUTHERN_ISLANDS GPU generation", + .dependencies = featureSet(&[_]Feature{ + .atomic_fmin_fmax_global_f32, + .atomic_fmin_fmax_global_f64, + .default_component_zero, + .ds_src2_insts, + .extended_image_insts, + .fp64, + .gds, + .gws, + .image_insts, + .ldsbankcount32, + .localmemorysize32768, + .mad_mac_f32_insts, + .mimg_r128, + .movrel, + .s_memtime_inst, + .trig_reduced_range, + .vmem_write_vgpr_in_order, + .wavefrontsize64, + }), + }; + result[@intFromEnum(Feature.sramecc)] = .{ + .llvm_name = "sramecc", + .description = "Enable SRAMECC", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.sramecc_support)] = .{ + .llvm_name = "sramecc-support", + .description = "Hardware supports SRAMECC", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.tgsplit)] = .{ + .llvm_name = "tgsplit", + .description = "Enable threadgroup split execution", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.trap_handler)] = .{ + .llvm_name = "trap-handler", + .description = "Trap handler support", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.trig_reduced_range)] = .{ + .llvm_name = "trig-reduced-range", + .description = "Requires use of fract on arguments to trig instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.true16)] = .{ + .llvm_name = "true16", + .description = "True 16-bit operand instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unaligned_access_mode)] = .{ + .llvm_name = "unaligned-access-mode", + .description = "Enable unaligned global, local and region loads and stores if the hardware supports it", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unaligned_buffer_access)] = .{ + .llvm_name = "unaligned-buffer-access", + .description = "Hardware supports unaligned global loads and stores", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unaligned_ds_access)] = .{ + .llvm_name = "unaligned-ds-access", + .description = "Hardware supports unaligned local and region loads and stores", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unaligned_scratch_access)] = .{ + .llvm_name = "unaligned-scratch-access", + .description = "Support unaligned scratch loads and stores", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unpacked_d16_vmem)] = .{ + .llvm_name = "unpacked-d16-vmem", + .description = "Has unpacked d16 vmem instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.unsafe_ds_offset_folding)] = .{ + .llvm_name = "unsafe-ds-offset-folding", + .description = "Force using DS instruction immediate offsets on SI", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.user_sgpr_init16_bug)] = .{ + .llvm_name = "user-sgpr-init16-bug", + .description = "Bug requiring at least 16 user+system SGPRs to be enabled", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.valu_trans_use_hazard)] = .{ + .llvm_name = "valu-trans-use-hazard", + .description = "Hazard when TRANS instructions are closely followed by a use of the result", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vcmpx_exec_war_hazard)] = .{ + .llvm_name = "vcmpx-exec-war-hazard", + .description = "V_CMPX WAR hazard on EXEC (V_CMPX issue ONLY)", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vcmpx_permlane_hazard)] = .{ + .llvm_name = "vcmpx-permlane-hazard", + .description = "TODO: describe me", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vgpr_index_mode)] = .{ + .llvm_name = "vgpr-index-mode", + .description = "Has VGPR mode register indexing", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vgpr_singleuse_hint)] = .{ + .llvm_name = "vgpr-singleuse-hint", + .description = "Has single-use VGPR hint instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vmem_to_scalar_write_hazard)] = .{ + .llvm_name = "vmem-to-scalar-write-hazard", + .description = "VMEM instruction followed by scalar writing to EXEC mask, M0 or SGPR leads to incorrect execution.", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vmem_write_vgpr_in_order)] = .{ + .llvm_name = "vmem-write-vgpr-in-order", + .description = "VMEM instructions of the same type write VGPR results in order", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.volcanic_islands)] = .{ + .llvm_name = "volcanic-islands", + .description = "VOLCANIC_ISLANDS GPU generation", + .dependencies = featureSet(&[_]Feature{ + .@"16_bit_insts", + .ci_insts, + .default_component_zero, + .dpp, + .ds_src2_insts, + .extended_image_insts, + .fast_denormal_f32, + .flat_address_space, + .fp64, + .gcn3_encoding, + .gds, + .gfx7_gfx8_gfx9_insts, + .gfx8_insts, + .gws, + .image_insts, + .int_clamp_insts, + .inv_2pi_inline_imm, + .localmemorysize65536, + .mad_mac_f32_insts, + .mimg_r128, + .movrel, + .s_memrealtime, + .s_memtime_inst, + .scalar_stores, + .sdwa, + .sdwa_mav, + .sdwa_out_mods_vopc, + .trig_reduced_range, + .unaligned_buffer_access, + .vgpr_index_mode, + .vmem_write_vgpr_in_order, + .wavefrontsize64, + }), + }; + result[@intFromEnum(Feature.vop3_literal)] = .{ + .llvm_name = "vop3-literal", + .description = "Can use one literal in VOP3", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vop3p)] = .{ + .llvm_name = "vop3p", + .description = "Has VOP3P packed instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vopd)] = .{ + .llvm_name = "vopd", + .description = "Has VOPD dual issue wave32 instructions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.vscnt)] = .{ + .llvm_name = "vscnt", + .description = "Has separate store vscnt counter", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.wavefrontsize16)] = .{ + .llvm_name = "wavefrontsize16", + .description = "The number of threads per wavefront", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.wavefrontsize32)] = .{ + .llvm_name = "wavefrontsize32", + .description = "The number of threads per wavefront", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.wavefrontsize64)] = .{ + .llvm_name = "wavefrontsize64", + .description = "The number of threads per wavefront", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.xnack)] = .{ + .llvm_name = "xnack", + .description = "Enable XNACK support", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.xnack_support)] = .{ + .llvm_name = "xnack-support", + .description = "Hardware supports XNACK", + .dependencies = featureSet(&[_]Feature{}), + }; + const ti = @typeInfo(Feature); + for (&result, 0..) |*elem, i| { + elem.index = i; + elem.name = ti.@"enum".fields[i].name; + } + break :blk result; +}; + +pub const cpu = struct { + pub const bonaire = CpuModel{ + .name = "bonaire", + .llvm_name = "bonaire", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sea_islands, + }), + }; + pub const carrizo = CpuModel{ + .name = "carrizo", + .llvm_name = "carrizo", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + .xnack_support, + }), + }; + pub const fiji = CpuModel{ + .name = "fiji", + .llvm_name = "fiji", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const generic = CpuModel{ + .name = "generic", + .llvm_name = "generic", + .features = featureSet(&[_]Feature{ + .gds, + .gws, + .wavefrontsize64, + }), + }; + pub const generic_hsa = CpuModel{ + .name = "generic_hsa", + .llvm_name = "generic-hsa", + .features = featureSet(&[_]Feature{ + .flat_address_space, + .gds, + .gws, + .wavefrontsize64, + }), + }; + pub const gfx1010 = CpuModel{ + .name = "gfx1010", + .llvm_name = "gfx1010", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .ds_src2_insts, + .flat_segment_offset_bug, + .get_wave_id_inst, + .gfx10, + .inst_fwd_prefetch_bug, + .lds_branch_vmem_war_hazard, + .lds_misaligned_bug, + .ldsbankcount32, + .mad_mac_f32_insts, + .negative_unaligned_scratch_offset_bug, + .nsa_clause_bug, + .nsa_encoding, + .nsa_to_vmem_bug, + .offset_3f_bug, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .smem_to_vector_write_hazard, + .vcmpx_exec_war_hazard, + .vcmpx_permlane_hazard, + .vmem_to_scalar_write_hazard, + .xnack_support, + }), + }; + pub const gfx1011 = CpuModel{ + .name = "gfx1011", + .llvm_name = "gfx1011", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .ds_src2_insts, + .flat_segment_offset_bug, + .get_wave_id_inst, + .gfx10, + .inst_fwd_prefetch_bug, + .lds_branch_vmem_war_hazard, + .lds_misaligned_bug, + .ldsbankcount32, + .mad_mac_f32_insts, + .negative_unaligned_scratch_offset_bug, + .nsa_clause_bug, + .nsa_encoding, + .nsa_to_vmem_bug, + .offset_3f_bug, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .smem_to_vector_write_hazard, + .vcmpx_exec_war_hazard, + .vcmpx_permlane_hazard, + .vmem_to_scalar_write_hazard, + .xnack_support, + }), + }; + pub const gfx1012 = CpuModel{ + .name = "gfx1012", + .llvm_name = "gfx1012", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .ds_src2_insts, + .flat_segment_offset_bug, + .get_wave_id_inst, + .gfx10, + .inst_fwd_prefetch_bug, + .lds_branch_vmem_war_hazard, + .lds_misaligned_bug, + .ldsbankcount32, + .mad_mac_f32_insts, + .negative_unaligned_scratch_offset_bug, + .nsa_clause_bug, + .nsa_encoding, + .nsa_to_vmem_bug, + .offset_3f_bug, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .smem_to_vector_write_hazard, + .vcmpx_exec_war_hazard, + .vcmpx_permlane_hazard, + .vmem_to_scalar_write_hazard, + .xnack_support, + }), + }; + pub const gfx1013 = CpuModel{ + .name = "gfx1013", + .llvm_name = "gfx1013", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .ds_src2_insts, + .flat_segment_offset_bug, + .get_wave_id_inst, + .gfx10, + .gfx10_a_encoding, + .inst_fwd_prefetch_bug, + .lds_branch_vmem_war_hazard, + .lds_misaligned_bug, + .ldsbankcount32, + .mad_mac_f32_insts, + .negative_unaligned_scratch_offset_bug, + .nsa_clause_bug, + .nsa_encoding, + .nsa_to_vmem_bug, + .offset_3f_bug, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .smem_to_vector_write_hazard, + .vcmpx_exec_war_hazard, + .vcmpx_permlane_hazard, + .vmem_to_scalar_write_hazard, + .xnack_support, + }), + }; + pub const gfx1030 = CpuModel{ + .name = "gfx1030", + .llvm_name = "gfx1030", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1031 = CpuModel{ + .name = "gfx1031", + .llvm_name = "gfx1031", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1032 = CpuModel{ + .name = "gfx1032", + .llvm_name = "gfx1032", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1033 = CpuModel{ + .name = "gfx1033", + .llvm_name = "gfx1033", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1034 = CpuModel{ + .name = "gfx1034", + .llvm_name = "gfx1034", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1035 = CpuModel{ + .name = "gfx1035", + .llvm_name = "gfx1035", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx1036 = CpuModel{ + .name = "gfx1036", + .llvm_name = "gfx1036", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .shader_cycles_register, + }), + }; + pub const gfx10_1_generic = CpuModel{ + .name = "gfx10_1_generic", + .llvm_name = "gfx10-1-generic", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .ds_src2_insts, + .flat_segment_offset_bug, + .get_wave_id_inst, + .gfx10, + .inst_fwd_prefetch_bug, + .lds_branch_vmem_war_hazard, + .lds_misaligned_bug, + .ldsbankcount32, + .mad_mac_f32_insts, + .negative_unaligned_scratch_offset_bug, + .nsa_clause_bug, + .nsa_encoding, + .nsa_to_vmem_bug, + .offset_3f_bug, + .requires_cov6, + .scalar_atomics, + .scalar_flat_scratch_insts, + .scalar_stores, + .smem_to_vector_write_hazard, + .vcmpx_exec_war_hazard, + .vcmpx_permlane_hazard, + .vmem_to_scalar_write_hazard, + .xnack_support, + }), + }; + pub const gfx10_3_generic = CpuModel{ + .name = "gfx10_3_generic", + .llvm_name = "gfx10-3-generic", + .features = featureSet(&[_]Feature{ + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .gfx10, + .gfx10_3_insts, + .gfx10_a_encoding, + .gfx10_b_encoding, + .ldsbankcount32, + .nsa_encoding, + .requires_cov6, + .shader_cycles_register, + }), + }; + pub const gfx1100 = CpuModel{ + .name = "gfx1100", + .llvm_name = "gfx1100", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .mad_intra_fwd_bug, + .memory_atomic_fadd_f32_denormal_support, + .msaa_load_dst_sel_bug, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .priv_enabled_trap2_nop_bug, + .shader_cycles_register, + .user_sgpr_init16_bug, + .valu_trans_use_hazard, + .vcmpx_permlane_hazard, + }), + }; + pub const gfx1101 = CpuModel{ + .name = "gfx1101", + .llvm_name = "gfx1101", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .mad_intra_fwd_bug, + .memory_atomic_fadd_f32_denormal_support, + .msaa_load_dst_sel_bug, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .priv_enabled_trap2_nop_bug, + .shader_cycles_register, + .valu_trans_use_hazard, + .vcmpx_permlane_hazard, + }), + }; + pub const gfx1102 = CpuModel{ + .name = "gfx1102", + .llvm_name = "gfx1102", + .features = featureSet(&[_]Feature{ + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .mad_intra_fwd_bug, + .memory_atomic_fadd_f32_denormal_support, + .msaa_load_dst_sel_bug, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .priv_enabled_trap2_nop_bug, + .shader_cycles_register, + .user_sgpr_init16_bug, + .valu_trans_use_hazard, + .vcmpx_permlane_hazard, + }), + }; + pub const gfx1103 = CpuModel{ + .name = "gfx1103", + .llvm_name = "gfx1103", + .features = featureSet(&[_]Feature{ + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .mad_intra_fwd_bug, + .memory_atomic_fadd_f32_denormal_support, + .msaa_load_dst_sel_bug, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .priv_enabled_trap2_nop_bug, + .shader_cycles_register, + .valu_trans_use_hazard, + .vcmpx_permlane_hazard, + }), + }; + pub const gfx1150 = CpuModel{ + .name = "gfx1150", + .llvm_name = "gfx1150", + .features = featureSet(&[_]Feature{ + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .required_export_priority, + .salu_float, + .shader_cycles_register, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx1151 = CpuModel{ + .name = "gfx1151", + .llvm_name = "gfx1151", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .required_export_priority, + .salu_float, + .shader_cycles_register, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx1152 = CpuModel{ + .name = "gfx1152", + .llvm_name = "gfx1152", + .features = featureSet(&[_]Feature{ + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .required_export_priority, + .salu_float, + .shader_cycles_register, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx11_generic = CpuModel{ + .name = "gfx11_generic", + .llvm_name = "gfx11-generic", + .features = featureSet(&[_]Feature{ + .architected_flat_scratch, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .dl_insts, + .dot10_insts, + .dot5_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .flat_atomic_fadd_f32_inst, + .gfx11, + .image_insts, + .ldsbankcount32, + .mad_intra_fwd_bug, + .memory_atomic_fadd_f32_denormal_support, + .msaa_load_dst_sel_bug, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .priv_enabled_trap2_nop_bug, + .required_export_priority, + .requires_cov6, + .shader_cycles_register, + .user_sgpr_init16_bug, + .valu_trans_use_hazard, + .vcmpx_permlane_hazard, + }), + }; + pub const gfx1200 = CpuModel{ + .name = "gfx1200", + .llvm_name = "gfx1200", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .architected_sgprs, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_buffer_pk_add_bf16_inst, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_global_pk_add_bf16_inst, + .dl_insts, + .dot10_insts, + .dot11_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .extended_image_insts, + .flat_atomic_fadd_f32_inst, + .fp8_conversion_insts, + .gfx12, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .pseudo_scalar_trans, + .restricted_soffset, + .salu_float, + .scalar_dwordx3_loads, + .shader_cycles_hi_lo_registers, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx1201 = CpuModel{ + .name = "gfx1201", + .llvm_name = "gfx1201", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .architected_sgprs, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_buffer_pk_add_bf16_inst, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_global_pk_add_bf16_inst, + .dl_insts, + .dot10_insts, + .dot11_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .extended_image_insts, + .flat_atomic_fadd_f32_inst, + .fp8_conversion_insts, + .gfx12, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .pseudo_scalar_trans, + .restricted_soffset, + .salu_float, + .scalar_dwordx3_loads, + .shader_cycles_hi_lo_registers, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx12_generic = CpuModel{ + .name = "gfx12_generic", + .llvm_name = "gfx12-generic", + .features = featureSet(&[_]Feature{ + .allocate1_5xvgprs, + .architected_flat_scratch, + .architected_sgprs, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_buffer_pk_add_bf16_inst, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_global_pk_add_bf16_inst, + .dl_insts, + .dot10_insts, + .dot11_insts, + .dot7_insts, + .dot8_insts, + .dot9_insts, + .dpp_src1_sgpr, + .extended_image_insts, + .flat_atomic_fadd_f32_inst, + .fp8_conversion_insts, + .gfx12, + .image_insts, + .ldsbankcount32, + .memory_atomic_fadd_f32_denormal_support, + .nsa_encoding, + .packed_tid, + .partial_nsa_encoding, + .pseudo_scalar_trans, + .requires_cov6, + .restricted_soffset, + .salu_float, + .scalar_dwordx3_loads, + .shader_cycles_hi_lo_registers, + .vcmpx_permlane_hazard, + .vgpr_singleuse_hint, + }), + }; + pub const gfx600 = CpuModel{ + .name = "gfx600", + .llvm_name = "gfx600", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .southern_islands, + }), + }; + pub const gfx601 = CpuModel{ + .name = "gfx601", + .llvm_name = "gfx601", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; + pub const gfx602 = CpuModel{ + .name = "gfx602", + .llvm_name = "gfx602", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; + pub const gfx700 = CpuModel{ + .name = "gfx700", + .llvm_name = "gfx700", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sea_islands, + }), + }; + pub const gfx701 = CpuModel{ + .name = "gfx701", + .llvm_name = "gfx701", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .ldsbankcount32, + .sea_islands, + }), + }; + pub const gfx702 = CpuModel{ + .name = "gfx702", + .llvm_name = "gfx702", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .ldsbankcount16, + .sea_islands, + }), + }; + pub const gfx703 = CpuModel{ + .name = "gfx703", + .llvm_name = "gfx703", + .features = featureSet(&[_]Feature{ + .ldsbankcount16, + .sea_islands, + }), + }; + pub const gfx704 = CpuModel{ + .name = "gfx704", + .llvm_name = "gfx704", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sea_islands, + }), + }; + pub const gfx705 = CpuModel{ + .name = "gfx705", + .llvm_name = "gfx705", + .features = featureSet(&[_]Feature{ + .ldsbankcount16, + .sea_islands, + }), + }; + pub const gfx801 = CpuModel{ + .name = "gfx801", + .llvm_name = "gfx801", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + .xnack_support, + }), + }; + pub const gfx802 = CpuModel{ + .name = "gfx802", + .llvm_name = "gfx802", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sgpr_init_bug, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const gfx803 = CpuModel{ + .name = "gfx803", + .llvm_name = "gfx803", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const gfx805 = CpuModel{ + .name = "gfx805", + .llvm_name = "gfx805", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sgpr_init_bug, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const gfx810 = CpuModel{ + .name = "gfx810", + .llvm_name = "gfx810", + .features = featureSet(&[_]Feature{ + .image_gather4_d16_bug, + .image_store_d16_bug, + .ldsbankcount16, + .volcanic_islands, + .xnack_support, + }), + }; + pub const gfx900 = CpuModel{ + .name = "gfx900", + .llvm_name = "gfx900", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .mad_mix_insts, + }), + }; + pub const gfx902 = CpuModel{ + .name = "gfx902", + .llvm_name = "gfx902", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .mad_mix_insts, + }), + }; + pub const gfx904 = CpuModel{ + .name = "gfx904", + .llvm_name = "gfx904", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .fma_mix_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + }), + }; + pub const gfx906 = CpuModel{ + .name = "gfx906", + .llvm_name = "gfx906", + .features = featureSet(&[_]Feature{ + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot7_insts, + .ds_src2_insts, + .extended_image_insts, + .fma_mix_insts, + .gds, + .gfx9, + .half_rate_64_ops, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .sramecc_support, + }), + }; + pub const gfx908 = CpuModel{ + .name = "gfx908", + .llvm_name = "gfx908", + .features = featureSet(&[_]Feature{ + .atomic_buffer_global_pk_add_f16_no_rtn_insts, + .atomic_fadd_no_rtn_insts, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot3_insts, + .dot4_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .ds_src2_insts, + .extended_image_insts, + .fma_mix_insts, + .gds, + .gfx9, + .half_rate_64_ops, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .mai_insts, + .mfma_inline_literal_bug, + .pk_fmac_f16_inst, + .sramecc_support, + }), + }; + pub const gfx909 = CpuModel{ + .name = "gfx909", + .llvm_name = "gfx909", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .mad_mix_insts, + }), + }; + pub const gfx90a = CpuModel{ + .name = "gfx90a", + .llvm_name = "gfx90a", + .features = featureSet(&[_]Feature{ + .atomic_buffer_global_pk_add_f16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f64, + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot3_insts, + .dot4_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .dpp_64bit, + .flat_buffer_global_fadd_f64_inst, + .fma_mix_insts, + .fmacf64_inst, + .full_rate_64_ops, + .gfx9, + .gfx90a_insts, + .image_insts, + .kernarg_preload, + .ldsbankcount32, + .mad_mac_f32_insts, + .mai_insts, + .packed_fp32_ops, + .packed_tid, + .pk_fmac_f16_inst, + .sramecc_support, + }), + }; + pub const gfx90c = CpuModel{ + .name = "gfx90c", + .llvm_name = "gfx90c", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .mad_mix_insts, + }), + }; + pub const gfx940 = CpuModel{ + .name = "gfx940", + .llvm_name = "gfx940", + .features = featureSet(&[_]Feature{ + .agent_scope_fine_grained_remote_memory_atomics, + .architected_flat_scratch, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f64, + .atomic_global_pk_add_bf16_inst, + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot3_insts, + .dot4_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .dpp_64bit, + .flat_atomic_fadd_f32_inst, + .flat_buffer_global_fadd_f64_inst, + .fma_mix_insts, + .fmacf64_inst, + .force_store_sc0_sc1, + .fp8_conversion_insts, + .fp8_insts, + .full_rate_64_ops, + .gfx9, + .gfx90a_insts, + .gfx940_insts, + .kernarg_preload, + .ldsbankcount32, + .mai_insts, + .memory_atomic_fadd_f32_denormal_support, + .packed_fp32_ops, + .packed_tid, + .pk_fmac_f16_inst, + .sramecc_support, + }), + }; + pub const gfx941 = CpuModel{ + .name = "gfx941", + .llvm_name = "gfx941", + .features = featureSet(&[_]Feature{ + .agent_scope_fine_grained_remote_memory_atomics, + .architected_flat_scratch, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f64, + .atomic_global_pk_add_bf16_inst, + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot3_insts, + .dot4_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .dpp_64bit, + .flat_atomic_fadd_f32_inst, + .flat_buffer_global_fadd_f64_inst, + .fma_mix_insts, + .fmacf64_inst, + .force_store_sc0_sc1, + .fp8_conversion_insts, + .fp8_insts, + .full_rate_64_ops, + .gfx9, + .gfx90a_insts, + .gfx940_insts, + .kernarg_preload, + .ldsbankcount32, + .mai_insts, + .memory_atomic_fadd_f32_denormal_support, + .packed_fp32_ops, + .packed_tid, + .pk_fmac_f16_inst, + .sramecc_support, + }), + }; + pub const gfx942 = CpuModel{ + .name = "gfx942", + .llvm_name = "gfx942", + .features = featureSet(&[_]Feature{ + .agent_scope_fine_grained_remote_memory_atomics, + .architected_flat_scratch, + .atomic_buffer_global_pk_add_f16_insts, + .atomic_ds_pk_add_16_insts, + .atomic_fadd_no_rtn_insts, + .atomic_fadd_rtn_insts, + .atomic_flat_pk_add_16_insts, + .atomic_fmin_fmax_flat_f64, + .atomic_fmin_fmax_global_f64, + .atomic_global_pk_add_bf16_inst, + .back_off_barrier, + .dl_insts, + .dot10_insts, + .dot1_insts, + .dot2_insts, + .dot3_insts, + .dot4_insts, + .dot5_insts, + .dot6_insts, + .dot7_insts, + .dpp_64bit, + .flat_atomic_fadd_f32_inst, + .flat_buffer_global_fadd_f64_inst, + .fma_mix_insts, + .fmacf64_inst, + .fp8_conversion_insts, + .fp8_insts, + .full_rate_64_ops, + .gfx9, + .gfx90a_insts, + .gfx940_insts, + .kernarg_preload, + .ldsbankcount32, + .mai_insts, + .memory_atomic_fadd_f32_denormal_support, + .packed_fp32_ops, + .packed_tid, + .pk_fmac_f16_inst, + .sramecc_support, + }), + }; + pub const gfx9_generic = CpuModel{ + .name = "gfx9_generic", + .llvm_name = "gfx9-generic", + .features = featureSet(&[_]Feature{ + .ds_src2_insts, + .extended_image_insts, + .gds, + .gfx9, + .image_gather4_d16_bug, + .image_insts, + .ldsbankcount32, + .mad_mac_f32_insts, + .requires_cov6, + }), + }; + pub const hainan = CpuModel{ + .name = "hainan", + .llvm_name = "hainan", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; + pub const hawaii = CpuModel{ + .name = "hawaii", + .llvm_name = "hawaii", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .ldsbankcount32, + .sea_islands, + }), + }; + pub const iceland = CpuModel{ + .name = "iceland", + .llvm_name = "iceland", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sgpr_init_bug, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const kabini = CpuModel{ + .name = "kabini", + .llvm_name = "kabini", + .features = featureSet(&[_]Feature{ + .ldsbankcount16, + .sea_islands, + }), + }; + pub const kaveri = CpuModel{ + .name = "kaveri", + .llvm_name = "kaveri", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sea_islands, + }), + }; + pub const mullins = CpuModel{ + .name = "mullins", + .llvm_name = "mullins", + .features = featureSet(&[_]Feature{ + .ldsbankcount16, + .sea_islands, + }), + }; + pub const oland = CpuModel{ + .name = "oland", + .llvm_name = "oland", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; + pub const pitcairn = CpuModel{ + .name = "pitcairn", + .llvm_name = "pitcairn", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; + pub const polaris10 = CpuModel{ + .name = "polaris10", + .llvm_name = "polaris10", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const polaris11 = CpuModel{ + .name = "polaris11", + .llvm_name = "polaris11", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const stoney = CpuModel{ + .name = "stoney", + .llvm_name = "stoney", + .features = featureSet(&[_]Feature{ + .image_gather4_d16_bug, + .image_store_d16_bug, + .ldsbankcount16, + .volcanic_islands, + .xnack_support, + }), + }; + pub const tahiti = CpuModel{ + .name = "tahiti", + .llvm_name = "tahiti", + .features = featureSet(&[_]Feature{ + .fast_fmaf, + .half_rate_64_ops, + .southern_islands, + }), + }; + pub const tonga = CpuModel{ + .name = "tonga", + .llvm_name = "tonga", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sgpr_init_bug, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const tongapro = CpuModel{ + .name = "tongapro", + .llvm_name = "tongapro", + .features = featureSet(&[_]Feature{ + .ldsbankcount32, + .sgpr_init_bug, + .unpacked_d16_vmem, + .volcanic_islands, + }), + }; + pub const verde = CpuModel{ + .name = "verde", + .llvm_name = "verde", + .features = featureSet(&[_]Feature{ + .southern_islands, + }), + }; +}; diff --git a/lib/std/Target/amdgpu.zig b/lib/std/Target/amdgpu.zig deleted file mode 100644 index a12e1b0c0bf18706eb71942e738dca9d837207c3..0000000000000000000000000000000000000000 --- a/lib/std/Target/amdgpu.zig +++ /dev/null @@ -1,2728 +0,0 @@ -//! This file is auto-generated by tools/update_cpu_features.zig. - -const std = @import("../std.zig"); -const CpuFeature = std.Target.Cpu.Feature; -const CpuModel = std.Target.Cpu.Model; - -pub const Feature = enum { - @"16_bit_insts", - a16, - add_no_carry_insts, - agent_scope_fine_grained_remote_memory_atomics, - allocate1_5xvgprs, - aperture_regs, - architected_flat_scratch, - architected_sgprs, - atomic_buffer_global_pk_add_f16_insts, - atomic_buffer_global_pk_add_f16_no_rtn_insts, - atomic_buffer_pk_add_bf16_inst, - atomic_csub_no_rtn_insts, - atomic_ds_pk_add_16_insts, - atomic_fadd_no_rtn_insts, - atomic_fadd_rtn_insts, - atomic_flat_pk_add_16_insts, - atomic_fmin_fmax_flat_f32, - atomic_fmin_fmax_flat_f64, - atomic_fmin_fmax_global_f32, - atomic_fmin_fmax_global_f64, - atomic_global_pk_add_bf16_inst, - auto_waitcnt_before_barrier, - back_off_barrier, - ci_insts, - cumode, - default_component_broadcast, - default_component_zero, - dl_insts, - dot10_insts, - dot11_insts, - dot1_insts, - dot2_insts, - dot3_insts, - dot4_insts, - dot5_insts, - dot6_insts, - dot7_insts, - dot8_insts, - dot9_insts, - dpp, - dpp8, - dpp_64bit, - dpp_src1_sgpr, - ds128, - ds_src2_insts, - extended_image_insts, - fast_denormal_f32, - fast_fmaf, - flat_address_space, - flat_atomic_fadd_f32_inst, - flat_buffer_global_fadd_f64_inst, - flat_for_global, - flat_global_insts, - flat_inst_offsets, - flat_scratch, - flat_scratch_insts, - flat_segment_offset_bug, - fma_mix_insts, - fmacf64_inst, - fmaf, - force_store_sc0_sc1, - fp64, - fp8_conversion_insts, - fp8_insts, - full_rate_64_ops, - g16, - gcn3_encoding, - gds, - get_wave_id_inst, - gfx10, - gfx10_3_insts, - gfx10_a_encoding, - gfx10_b_encoding, - gfx10_insts, - gfx11, - gfx11_insts, - gfx12, - gfx12_insts, - gfx7_gfx8_gfx9_insts, - gfx8_insts, - gfx9, - gfx90a_insts, - gfx940_insts, - gfx9_insts, - gws, - half_rate_64_ops, - image_gather4_d16_bug, - image_insts, - image_store_d16_bug, - inst_fwd_prefetch_bug, - int_clamp_insts, - inv_2pi_inline_imm, - kernarg_preload, - lds_branch_vmem_war_hazard, - lds_misaligned_bug, - ldsbankcount16, - ldsbankcount32, - load_store_opt, - localmemorysize32768, - localmemorysize65536, - mad_intra_fwd_bug, - mad_mac_f32_insts, - mad_mix_insts, - mai_insts, - max_hard_clause_length_32, - max_hard_clause_length_63, - max_private_element_size_16, - max_private_element_size_4, - max_private_element_size_8, - memory_atomic_fadd_f32_denormal_support, - mfma_inline_literal_bug, - mimg_r128, - movrel, - msaa_load_dst_sel_bug, - negative_scratch_offset_bug, - negative_unaligned_scratch_offset_bug, - no_data_dep_hazard, - no_sdst_cmpx, - nsa_clause_bug, - nsa_encoding, - nsa_to_vmem_bug, - offset_3f_bug, - packed_fp32_ops, - packed_tid, - partial_nsa_encoding, - pk_fmac_f16_inst, - precise_memory, - priv_enabled_trap2_nop_bug, - promote_alloca, - prt_strict_null, - pseudo_scalar_trans, - r128_a16, - real_true16, - required_export_priority, - requires_cov6, - restricted_soffset, - s_memrealtime, - s_memtime_inst, - salu_float, - scalar_atomics, - scalar_dwordx3_loads, - scalar_flat_scratch_insts, - scalar_stores, - sdwa, - sdwa_mav, - sdwa_omod, - sdwa_out_mods_vopc, - sdwa_scalar, - sdwa_sdst, - sea_islands, - sgpr_init_bug, - shader_cycles_hi_lo_registers, - shader_cycles_register, - si_scheduler, - smem_to_vector_write_hazard, - southern_islands, - sramecc, - sramecc_support, - tgsplit, - trap_handler, - trig_reduced_range, - true16, - unaligned_access_mode, - unaligned_buffer_access, - unaligned_ds_access, - unaligned_scratch_access, - unpacked_d16_vmem, - unsafe_ds_offset_folding, - user_sgpr_init16_bug, - valu_trans_use_hazard, - vcmpx_exec_war_hazard, - vcmpx_permlane_hazard, - vgpr_index_mode, - vgpr_singleuse_hint, - vmem_to_scalar_write_hazard, - vmem_write_vgpr_in_order, - volcanic_islands, - vop3_literal, - vop3p, - vopd, - vscnt, - wavefrontsize16, - wavefrontsize32, - wavefrontsize64, - xnack, - xnack_support, -}; - -pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet; -pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas; -pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny; -pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll; - -pub const all_features = blk: { - const len = @typeInfo(Feature).@"enum".fields.len; - std.debug.assert(len <= CpuFeature.Set.needed_bit_count); - var result: [len]CpuFeature = undefined; - result[@intFromEnum(Feature.@"16_bit_insts")] = .{ - .llvm_name = "16-bit-insts", - .description = "Has i16/f16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.a16)] = .{ - .llvm_name = "a16", - .description = "Support A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.add_no_carry_insts)] = .{ - .llvm_name = "add-no-carry-insts", - .description = "Have VALU add/sub instructions without carry out", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.agent_scope_fine_grained_remote_memory_atomics)] = .{ - .llvm_name = "agent-scope-fine-grained-remote-memory-atomics", - .description = "Agent (device) scoped atomic operations, excluding those directly supported by PCIe (i.e. integer atomic add, exchange, and compare-and-swap), are functional for allocations in host or peer device memory.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.allocate1_5xvgprs)] = .{ - .llvm_name = "allocate1_5xvgprs", - .description = "Has 50% more physical VGPRs and 50% larger allocation granule", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.aperture_regs)] = .{ - .llvm_name = "aperture-regs", - .description = "Has Memory Aperture Base and Size Registers", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.architected_flat_scratch)] = .{ - .llvm_name = "architected-flat-scratch", - .description = "Flat Scratch register is a readonly SPI initialized architected register", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.architected_sgprs)] = .{ - .llvm_name = "architected-sgprs", - .description = "Enable the architected SGPRs", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_insts)] = .{ - .llvm_name = "atomic-buffer-global-pk-add-f16-insts", - .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that can return original value", - .dependencies = featureSet(&[_]Feature{ - .flat_global_insts, - }), - }; - result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_no_rtn_insts)] = .{ - .llvm_name = "atomic-buffer-global-pk-add-f16-no-rtn-insts", - .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that don't return original value", - .dependencies = featureSet(&[_]Feature{ - .flat_global_insts, - }), - }; - result[@intFromEnum(Feature.atomic_buffer_pk_add_bf16_inst)] = .{ - .llvm_name = "atomic-buffer-pk-add-bf16-inst", - .description = "Has buffer_atomic_pk_add_bf16 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_csub_no_rtn_insts)] = .{ - .llvm_name = "atomic-csub-no-rtn-insts", - .description = "Has buffer_atomic_csub and global_atomic_csub instructions that don't return original value", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_ds_pk_add_16_insts)] = .{ - .llvm_name = "atomic-ds-pk-add-16-insts", - .description = "Has ds_pk_add_bf16, ds_pk_add_f16, ds_pk_add_rtn_bf16, ds_pk_add_rtn_f16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_fadd_no_rtn_insts)] = .{ - .llvm_name = "atomic-fadd-no-rtn-insts", - .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that don't return original value", - .dependencies = featureSet(&[_]Feature{ - .flat_global_insts, - }), - }; - result[@intFromEnum(Feature.atomic_fadd_rtn_insts)] = .{ - .llvm_name = "atomic-fadd-rtn-insts", - .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that return original value", - .dependencies = featureSet(&[_]Feature{ - .flat_global_insts, - }), - }; - result[@intFromEnum(Feature.atomic_flat_pk_add_16_insts)] = .{ - .llvm_name = "atomic-flat-pk-add-16-insts", - .description = "Has flat_atomic_pk_add_f16 and flat_atomic_pk_add_bf16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_fmin_fmax_flat_f32)] = .{ - .llvm_name = "atomic-fmin-fmax-flat-f32", - .description = "Has flat memory instructions for atomicrmw fmin/fmax for float", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_fmin_fmax_flat_f64)] = .{ - .llvm_name = "atomic-fmin-fmax-flat-f64", - .description = "Has flat memory instructions for atomicrmw fmin/fmax for double", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_fmin_fmax_global_f32)] = .{ - .llvm_name = "atomic-fmin-fmax-global-f32", - .description = "Has global/buffer instructions for atomicrmw fmin/fmax for float", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_fmin_fmax_global_f64)] = .{ - .llvm_name = "atomic-fmin-fmax-global-f64", - .description = "Has global/buffer instructions for atomicrmw fmin/fmax for float", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.atomic_global_pk_add_bf16_inst)] = .{ - .llvm_name = "atomic-global-pk-add-bf16-inst", - .description = "Has global_atomic_pk_add_bf16 instruction", - .dependencies = featureSet(&[_]Feature{ - .flat_global_insts, - }), - }; - result[@intFromEnum(Feature.auto_waitcnt_before_barrier)] = .{ - .llvm_name = "auto-waitcnt-before-barrier", - .description = "Hardware automatically inserts waitcnt before barrier", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.back_off_barrier)] = .{ - .llvm_name = "back-off-barrier", - .description = "Hardware supports backing off s_barrier if an exception occurs", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.ci_insts)] = .{ - .llvm_name = "ci-insts", - .description = "Additional instructions for CI+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.cumode)] = .{ - .llvm_name = "cumode", - .description = "Enable CU wavefront execution mode", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.default_component_broadcast)] = .{ - .llvm_name = "default-component-broadcast", - .description = "BUFFER/IMAGE store instructions set unspecified components to x component (GFX12)", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.default_component_zero)] = .{ - .llvm_name = "default-component-zero", - .description = "BUFFER/IMAGE store instructions set unspecified components to zero (before GFX12)", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dl_insts)] = .{ - .llvm_name = "dl-insts", - .description = "Has v_fmac_f32 and v_xnor_b32 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot10_insts)] = .{ - .llvm_name = "dot10-insts", - .description = "Has v_dot2_f32_f16 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot11_insts)] = .{ - .llvm_name = "dot11-insts", - .description = "Has v_dot4_f32_fp8_fp8, v_dot4_f32_fp8_bf8, v_dot4_f32_bf8_fp8, v_dot4_f32_bf8_bf8 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot1_insts)] = .{ - .llvm_name = "dot1-insts", - .description = "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot2_insts)] = .{ - .llvm_name = "dot2-insts", - .description = "Has v_dot2_i32_i16, v_dot2_u32_u16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot3_insts)] = .{ - .llvm_name = "dot3-insts", - .description = "Has v_dot8c_i32_i4 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot4_insts)] = .{ - .llvm_name = "dot4-insts", - .description = "Has v_dot2c_i32_i16 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot5_insts)] = .{ - .llvm_name = "dot5-insts", - .description = "Has v_dot2c_f32_f16 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot6_insts)] = .{ - .llvm_name = "dot6-insts", - .description = "Has v_dot4c_i32_i8 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot7_insts)] = .{ - .llvm_name = "dot7-insts", - .description = "Has v_dot4_u32_u8, v_dot8_u32_u4 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot8_insts)] = .{ - .llvm_name = "dot8-insts", - .description = "Has v_dot4_i32_iu8, v_dot8_i32_iu4 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dot9_insts)] = .{ - .llvm_name = "dot9-insts", - .description = "Has v_dot2_f16_f16, v_dot2_bf16_bf16, v_dot2_f32_bf16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dpp)] = .{ - .llvm_name = "dpp", - .description = "Support DPP (Data Parallel Primitives) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dpp8)] = .{ - .llvm_name = "dpp8", - .description = "Support DPP8 (Data Parallel Primitives) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dpp_64bit)] = .{ - .llvm_name = "dpp-64bit", - .description = "Support DPP (Data Parallel Primitives) extension in DP ALU", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.dpp_src1_sgpr)] = .{ - .llvm_name = "dpp-src1-sgpr", - .description = "Support SGPR for Src1 of DPP instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.ds128)] = .{ - .llvm_name = "enable-ds128", - .description = "Use ds_{read|write}_b128", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.ds_src2_insts)] = .{ - .llvm_name = "ds-src2-insts", - .description = "Has ds_*_src2 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.extended_image_insts)] = .{ - .llvm_name = "extended-image-insts", - .description = "Support mips != 0, lod != 0, gather4, and get_lod", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fast_denormal_f32)] = .{ - .llvm_name = "fast-denormal-f32", - .description = "Enabling denormals does not cause f32 instructions to run at f64 rates", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fast_fmaf)] = .{ - .llvm_name = "fast-fmaf", - .description = "Assuming f32 fma is at least as fast as mul + add", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_address_space)] = .{ - .llvm_name = "flat-address-space", - .description = "Support flat address space", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_atomic_fadd_f32_inst)] = .{ - .llvm_name = "flat-atomic-fadd-f32-inst", - .description = "Has flat_atomic_add_f32 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_buffer_global_fadd_f64_inst)] = .{ - .llvm_name = "flat-buffer-global-fadd-f64-inst", - .description = "Has flat, buffer, and global instructions for f64 atomic fadd", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_for_global)] = .{ - .llvm_name = "flat-for-global", - .description = "Force to generate flat instruction for global", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_global_insts)] = .{ - .llvm_name = "flat-global-insts", - .description = "Have global_* flat memory instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_inst_offsets)] = .{ - .llvm_name = "flat-inst-offsets", - .description = "Flat instructions have immediate offset addressing mode", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_scratch)] = .{ - .llvm_name = "enable-flat-scratch", - .description = "Use scratch_* flat memory instructions to access scratch", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_scratch_insts)] = .{ - .llvm_name = "flat-scratch-insts", - .description = "Have scratch_* flat memory instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.flat_segment_offset_bug)] = .{ - .llvm_name = "flat-segment-offset-bug", - .description = "GFX10 bug where inst_offset is ignored when flat instructions access global memory", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fma_mix_insts)] = .{ - .llvm_name = "fma-mix-insts", - .description = "Has v_fma_mix_f32, v_fma_mixlo_f16, v_fma_mixhi_f16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fmacf64_inst)] = .{ - .llvm_name = "fmacf64-inst", - .description = "Has v_fmac_f64 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fmaf)] = .{ - .llvm_name = "fmaf", - .description = "Enable single precision FMA (not as fast as mul+add, but fused)", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.force_store_sc0_sc1)] = .{ - .llvm_name = "force-store-sc0-sc1", - .description = "Has SC0 and SC1 on stores", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fp64)] = .{ - .llvm_name = "fp64", - .description = "Enable double precision operations", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fp8_conversion_insts)] = .{ - .llvm_name = "fp8-conversion-insts", - .description = "Has fp8 and bf8 conversion instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.fp8_insts)] = .{ - .llvm_name = "fp8-insts", - .description = "Has fp8 and bf8 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.full_rate_64_ops)] = .{ - .llvm_name = "full-rate-64-ops", - .description = "Most fp64 instructions are full rate", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.g16)] = .{ - .llvm_name = "g16", - .description = "Support G16 for 16-bit gradient image operands", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gcn3_encoding)] = .{ - .llvm_name = "gcn3-encoding", - .description = "Encoding format for VI", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gds)] = .{ - .llvm_name = "gds", - .description = "Has Global Data Share", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.get_wave_id_inst)] = .{ - .llvm_name = "get-wave-id-inst", - .description = "Has s_get_waveid_in_workgroup instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx10)] = .{ - .llvm_name = "gfx10", - .description = "GFX10 GPU generation", - .dependencies = featureSet(&[_]Feature{ - .@"16_bit_insts", - .a16, - .add_no_carry_insts, - .aperture_regs, - .atomic_fmin_fmax_flat_f32, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f32, - .atomic_fmin_fmax_global_f64, - .ci_insts, - .default_component_zero, - .dpp, - .dpp8, - .extended_image_insts, - .fast_denormal_f32, - .fast_fmaf, - .flat_address_space, - .flat_global_insts, - .flat_inst_offsets, - .flat_scratch_insts, - .fma_mix_insts, - .fp64, - .g16, - .gds, - .gfx10_insts, - .gfx8_insts, - .gfx9_insts, - .gws, - .image_insts, - .int_clamp_insts, - .inv_2pi_inline_imm, - .localmemorysize65536, - .max_hard_clause_length_63, - .mimg_r128, - .movrel, - .no_data_dep_hazard, - .no_sdst_cmpx, - .pk_fmac_f16_inst, - .s_memrealtime, - .s_memtime_inst, - .sdwa, - .sdwa_omod, - .sdwa_scalar, - .sdwa_sdst, - .unaligned_buffer_access, - .unaligned_ds_access, - .vmem_write_vgpr_in_order, - .vop3_literal, - .vop3p, - .vscnt, - }), - }; - result[@intFromEnum(Feature.gfx10_3_insts)] = .{ - .llvm_name = "gfx10-3-insts", - .description = "Additional instructions for GFX10.3", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx10_a_encoding)] = .{ - .llvm_name = "gfx10_a-encoding", - .description = "Has BVH ray tracing instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx10_b_encoding)] = .{ - .llvm_name = "gfx10_b-encoding", - .description = "Encoding format GFX10_B", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx10_insts)] = .{ - .llvm_name = "gfx10-insts", - .description = "Additional instructions for GFX10+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx11)] = .{ - .llvm_name = "gfx11", - .description = "GFX11 GPU generation", - .dependencies = featureSet(&[_]Feature{ - .@"16_bit_insts", - .a16, - .add_no_carry_insts, - .aperture_regs, - .atomic_fmin_fmax_flat_f32, - .atomic_fmin_fmax_global_f32, - .ci_insts, - .default_component_zero, - .dpp, - .dpp8, - .extended_image_insts, - .fast_denormal_f32, - .fast_fmaf, - .flat_address_space, - .flat_global_insts, - .flat_inst_offsets, - .flat_scratch_insts, - .fma_mix_insts, - .fp64, - .g16, - .gds, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .gfx10_insts, - .gfx11_insts, - .gfx8_insts, - .gfx9_insts, - .gws, - .int_clamp_insts, - .inv_2pi_inline_imm, - .localmemorysize65536, - .max_hard_clause_length_32, - .mimg_r128, - .movrel, - .no_data_dep_hazard, - .no_sdst_cmpx, - .pk_fmac_f16_inst, - .true16, - .unaligned_buffer_access, - .unaligned_ds_access, - .vmem_write_vgpr_in_order, - .vop3_literal, - .vop3p, - .vopd, - .vscnt, - }), - }; - result[@intFromEnum(Feature.gfx11_insts)] = .{ - .llvm_name = "gfx11-insts", - .description = "Additional instructions for GFX11+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx12)] = .{ - .llvm_name = "gfx12", - .description = "GFX12 GPU generation", - .dependencies = featureSet(&[_]Feature{ - .@"16_bit_insts", - .a16, - .add_no_carry_insts, - .agent_scope_fine_grained_remote_memory_atomics, - .aperture_regs, - .atomic_fmin_fmax_flat_f32, - .atomic_fmin_fmax_global_f32, - .ci_insts, - .default_component_broadcast, - .dpp, - .dpp8, - .fast_denormal_f32, - .fast_fmaf, - .flat_address_space, - .flat_global_insts, - .flat_inst_offsets, - .flat_scratch_insts, - .fma_mix_insts, - .fp64, - .g16, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .gfx10_insts, - .gfx11_insts, - .gfx12_insts, - .gfx8_insts, - .gfx9_insts, - .int_clamp_insts, - .inv_2pi_inline_imm, - .localmemorysize65536, - .max_hard_clause_length_32, - .mimg_r128, - .movrel, - .no_data_dep_hazard, - .no_sdst_cmpx, - .pk_fmac_f16_inst, - .true16, - .unaligned_buffer_access, - .unaligned_ds_access, - .vop3_literal, - .vop3p, - .vopd, - .vscnt, - }), - }; - result[@intFromEnum(Feature.gfx12_insts)] = .{ - .llvm_name = "gfx12-insts", - .description = "Additional instructions for GFX12+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx7_gfx8_gfx9_insts)] = .{ - .llvm_name = "gfx7-gfx8-gfx9-insts", - .description = "Instructions shared in GFX7, GFX8, GFX9", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx8_insts)] = .{ - .llvm_name = "gfx8-insts", - .description = "Additional instructions for GFX8+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx9)] = .{ - .llvm_name = "gfx9", - .description = "GFX9 GPU generation", - .dependencies = featureSet(&[_]Feature{ - .@"16_bit_insts", - .a16, - .add_no_carry_insts, - .aperture_regs, - .ci_insts, - .default_component_zero, - .dpp, - .fast_denormal_f32, - .fast_fmaf, - .flat_address_space, - .flat_global_insts, - .flat_inst_offsets, - .flat_scratch_insts, - .fp64, - .gcn3_encoding, - .gfx7_gfx8_gfx9_insts, - .gfx8_insts, - .gfx9_insts, - .gws, - .int_clamp_insts, - .inv_2pi_inline_imm, - .localmemorysize65536, - .negative_scratch_offset_bug, - .r128_a16, - .s_memrealtime, - .s_memtime_inst, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .sdwa, - .sdwa_omod, - .sdwa_scalar, - .sdwa_sdst, - .unaligned_buffer_access, - .unaligned_ds_access, - .vgpr_index_mode, - .vmem_write_vgpr_in_order, - .vop3p, - .wavefrontsize64, - .xnack_support, - }), - }; - result[@intFromEnum(Feature.gfx90a_insts)] = .{ - .llvm_name = "gfx90a-insts", - .description = "Additional instructions for GFX90A+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx940_insts)] = .{ - .llvm_name = "gfx940-insts", - .description = "Additional instructions for GFX940+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gfx9_insts)] = .{ - .llvm_name = "gfx9-insts", - .description = "Additional instructions for GFX9+", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.gws)] = .{ - .llvm_name = "gws", - .description = "Has Global Wave Sync", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.half_rate_64_ops)] = .{ - .llvm_name = "half-rate-64-ops", - .description = "Most fp64 instructions are half rate instead of quarter", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.image_gather4_d16_bug)] = .{ - .llvm_name = "image-gather4-d16-bug", - .description = "Image Gather4 D16 hardware bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.image_insts)] = .{ - .llvm_name = "image-insts", - .description = "Support image instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.image_store_d16_bug)] = .{ - .llvm_name = "image-store-d16-bug", - .description = "Image Store D16 hardware bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.inst_fwd_prefetch_bug)] = .{ - .llvm_name = "inst-fwd-prefetch-bug", - .description = "S_INST_PREFETCH instruction causes shader to hang", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.int_clamp_insts)] = .{ - .llvm_name = "int-clamp-insts", - .description = "Support clamp for integer destination", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.inv_2pi_inline_imm)] = .{ - .llvm_name = "inv-2pi-inline-imm", - .description = "Has 1 / (2 * pi) as inline immediate", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.kernarg_preload)] = .{ - .llvm_name = "kernarg-preload", - .description = "Hardware supports preloading of kernel arguments in user SGPRs.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.lds_branch_vmem_war_hazard)] = .{ - .llvm_name = "lds-branch-vmem-war-hazard", - .description = "Switching between LDS and VMEM-tex not waiting VM_VSRC=0", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.lds_misaligned_bug)] = .{ - .llvm_name = "lds-misaligned-bug", - .description = "Some GFX10 bug with multi-dword LDS and flat access that is not naturally aligned in WGP mode", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.ldsbankcount16)] = .{ - .llvm_name = "ldsbankcount16", - .description = "The number of LDS banks per compute unit.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.ldsbankcount32)] = .{ - .llvm_name = "ldsbankcount32", - .description = "The number of LDS banks per compute unit.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.load_store_opt)] = .{ - .llvm_name = "load-store-opt", - .description = "Enable SI load/store optimizer pass", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.localmemorysize32768)] = .{ - .llvm_name = "localmemorysize32768", - .description = "The size of local memory in bytes", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.localmemorysize65536)] = .{ - .llvm_name = "localmemorysize65536", - .description = "The size of local memory in bytes", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mad_intra_fwd_bug)] = .{ - .llvm_name = "mad-intra-fwd-bug", - .description = "MAD_U64/I64 intra instruction forwarding bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mad_mac_f32_insts)] = .{ - .llvm_name = "mad-mac-f32-insts", - .description = "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mad_mix_insts)] = .{ - .llvm_name = "mad-mix-insts", - .description = "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mai_insts)] = .{ - .llvm_name = "mai-insts", - .description = "Has mAI instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.max_hard_clause_length_32)] = .{ - .llvm_name = "max-hard-clause-length-32", - .description = "Maximum number of instructions in an explicit S_CLAUSE is 32", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.max_hard_clause_length_63)] = .{ - .llvm_name = "max-hard-clause-length-63", - .description = "Maximum number of instructions in an explicit S_CLAUSE is 63", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.max_private_element_size_16)] = .{ - .llvm_name = "max-private-element-size-16", - .description = "Maximum private access size may be 16", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.max_private_element_size_4)] = .{ - .llvm_name = "max-private-element-size-4", - .description = "Maximum private access size may be 4", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.max_private_element_size_8)] = .{ - .llvm_name = "max-private-element-size-8", - .description = "Maximum private access size may be 8", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.memory_atomic_fadd_f32_denormal_support)] = .{ - .llvm_name = "memory-atomic-fadd-f32-denormal-support", - .description = "global/flat/buffer atomic fadd for float supports denormal handling", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mfma_inline_literal_bug)] = .{ - .llvm_name = "mfma-inline-literal-bug", - .description = "MFMA cannot use inline literal as SrcC", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.mimg_r128)] = .{ - .llvm_name = "mimg-r128", - .description = "Support 128-bit texture resources", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.movrel)] = .{ - .llvm_name = "movrel", - .description = "Has v_movrel*_b32 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.msaa_load_dst_sel_bug)] = .{ - .llvm_name = "msaa-load-dst-sel-bug", - .description = "MSAA loads not honoring dst_sel bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.negative_scratch_offset_bug)] = .{ - .llvm_name = "negative-scratch-offset-bug", - .description = "Negative immediate offsets in scratch instructions with an SGPR offset page fault on GFX9", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.negative_unaligned_scratch_offset_bug)] = .{ - .llvm_name = "negative-unaligned-scratch-offset-bug", - .description = "Scratch instructions with a VGPR offset and a negative immediate offset that is not a multiple of 4 read wrong memory on GFX10", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.no_data_dep_hazard)] = .{ - .llvm_name = "no-data-dep-hazard", - .description = "Does not need SW waitstates", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.no_sdst_cmpx)] = .{ - .llvm_name = "no-sdst-cmpx", - .description = "V_CMPX does not write VCC/SGPR in addition to EXEC", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.nsa_clause_bug)] = .{ - .llvm_name = "nsa-clause-bug", - .description = "MIMG-NSA in a hard clause has unpredictable results on GFX10.1", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.nsa_encoding)] = .{ - .llvm_name = "nsa-encoding", - .description = "Support NSA encoding for image instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.nsa_to_vmem_bug)] = .{ - .llvm_name = "nsa-to-vmem-bug", - .description = "MIMG-NSA followed by VMEM fail if EXEC_LO or EXEC_HI equals zero", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.offset_3f_bug)] = .{ - .llvm_name = "offset-3f-bug", - .description = "Branch offset of 3f hardware bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.packed_fp32_ops)] = .{ - .llvm_name = "packed-fp32-ops", - .description = "Support packed fp32 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.packed_tid)] = .{ - .llvm_name = "packed-tid", - .description = "Workitem IDs are packed into v0 at kernel launch", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.partial_nsa_encoding)] = .{ - .llvm_name = "partial-nsa-encoding", - .description = "Support partial NSA encoding for image instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.pk_fmac_f16_inst)] = .{ - .llvm_name = "pk-fmac-f16-inst", - .description = "Has v_pk_fmac_f16 instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.precise_memory)] = .{ - .llvm_name = "precise-memory", - .description = "Enable precise memory mode", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.priv_enabled_trap2_nop_bug)] = .{ - .llvm_name = "priv-enabled-trap2-nop-bug", - .description = "Hardware that runs with PRIV=1 interpreting 's_trap 2' as a nop bug", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.promote_alloca)] = .{ - .llvm_name = "promote-alloca", - .description = "Enable promote alloca pass", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.prt_strict_null)] = .{ - .llvm_name = "enable-prt-strict-null", - .description = "Enable zeroing of result registers for sparse texture fetches", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.pseudo_scalar_trans)] = .{ - .llvm_name = "pseudo-scalar-trans", - .description = "Has Pseudo Scalar Transcendental instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.r128_a16)] = .{ - .llvm_name = "r128-a16", - .description = "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.real_true16)] = .{ - .llvm_name = "real-true16", - .description = "Use true 16-bit registers", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.required_export_priority)] = .{ - .llvm_name = "required-export-priority", - .description = "Export priority must be explicitly manipulated on GFX11.5", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.requires_cov6)] = .{ - .llvm_name = "requires-cov6", - .description = "Target Requires Code Object V6", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.restricted_soffset)] = .{ - .llvm_name = "restricted-soffset", - .description = "Has restricted SOffset (immediate not supported).", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.s_memrealtime)] = .{ - .llvm_name = "s-memrealtime", - .description = "Has s_memrealtime instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.s_memtime_inst)] = .{ - .llvm_name = "s-memtime-inst", - .description = "Has s_memtime instruction", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.salu_float)] = .{ - .llvm_name = "salu-float", - .description = "Has SALU floating point instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.scalar_atomics)] = .{ - .llvm_name = "scalar-atomics", - .description = "Has atomic scalar memory instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.scalar_dwordx3_loads)] = .{ - .llvm_name = "scalar-dwordx3-loads", - .description = "Has 96-bit scalar load instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.scalar_flat_scratch_insts)] = .{ - .llvm_name = "scalar-flat-scratch-insts", - .description = "Have s_scratch_* flat memory instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.scalar_stores)] = .{ - .llvm_name = "scalar-stores", - .description = "Has store scalar memory instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa)] = .{ - .llvm_name = "sdwa", - .description = "Support SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa_mav)] = .{ - .llvm_name = "sdwa-mav", - .description = "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa_omod)] = .{ - .llvm_name = "sdwa-omod", - .description = "Support OMod with SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa_out_mods_vopc)] = .{ - .llvm_name = "sdwa-out-mods-vopc", - .description = "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa_scalar)] = .{ - .llvm_name = "sdwa-scalar", - .description = "Support scalar register with SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sdwa_sdst)] = .{ - .llvm_name = "sdwa-sdst", - .description = "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sea_islands)] = .{ - .llvm_name = "sea-islands", - .description = "SEA_ISLANDS GPU generation", - .dependencies = featureSet(&[_]Feature{ - .atomic_fmin_fmax_flat_f32, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f32, - .atomic_fmin_fmax_global_f64, - .ci_insts, - .default_component_zero, - .ds_src2_insts, - .extended_image_insts, - .flat_address_space, - .fp64, - .gds, - .gfx7_gfx8_gfx9_insts, - .gws, - .image_insts, - .localmemorysize65536, - .mad_mac_f32_insts, - .mimg_r128, - .movrel, - .s_memtime_inst, - .trig_reduced_range, - .unaligned_buffer_access, - .vmem_write_vgpr_in_order, - .wavefrontsize64, - }), - }; - result[@intFromEnum(Feature.sgpr_init_bug)] = .{ - .llvm_name = "sgpr-init-bug", - .description = "VI SGPR initialization bug requiring a fixed SGPR allocation size", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.shader_cycles_hi_lo_registers)] = .{ - .llvm_name = "shader-cycles-hi-lo-registers", - .description = "Has SHADER_CYCLES_HI/LO hardware registers", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.shader_cycles_register)] = .{ - .llvm_name = "shader-cycles-register", - .description = "Has SHADER_CYCLES hardware register", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.si_scheduler)] = .{ - .llvm_name = "si-scheduler", - .description = "Enable SI Machine Scheduler", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.smem_to_vector_write_hazard)] = .{ - .llvm_name = "smem-to-vector-write-hazard", - .description = "s_load_dword followed by v_cmp page faults", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.southern_islands)] = .{ - .llvm_name = "southern-islands", - .description = "SOUTHERN_ISLANDS GPU generation", - .dependencies = featureSet(&[_]Feature{ - .atomic_fmin_fmax_global_f32, - .atomic_fmin_fmax_global_f64, - .default_component_zero, - .ds_src2_insts, - .extended_image_insts, - .fp64, - .gds, - .gws, - .image_insts, - .ldsbankcount32, - .localmemorysize32768, - .mad_mac_f32_insts, - .mimg_r128, - .movrel, - .s_memtime_inst, - .trig_reduced_range, - .vmem_write_vgpr_in_order, - .wavefrontsize64, - }), - }; - result[@intFromEnum(Feature.sramecc)] = .{ - .llvm_name = "sramecc", - .description = "Enable SRAMECC", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.sramecc_support)] = .{ - .llvm_name = "sramecc-support", - .description = "Hardware supports SRAMECC", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.tgsplit)] = .{ - .llvm_name = "tgsplit", - .description = "Enable threadgroup split execution", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.trap_handler)] = .{ - .llvm_name = "trap-handler", - .description = "Trap handler support", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.trig_reduced_range)] = .{ - .llvm_name = "trig-reduced-range", - .description = "Requires use of fract on arguments to trig instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.true16)] = .{ - .llvm_name = "true16", - .description = "True 16-bit operand instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unaligned_access_mode)] = .{ - .llvm_name = "unaligned-access-mode", - .description = "Enable unaligned global, local and region loads and stores if the hardware supports it", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unaligned_buffer_access)] = .{ - .llvm_name = "unaligned-buffer-access", - .description = "Hardware supports unaligned global loads and stores", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unaligned_ds_access)] = .{ - .llvm_name = "unaligned-ds-access", - .description = "Hardware supports unaligned local and region loads and stores", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unaligned_scratch_access)] = .{ - .llvm_name = "unaligned-scratch-access", - .description = "Support unaligned scratch loads and stores", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unpacked_d16_vmem)] = .{ - .llvm_name = "unpacked-d16-vmem", - .description = "Has unpacked d16 vmem instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.unsafe_ds_offset_folding)] = .{ - .llvm_name = "unsafe-ds-offset-folding", - .description = "Force using DS instruction immediate offsets on SI", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.user_sgpr_init16_bug)] = .{ - .llvm_name = "user-sgpr-init16-bug", - .description = "Bug requiring at least 16 user+system SGPRs to be enabled", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.valu_trans_use_hazard)] = .{ - .llvm_name = "valu-trans-use-hazard", - .description = "Hazard when TRANS instructions are closely followed by a use of the result", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vcmpx_exec_war_hazard)] = .{ - .llvm_name = "vcmpx-exec-war-hazard", - .description = "V_CMPX WAR hazard on EXEC (V_CMPX issue ONLY)", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vcmpx_permlane_hazard)] = .{ - .llvm_name = "vcmpx-permlane-hazard", - .description = "TODO: describe me", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vgpr_index_mode)] = .{ - .llvm_name = "vgpr-index-mode", - .description = "Has VGPR mode register indexing", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vgpr_singleuse_hint)] = .{ - .llvm_name = "vgpr-singleuse-hint", - .description = "Has single-use VGPR hint instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vmem_to_scalar_write_hazard)] = .{ - .llvm_name = "vmem-to-scalar-write-hazard", - .description = "VMEM instruction followed by scalar writing to EXEC mask, M0 or SGPR leads to incorrect execution.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vmem_write_vgpr_in_order)] = .{ - .llvm_name = "vmem-write-vgpr-in-order", - .description = "VMEM instructions of the same type write VGPR results in order", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.volcanic_islands)] = .{ - .llvm_name = "volcanic-islands", - .description = "VOLCANIC_ISLANDS GPU generation", - .dependencies = featureSet(&[_]Feature{ - .@"16_bit_insts", - .ci_insts, - .default_component_zero, - .dpp, - .ds_src2_insts, - .extended_image_insts, - .fast_denormal_f32, - .flat_address_space, - .fp64, - .gcn3_encoding, - .gds, - .gfx7_gfx8_gfx9_insts, - .gfx8_insts, - .gws, - .image_insts, - .int_clamp_insts, - .inv_2pi_inline_imm, - .localmemorysize65536, - .mad_mac_f32_insts, - .mimg_r128, - .movrel, - .s_memrealtime, - .s_memtime_inst, - .scalar_stores, - .sdwa, - .sdwa_mav, - .sdwa_out_mods_vopc, - .trig_reduced_range, - .unaligned_buffer_access, - .vgpr_index_mode, - .vmem_write_vgpr_in_order, - .wavefrontsize64, - }), - }; - result[@intFromEnum(Feature.vop3_literal)] = .{ - .llvm_name = "vop3-literal", - .description = "Can use one literal in VOP3", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vop3p)] = .{ - .llvm_name = "vop3p", - .description = "Has VOP3P packed instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vopd)] = .{ - .llvm_name = "vopd", - .description = "Has VOPD dual issue wave32 instructions", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.vscnt)] = .{ - .llvm_name = "vscnt", - .description = "Has separate store vscnt counter", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.wavefrontsize16)] = .{ - .llvm_name = "wavefrontsize16", - .description = "The number of threads per wavefront", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.wavefrontsize32)] = .{ - .llvm_name = "wavefrontsize32", - .description = "The number of threads per wavefront", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.wavefrontsize64)] = .{ - .llvm_name = "wavefrontsize64", - .description = "The number of threads per wavefront", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.xnack)] = .{ - .llvm_name = "xnack", - .description = "Enable XNACK support", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.xnack_support)] = .{ - .llvm_name = "xnack-support", - .description = "Hardware supports XNACK", - .dependencies = featureSet(&[_]Feature{}), - }; - const ti = @typeInfo(Feature); - for (&result, 0..) |*elem, i| { - elem.index = i; - elem.name = ti.@"enum".fields[i].name; - } - break :blk result; -}; - -pub const cpu = struct { - pub const bonaire = CpuModel{ - .name = "bonaire", - .llvm_name = "bonaire", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sea_islands, - }), - }; - pub const carrizo = CpuModel{ - .name = "carrizo", - .llvm_name = "carrizo", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - .xnack_support, - }), - }; - pub const fiji = CpuModel{ - .name = "fiji", - .llvm_name = "fiji", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const generic = CpuModel{ - .name = "generic", - .llvm_name = "generic", - .features = featureSet(&[_]Feature{ - .gds, - .gws, - .wavefrontsize64, - }), - }; - pub const generic_hsa = CpuModel{ - .name = "generic_hsa", - .llvm_name = "generic-hsa", - .features = featureSet(&[_]Feature{ - .flat_address_space, - .gds, - .gws, - .wavefrontsize64, - }), - }; - pub const gfx1010 = CpuModel{ - .name = "gfx1010", - .llvm_name = "gfx1010", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .ds_src2_insts, - .flat_segment_offset_bug, - .get_wave_id_inst, - .gfx10, - .inst_fwd_prefetch_bug, - .lds_branch_vmem_war_hazard, - .lds_misaligned_bug, - .ldsbankcount32, - .mad_mac_f32_insts, - .negative_unaligned_scratch_offset_bug, - .nsa_clause_bug, - .nsa_encoding, - .nsa_to_vmem_bug, - .offset_3f_bug, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .smem_to_vector_write_hazard, - .vcmpx_exec_war_hazard, - .vcmpx_permlane_hazard, - .vmem_to_scalar_write_hazard, - .xnack_support, - }), - }; - pub const gfx1011 = CpuModel{ - .name = "gfx1011", - .llvm_name = "gfx1011", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .ds_src2_insts, - .flat_segment_offset_bug, - .get_wave_id_inst, - .gfx10, - .inst_fwd_prefetch_bug, - .lds_branch_vmem_war_hazard, - .lds_misaligned_bug, - .ldsbankcount32, - .mad_mac_f32_insts, - .negative_unaligned_scratch_offset_bug, - .nsa_clause_bug, - .nsa_encoding, - .nsa_to_vmem_bug, - .offset_3f_bug, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .smem_to_vector_write_hazard, - .vcmpx_exec_war_hazard, - .vcmpx_permlane_hazard, - .vmem_to_scalar_write_hazard, - .xnack_support, - }), - }; - pub const gfx1012 = CpuModel{ - .name = "gfx1012", - .llvm_name = "gfx1012", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .ds_src2_insts, - .flat_segment_offset_bug, - .get_wave_id_inst, - .gfx10, - .inst_fwd_prefetch_bug, - .lds_branch_vmem_war_hazard, - .lds_misaligned_bug, - .ldsbankcount32, - .mad_mac_f32_insts, - .negative_unaligned_scratch_offset_bug, - .nsa_clause_bug, - .nsa_encoding, - .nsa_to_vmem_bug, - .offset_3f_bug, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .smem_to_vector_write_hazard, - .vcmpx_exec_war_hazard, - .vcmpx_permlane_hazard, - .vmem_to_scalar_write_hazard, - .xnack_support, - }), - }; - pub const gfx1013 = CpuModel{ - .name = "gfx1013", - .llvm_name = "gfx1013", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .ds_src2_insts, - .flat_segment_offset_bug, - .get_wave_id_inst, - .gfx10, - .gfx10_a_encoding, - .inst_fwd_prefetch_bug, - .lds_branch_vmem_war_hazard, - .lds_misaligned_bug, - .ldsbankcount32, - .mad_mac_f32_insts, - .negative_unaligned_scratch_offset_bug, - .nsa_clause_bug, - .nsa_encoding, - .nsa_to_vmem_bug, - .offset_3f_bug, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .smem_to_vector_write_hazard, - .vcmpx_exec_war_hazard, - .vcmpx_permlane_hazard, - .vmem_to_scalar_write_hazard, - .xnack_support, - }), - }; - pub const gfx1030 = CpuModel{ - .name = "gfx1030", - .llvm_name = "gfx1030", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1031 = CpuModel{ - .name = "gfx1031", - .llvm_name = "gfx1031", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1032 = CpuModel{ - .name = "gfx1032", - .llvm_name = "gfx1032", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1033 = CpuModel{ - .name = "gfx1033", - .llvm_name = "gfx1033", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1034 = CpuModel{ - .name = "gfx1034", - .llvm_name = "gfx1034", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1035 = CpuModel{ - .name = "gfx1035", - .llvm_name = "gfx1035", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx1036 = CpuModel{ - .name = "gfx1036", - .llvm_name = "gfx1036", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .shader_cycles_register, - }), - }; - pub const gfx10_1_generic = CpuModel{ - .name = "gfx10_1_generic", - .llvm_name = "gfx10-1-generic", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .ds_src2_insts, - .flat_segment_offset_bug, - .get_wave_id_inst, - .gfx10, - .inst_fwd_prefetch_bug, - .lds_branch_vmem_war_hazard, - .lds_misaligned_bug, - .ldsbankcount32, - .mad_mac_f32_insts, - .negative_unaligned_scratch_offset_bug, - .nsa_clause_bug, - .nsa_encoding, - .nsa_to_vmem_bug, - .offset_3f_bug, - .requires_cov6, - .scalar_atomics, - .scalar_flat_scratch_insts, - .scalar_stores, - .smem_to_vector_write_hazard, - .vcmpx_exec_war_hazard, - .vcmpx_permlane_hazard, - .vmem_to_scalar_write_hazard, - .xnack_support, - }), - }; - pub const gfx10_3_generic = CpuModel{ - .name = "gfx10_3_generic", - .llvm_name = "gfx10-3-generic", - .features = featureSet(&[_]Feature{ - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .gfx10, - .gfx10_3_insts, - .gfx10_a_encoding, - .gfx10_b_encoding, - .ldsbankcount32, - .nsa_encoding, - .requires_cov6, - .shader_cycles_register, - }), - }; - pub const gfx1100 = CpuModel{ - .name = "gfx1100", - .llvm_name = "gfx1100", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .mad_intra_fwd_bug, - .memory_atomic_fadd_f32_denormal_support, - .msaa_load_dst_sel_bug, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .priv_enabled_trap2_nop_bug, - .shader_cycles_register, - .user_sgpr_init16_bug, - .valu_trans_use_hazard, - .vcmpx_permlane_hazard, - }), - }; - pub const gfx1101 = CpuModel{ - .name = "gfx1101", - .llvm_name = "gfx1101", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .mad_intra_fwd_bug, - .memory_atomic_fadd_f32_denormal_support, - .msaa_load_dst_sel_bug, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .priv_enabled_trap2_nop_bug, - .shader_cycles_register, - .valu_trans_use_hazard, - .vcmpx_permlane_hazard, - }), - }; - pub const gfx1102 = CpuModel{ - .name = "gfx1102", - .llvm_name = "gfx1102", - .features = featureSet(&[_]Feature{ - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .mad_intra_fwd_bug, - .memory_atomic_fadd_f32_denormal_support, - .msaa_load_dst_sel_bug, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .priv_enabled_trap2_nop_bug, - .shader_cycles_register, - .user_sgpr_init16_bug, - .valu_trans_use_hazard, - .vcmpx_permlane_hazard, - }), - }; - pub const gfx1103 = CpuModel{ - .name = "gfx1103", - .llvm_name = "gfx1103", - .features = featureSet(&[_]Feature{ - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .mad_intra_fwd_bug, - .memory_atomic_fadd_f32_denormal_support, - .msaa_load_dst_sel_bug, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .priv_enabled_trap2_nop_bug, - .shader_cycles_register, - .valu_trans_use_hazard, - .vcmpx_permlane_hazard, - }), - }; - pub const gfx1150 = CpuModel{ - .name = "gfx1150", - .llvm_name = "gfx1150", - .features = featureSet(&[_]Feature{ - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .required_export_priority, - .salu_float, - .shader_cycles_register, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx1151 = CpuModel{ - .name = "gfx1151", - .llvm_name = "gfx1151", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .required_export_priority, - .salu_float, - .shader_cycles_register, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx1152 = CpuModel{ - .name = "gfx1152", - .llvm_name = "gfx1152", - .features = featureSet(&[_]Feature{ - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .required_export_priority, - .salu_float, - .shader_cycles_register, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx11_generic = CpuModel{ - .name = "gfx11_generic", - .llvm_name = "gfx11-generic", - .features = featureSet(&[_]Feature{ - .architected_flat_scratch, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .dl_insts, - .dot10_insts, - .dot5_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .flat_atomic_fadd_f32_inst, - .gfx11, - .image_insts, - .ldsbankcount32, - .mad_intra_fwd_bug, - .memory_atomic_fadd_f32_denormal_support, - .msaa_load_dst_sel_bug, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .priv_enabled_trap2_nop_bug, - .required_export_priority, - .requires_cov6, - .shader_cycles_register, - .user_sgpr_init16_bug, - .valu_trans_use_hazard, - .vcmpx_permlane_hazard, - }), - }; - pub const gfx1200 = CpuModel{ - .name = "gfx1200", - .llvm_name = "gfx1200", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .architected_sgprs, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_buffer_pk_add_bf16_inst, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_global_pk_add_bf16_inst, - .dl_insts, - .dot10_insts, - .dot11_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .extended_image_insts, - .flat_atomic_fadd_f32_inst, - .fp8_conversion_insts, - .gfx12, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .pseudo_scalar_trans, - .restricted_soffset, - .salu_float, - .scalar_dwordx3_loads, - .shader_cycles_hi_lo_registers, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx1201 = CpuModel{ - .name = "gfx1201", - .llvm_name = "gfx1201", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .architected_sgprs, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_buffer_pk_add_bf16_inst, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_global_pk_add_bf16_inst, - .dl_insts, - .dot10_insts, - .dot11_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .extended_image_insts, - .flat_atomic_fadd_f32_inst, - .fp8_conversion_insts, - .gfx12, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .pseudo_scalar_trans, - .restricted_soffset, - .salu_float, - .scalar_dwordx3_loads, - .shader_cycles_hi_lo_registers, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx12_generic = CpuModel{ - .name = "gfx12_generic", - .llvm_name = "gfx12-generic", - .features = featureSet(&[_]Feature{ - .allocate1_5xvgprs, - .architected_flat_scratch, - .architected_sgprs, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_buffer_pk_add_bf16_inst, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_global_pk_add_bf16_inst, - .dl_insts, - .dot10_insts, - .dot11_insts, - .dot7_insts, - .dot8_insts, - .dot9_insts, - .dpp_src1_sgpr, - .extended_image_insts, - .flat_atomic_fadd_f32_inst, - .fp8_conversion_insts, - .gfx12, - .image_insts, - .ldsbankcount32, - .memory_atomic_fadd_f32_denormal_support, - .nsa_encoding, - .packed_tid, - .partial_nsa_encoding, - .pseudo_scalar_trans, - .requires_cov6, - .restricted_soffset, - .salu_float, - .scalar_dwordx3_loads, - .shader_cycles_hi_lo_registers, - .vcmpx_permlane_hazard, - .vgpr_singleuse_hint, - }), - }; - pub const gfx600 = CpuModel{ - .name = "gfx600", - .llvm_name = "gfx600", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .southern_islands, - }), - }; - pub const gfx601 = CpuModel{ - .name = "gfx601", - .llvm_name = "gfx601", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; - pub const gfx602 = CpuModel{ - .name = "gfx602", - .llvm_name = "gfx602", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; - pub const gfx700 = CpuModel{ - .name = "gfx700", - .llvm_name = "gfx700", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sea_islands, - }), - }; - pub const gfx701 = CpuModel{ - .name = "gfx701", - .llvm_name = "gfx701", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .ldsbankcount32, - .sea_islands, - }), - }; - pub const gfx702 = CpuModel{ - .name = "gfx702", - .llvm_name = "gfx702", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .ldsbankcount16, - .sea_islands, - }), - }; - pub const gfx703 = CpuModel{ - .name = "gfx703", - .llvm_name = "gfx703", - .features = featureSet(&[_]Feature{ - .ldsbankcount16, - .sea_islands, - }), - }; - pub const gfx704 = CpuModel{ - .name = "gfx704", - .llvm_name = "gfx704", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sea_islands, - }), - }; - pub const gfx705 = CpuModel{ - .name = "gfx705", - .llvm_name = "gfx705", - .features = featureSet(&[_]Feature{ - .ldsbankcount16, - .sea_islands, - }), - }; - pub const gfx801 = CpuModel{ - .name = "gfx801", - .llvm_name = "gfx801", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - .xnack_support, - }), - }; - pub const gfx802 = CpuModel{ - .name = "gfx802", - .llvm_name = "gfx802", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sgpr_init_bug, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const gfx803 = CpuModel{ - .name = "gfx803", - .llvm_name = "gfx803", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const gfx805 = CpuModel{ - .name = "gfx805", - .llvm_name = "gfx805", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sgpr_init_bug, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const gfx810 = CpuModel{ - .name = "gfx810", - .llvm_name = "gfx810", - .features = featureSet(&[_]Feature{ - .image_gather4_d16_bug, - .image_store_d16_bug, - .ldsbankcount16, - .volcanic_islands, - .xnack_support, - }), - }; - pub const gfx900 = CpuModel{ - .name = "gfx900", - .llvm_name = "gfx900", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .mad_mix_insts, - }), - }; - pub const gfx902 = CpuModel{ - .name = "gfx902", - .llvm_name = "gfx902", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .mad_mix_insts, - }), - }; - pub const gfx904 = CpuModel{ - .name = "gfx904", - .llvm_name = "gfx904", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .fma_mix_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - }), - }; - pub const gfx906 = CpuModel{ - .name = "gfx906", - .llvm_name = "gfx906", - .features = featureSet(&[_]Feature{ - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot7_insts, - .ds_src2_insts, - .extended_image_insts, - .fma_mix_insts, - .gds, - .gfx9, - .half_rate_64_ops, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .sramecc_support, - }), - }; - pub const gfx908 = CpuModel{ - .name = "gfx908", - .llvm_name = "gfx908", - .features = featureSet(&[_]Feature{ - .atomic_buffer_global_pk_add_f16_no_rtn_insts, - .atomic_fadd_no_rtn_insts, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot3_insts, - .dot4_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .ds_src2_insts, - .extended_image_insts, - .fma_mix_insts, - .gds, - .gfx9, - .half_rate_64_ops, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .mai_insts, - .mfma_inline_literal_bug, - .pk_fmac_f16_inst, - .sramecc_support, - }), - }; - pub const gfx909 = CpuModel{ - .name = "gfx909", - .llvm_name = "gfx909", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .mad_mix_insts, - }), - }; - pub const gfx90a = CpuModel{ - .name = "gfx90a", - .llvm_name = "gfx90a", - .features = featureSet(&[_]Feature{ - .atomic_buffer_global_pk_add_f16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f64, - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot3_insts, - .dot4_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .dpp_64bit, - .flat_buffer_global_fadd_f64_inst, - .fma_mix_insts, - .fmacf64_inst, - .full_rate_64_ops, - .gfx9, - .gfx90a_insts, - .image_insts, - .kernarg_preload, - .ldsbankcount32, - .mad_mac_f32_insts, - .mai_insts, - .packed_fp32_ops, - .packed_tid, - .pk_fmac_f16_inst, - .sramecc_support, - }), - }; - pub const gfx90c = CpuModel{ - .name = "gfx90c", - .llvm_name = "gfx90c", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .mad_mix_insts, - }), - }; - pub const gfx940 = CpuModel{ - .name = "gfx940", - .llvm_name = "gfx940", - .features = featureSet(&[_]Feature{ - .agent_scope_fine_grained_remote_memory_atomics, - .architected_flat_scratch, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f64, - .atomic_global_pk_add_bf16_inst, - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot3_insts, - .dot4_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .dpp_64bit, - .flat_atomic_fadd_f32_inst, - .flat_buffer_global_fadd_f64_inst, - .fma_mix_insts, - .fmacf64_inst, - .force_store_sc0_sc1, - .fp8_conversion_insts, - .fp8_insts, - .full_rate_64_ops, - .gfx9, - .gfx90a_insts, - .gfx940_insts, - .kernarg_preload, - .ldsbankcount32, - .mai_insts, - .memory_atomic_fadd_f32_denormal_support, - .packed_fp32_ops, - .packed_tid, - .pk_fmac_f16_inst, - .sramecc_support, - }), - }; - pub const gfx941 = CpuModel{ - .name = "gfx941", - .llvm_name = "gfx941", - .features = featureSet(&[_]Feature{ - .agent_scope_fine_grained_remote_memory_atomics, - .architected_flat_scratch, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f64, - .atomic_global_pk_add_bf16_inst, - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot3_insts, - .dot4_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .dpp_64bit, - .flat_atomic_fadd_f32_inst, - .flat_buffer_global_fadd_f64_inst, - .fma_mix_insts, - .fmacf64_inst, - .force_store_sc0_sc1, - .fp8_conversion_insts, - .fp8_insts, - .full_rate_64_ops, - .gfx9, - .gfx90a_insts, - .gfx940_insts, - .kernarg_preload, - .ldsbankcount32, - .mai_insts, - .memory_atomic_fadd_f32_denormal_support, - .packed_fp32_ops, - .packed_tid, - .pk_fmac_f16_inst, - .sramecc_support, - }), - }; - pub const gfx942 = CpuModel{ - .name = "gfx942", - .llvm_name = "gfx942", - .features = featureSet(&[_]Feature{ - .agent_scope_fine_grained_remote_memory_atomics, - .architected_flat_scratch, - .atomic_buffer_global_pk_add_f16_insts, - .atomic_ds_pk_add_16_insts, - .atomic_fadd_no_rtn_insts, - .atomic_fadd_rtn_insts, - .atomic_flat_pk_add_16_insts, - .atomic_fmin_fmax_flat_f64, - .atomic_fmin_fmax_global_f64, - .atomic_global_pk_add_bf16_inst, - .back_off_barrier, - .dl_insts, - .dot10_insts, - .dot1_insts, - .dot2_insts, - .dot3_insts, - .dot4_insts, - .dot5_insts, - .dot6_insts, - .dot7_insts, - .dpp_64bit, - .flat_atomic_fadd_f32_inst, - .flat_buffer_global_fadd_f64_inst, - .fma_mix_insts, - .fmacf64_inst, - .fp8_conversion_insts, - .fp8_insts, - .full_rate_64_ops, - .gfx9, - .gfx90a_insts, - .gfx940_insts, - .kernarg_preload, - .ldsbankcount32, - .mai_insts, - .memory_atomic_fadd_f32_denormal_support, - .packed_fp32_ops, - .packed_tid, - .pk_fmac_f16_inst, - .sramecc_support, - }), - }; - pub const gfx9_generic = CpuModel{ - .name = "gfx9_generic", - .llvm_name = "gfx9-generic", - .features = featureSet(&[_]Feature{ - .ds_src2_insts, - .extended_image_insts, - .gds, - .gfx9, - .image_gather4_d16_bug, - .image_insts, - .ldsbankcount32, - .mad_mac_f32_insts, - .requires_cov6, - }), - }; - pub const hainan = CpuModel{ - .name = "hainan", - .llvm_name = "hainan", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; - pub const hawaii = CpuModel{ - .name = "hawaii", - .llvm_name = "hawaii", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .ldsbankcount32, - .sea_islands, - }), - }; - pub const iceland = CpuModel{ - .name = "iceland", - .llvm_name = "iceland", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sgpr_init_bug, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const kabini = CpuModel{ - .name = "kabini", - .llvm_name = "kabini", - .features = featureSet(&[_]Feature{ - .ldsbankcount16, - .sea_islands, - }), - }; - pub const kaveri = CpuModel{ - .name = "kaveri", - .llvm_name = "kaveri", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sea_islands, - }), - }; - pub const mullins = CpuModel{ - .name = "mullins", - .llvm_name = "mullins", - .features = featureSet(&[_]Feature{ - .ldsbankcount16, - .sea_islands, - }), - }; - pub const oland = CpuModel{ - .name = "oland", - .llvm_name = "oland", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; - pub const pitcairn = CpuModel{ - .name = "pitcairn", - .llvm_name = "pitcairn", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; - pub const polaris10 = CpuModel{ - .name = "polaris10", - .llvm_name = "polaris10", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const polaris11 = CpuModel{ - .name = "polaris11", - .llvm_name = "polaris11", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const stoney = CpuModel{ - .name = "stoney", - .llvm_name = "stoney", - .features = featureSet(&[_]Feature{ - .image_gather4_d16_bug, - .image_store_d16_bug, - .ldsbankcount16, - .volcanic_islands, - .xnack_support, - }), - }; - pub const tahiti = CpuModel{ - .name = "tahiti", - .llvm_name = "tahiti", - .features = featureSet(&[_]Feature{ - .fast_fmaf, - .half_rate_64_ops, - .southern_islands, - }), - }; - pub const tonga = CpuModel{ - .name = "tonga", - .llvm_name = "tonga", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sgpr_init_bug, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const tongapro = CpuModel{ - .name = "tongapro", - .llvm_name = "tongapro", - .features = featureSet(&[_]Feature{ - .ldsbankcount32, - .sgpr_init_bug, - .unpacked_d16_vmem, - .volcanic_islands, - }), - }; - pub const verde = CpuModel{ - .name = "verde", - .llvm_name = "verde", - .features = featureSet(&[_]Feature{ - .southern_islands, - }), - }; -}; diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 0244eb6d4111b0472fc8e8b113fa373347e05b35..aa21a8a0ea6e96cc712282fd9e1eeb0f97e4b3b7 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -589,7 +589,7 @@ const WindowsThreadImpl = struct { fn_args: Args, thread: ThreadCompletion, - fn entryFn(raw_ptr: windows.PVOID) callconv(.C) windows.DWORD { + fn entryFn(raw_ptr: windows.PVOID) callconv(.winapi) windows.DWORD { const self: *@This() = @ptrCast(@alignCast(raw_ptr)); defer switch (self.thread.completion.swap(.completed, .seq_cst)) { .running => {}, @@ -749,7 +749,7 @@ const PosixThreadImpl = struct { const allocator = std.heap.c_allocator; const Instance = struct { - fn entryFn(raw_arg: ?*anyopaque) callconv(.C) ?*anyopaque { + fn entryFn(raw_arg: ?*anyopaque) callconv(.c) ?*anyopaque { const args_ptr: *Args = @ptrCast(@alignCast(raw_arg)); defer allocator.destroy(args_ptr); return callFn(f, args_ptr.*); @@ -1363,7 +1363,7 @@ const LinuxThreadImpl = struct { fn_args: Args, thread: ThreadCompletion, - fn entryFn(raw_arg: usize) callconv(.C) u8 { + fn entryFn(raw_arg: usize) callconv(.c) u8 { const self = @as(*@This(), @ptrFromInt(raw_arg)); defer switch (self.thread.completion.swap(.completed, .seq_cst)) { .running => {}, diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index d7f8876b24d0158af47565c4dd5968f30c9d6997..02948d660206fa105f3aa4f55ef5692a2bb144f9 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -293,12 +293,12 @@ pub const CallingConvention = union(enum(u8)) { arm_aapcs16_vfp: CommonOptions, arm_interrupt: ArmInterruptOptions, - // Calling conventions for the `mips64` architecture. + // Calling conventions for the `mips64` and `mips64el` architectures. mips64_n64: CommonOptions, mips64_n32: CommonOptions, mips64_interrupt: MipsInterruptOptions, - // Calling conventions for the `mips` architecture. + // Calling conventions for the `mips` and `mipsel` architectures. mips_o32: CommonOptions, mips_interrupt: MipsInterruptOptions, @@ -329,7 +329,7 @@ pub const CallingConvention = union(enum(u8)) { powerpc_aix: CommonOptions, powerpc_aix_altivec: CommonOptions, - /// The standard `wasm32`/`wasm64` calling convention, as specified in the WebAssembly Tool Conventions. + /// The standard `wasm32` and `wasm64` calling convention, as specified in the WebAssembly Tool Conventions. wasm_watc: CommonOptions, /// The standard `arc` calling convention. @@ -396,7 +396,7 @@ pub const CallingConvention = union(enum(u8)) { amdgcn_kernel, amdgcn_cs: CommonOptions, - // Calling conventions for the `nvptx` architecture. + // Calling conventions for the `nvptx` and `nvptx64` architectures. nvptx_device, nvptx_kernel, diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 8527677ebbded638a192a0320f44ecd59b98cd51..5b18f37b6a69c9f7da77759bbae8e6d748732d53 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -1344,7 +1344,7 @@ fn dumpSegfaultInfoPosix(sig: i32, code: i32, addr: usize, ctx_ptr: ?*anyopaque) } } -fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(windows.WINAPI) c_long { +fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.winapi) c_long { switch (info.ExceptionRecord.ExceptionCode) { windows.EXCEPTION_DATATYPE_MISALIGNMENT => handleSegfaultWindowsExtra(info, 0, "Unaligned Memory Access"), windows.EXCEPTION_ACCESS_VIOLATION => handleSegfaultWindowsExtra(info, 1, null), diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index dbd6df46b7cfca40f7fd3bae38f93c4cbc469d76..010bbcd005ee1c03fd2c190793b5a0bb8c68b045 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -2101,8 +2101,8 @@ pub fn UnlockFile( /// This is a workaround for the C backend until zig has the ability to put /// C code in inline assembly. -extern fn zig_x86_windows_teb() callconv(.C) *anyopaque; -extern fn zig_x86_64_windows_teb() callconv(.C) *anyopaque; +extern fn zig_x86_windows_teb() callconv(.c) *anyopaque; +extern fn zig_x86_64_windows_teb() callconv(.c) *anyopaque; pub fn teb() *TEB { return switch (native_arch) { @@ -2824,6 +2824,7 @@ pub const STD_OUTPUT_HANDLE = maxInt(DWORD) - 11 + 1; /// The standard error device. Initially, this is the active console screen buffer, CONOUT$. pub const STD_ERROR_HANDLE = maxInt(DWORD) - 12 + 1; +/// Deprecated; use `std.builtin.CallingConvention.winapi` instead. pub const WINAPI: std.builtin.CallingConvention = .winapi; pub const BOOL = c_int; @@ -3567,7 +3568,7 @@ pub const MEM_RESERVE_PLACEHOLDERS = 0x2; pub const MEM_DECOMMIT = 0x4000; pub const MEM_RELEASE = 0x8000; -pub const PTHREAD_START_ROUTINE = *const fn (LPVOID) callconv(.C) DWORD; +pub const PTHREAD_START_ROUTINE = *const fn (LPVOID) callconv(.winapi) DWORD; pub const LPTHREAD_START_ROUTINE = PTHREAD_START_ROUTINE; pub const WIN32_FIND_DATAW = extern struct { @@ -3745,7 +3746,7 @@ pub const IMAGE_TLS_DIRECTORY = extern struct { pub const IMAGE_TLS_DIRECTORY64 = IMAGE_TLS_DIRECTORY; pub const IMAGE_TLS_DIRECTORY32 = IMAGE_TLS_DIRECTORY; -pub const PIMAGE_TLS_CALLBACK = ?*const fn (PVOID, DWORD, PVOID) callconv(.C) void; +pub const PIMAGE_TLS_CALLBACK = ?*const fn (PVOID, DWORD, PVOID) callconv(.winapi) void; pub const PROV_RSA_FULL = 1; @@ -3843,7 +3844,7 @@ pub const RTL_QUERY_REGISTRY_ROUTINE = ?*const fn ( ULONG, ?*anyopaque, ?*anyopaque, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; /// Path is a full path pub const RTL_REGISTRY_ABSOLUTE = 0; @@ -3940,7 +3941,7 @@ pub const FILE_ACTION_MODIFIED = 0x00000003; pub const FILE_ACTION_RENAMED_OLD_NAME = 0x00000004; pub const FILE_ACTION_RENAMED_NEW_NAME = 0x00000005; -pub const LPOVERLAPPED_COMPLETION_ROUTINE = ?*const fn (DWORD, DWORD, *OVERLAPPED) callconv(.C) void; +pub const LPOVERLAPPED_COMPLETION_ROUTINE = ?*const fn (DWORD, DWORD, *OVERLAPPED) callconv(.winapi) void; pub const FileNotifyChangeFilter = packed struct(DWORD) { file_name: bool = false, @@ -4003,7 +4004,7 @@ pub const RTL_CRITICAL_SECTION = extern struct { pub const CRITICAL_SECTION = RTL_CRITICAL_SECTION; pub const INIT_ONCE = RTL_RUN_ONCE; pub const INIT_ONCE_STATIC_INIT = RTL_RUN_ONCE_INIT; -pub const INIT_ONCE_FN = *const fn (InitOnce: *INIT_ONCE, Parameter: ?*anyopaque, Context: ?*anyopaque) callconv(.C) BOOL; +pub const INIT_ONCE_FN = *const fn (InitOnce: *INIT_ONCE, Parameter: ?*anyopaque, Context: ?*anyopaque) callconv(.winapi) BOOL; pub const RTL_RUN_ONCE = extern struct { Ptr: ?*anyopaque, @@ -4467,7 +4468,7 @@ pub const EXCEPTION_POINTERS = extern struct { ContextRecord: *CONTEXT, }; -pub const VECTORED_EXCEPTION_HANDLER = *const fn (ExceptionInfo: *EXCEPTION_POINTERS) callconv(WINAPI) c_long; +pub const VECTORED_EXCEPTION_HANDLER = *const fn (ExceptionInfo: *EXCEPTION_POINTERS) callconv(.winapi) c_long; pub const EXCEPTION_DISPOSITION = i32; pub const EXCEPTION_ROUTINE = *const fn ( @@ -4475,7 +4476,7 @@ pub const EXCEPTION_ROUTINE = *const fn ( EstablisherFrame: PVOID, ContextRecord: *(Self.CONTEXT), DispatcherContext: PVOID, -) callconv(WINAPI) EXCEPTION_DISPOSITION; +) callconv(.winapi) EXCEPTION_DISPOSITION; pub const UNWIND_HISTORY_TABLE_SIZE = 12; pub const UNWIND_HISTORY_TABLE_ENTRY = extern struct { @@ -4851,7 +4852,7 @@ pub const RTL_DRIVE_LETTER_CURDIR = extern struct { DosPath: UNICODE_STRING, }; -pub const PPS_POST_PROCESS_INIT_ROUTINE = ?*const fn () callconv(.C) void; +pub const PPS_POST_PROCESS_INIT_ROUTINE = ?*const fn () callconv(.winapi) void; pub const FILE_DIRECTORY_INFORMATION = extern struct { NextEntryOffset: ULONG, @@ -4905,7 +4906,7 @@ pub fn FileInformationIterator(comptime FileInformationType: type) type { }; } -pub const IO_APC_ROUTINE = *const fn (PVOID, *IO_STATUS_BLOCK, ULONG) callconv(.C) void; +pub const IO_APC_ROUTINE = *const fn (PVOID, *IO_STATUS_BLOCK, ULONG) callconv(.winapi) void; pub const CURDIR = extern struct { DosPath: UNICODE_STRING, @@ -5009,8 +5010,8 @@ pub const ENUM_PAGE_FILE_INFORMATION = extern struct { PeakUsage: SIZE_T, }; -pub const PENUM_PAGE_FILE_CALLBACKW = ?*const fn (?LPVOID, *ENUM_PAGE_FILE_INFORMATION, LPCWSTR) callconv(.C) BOOL; -pub const PENUM_PAGE_FILE_CALLBACKA = ?*const fn (?LPVOID, *ENUM_PAGE_FILE_INFORMATION, LPCSTR) callconv(.C) BOOL; +pub const PENUM_PAGE_FILE_CALLBACKW = ?*const fn (?LPVOID, *ENUM_PAGE_FILE_INFORMATION, LPCWSTR) callconv(.winapi) BOOL; +pub const PENUM_PAGE_FILE_CALLBACKA = ?*const fn (?LPVOID, *ENUM_PAGE_FILE_INFORMATION, LPCSTR) callconv(.winapi) BOOL; pub const PSAPI_WS_WATCH_INFORMATION_EX = extern struct { BasicInfo: PSAPI_WS_WATCH_INFORMATION, @@ -5122,7 +5123,7 @@ pub const CTRL_CLOSE_EVENT: DWORD = 2; pub const CTRL_LOGOFF_EVENT: DWORD = 5; pub const CTRL_SHUTDOWN_EVENT: DWORD = 6; -pub const HANDLER_ROUTINE = *const fn (dwCtrlType: DWORD) callconv(WINAPI) BOOL; +pub const HANDLER_ROUTINE = *const fn (dwCtrlType: DWORD) callconv(.winapi) BOOL; /// Processor feature enumeration. pub const PF = enum(DWORD) { diff --git a/lib/std/os/windows/advapi32.zig b/lib/std/os/windows/advapi32.zig index 3419fdc95ceca29d6109367fa28c6ff7e23857b9..bf438e2776726631787f7c0f52a7ded760638e36 100644 --- a/lib/std/os/windows/advapi32.zig +++ b/lib/std/os/windows/advapi32.zig @@ -8,7 +8,6 @@ const LPCWSTR = windows.LPCWSTR; const LSTATUS = windows.LSTATUS; const REGSAM = windows.REGSAM; const ULONG = windows.ULONG; -const WINAPI = windows.WINAPI; pub extern "advapi32" fn RegOpenKeyExW( hKey: HKEY, @@ -16,7 +15,7 @@ pub extern "advapi32" fn RegOpenKeyExW( ulOptions: DWORD, samDesired: REGSAM, phkResult: *HKEY, -) callconv(WINAPI) LSTATUS; +) callconv(.winapi) LSTATUS; pub extern "advapi32" fn RegQueryValueExW( hKey: HKEY, @@ -25,13 +24,13 @@ pub extern "advapi32" fn RegQueryValueExW( lpType: ?*DWORD, lpData: ?*BYTE, lpcbData: ?*DWORD, -) callconv(WINAPI) LSTATUS; +) callconv(.winapi) LSTATUS; -pub extern "advapi32" fn RegCloseKey(hKey: HKEY) callconv(WINAPI) LSTATUS; +pub extern "advapi32" fn RegCloseKey(hKey: HKEY) callconv(.winapi) LSTATUS; // RtlGenRandom is known as SystemFunction036 under advapi32 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx */ -pub extern "advapi32" fn SystemFunction036(output: [*]u8, length: ULONG) callconv(WINAPI) BOOL; +pub extern "advapi32" fn SystemFunction036(output: [*]u8, length: ULONG) callconv(.winapi) BOOL; pub const RtlGenRandom = SystemFunction036; pub const RRF = struct { @@ -62,7 +61,7 @@ pub extern "advapi32" fn RegGetValueW( pdwType: ?*DWORD, pvData: ?*anyopaque, pcbData: ?*DWORD, -) callconv(WINAPI) LSTATUS; +) callconv(.winapi) LSTATUS; pub extern "advapi32" fn RegLoadAppKeyW( lpFile: LPCWSTR, @@ -70,4 +69,4 @@ pub extern "advapi32" fn RegLoadAppKeyW( samDesired: REGSAM, dwOptions: DWORD, reserved: DWORD, -) callconv(WINAPI) LSTATUS; +) callconv(.winapi) LSTATUS; diff --git a/lib/std/os/windows/crypt32.zig b/lib/std/os/windows/crypt32.zig index 9500d4b261e24dff318430d0da48e89bdc51b25b..37d811040569e81a1a4322447dd881a2a521084f 100644 --- a/lib/std/os/windows/crypt32.zig +++ b/lib/std/os/windows/crypt32.zig @@ -4,7 +4,6 @@ const BOOL = windows.BOOL; const DWORD = windows.DWORD; const BYTE = windows.BYTE; const LPCWSTR = windows.LPCWSTR; -const WINAPI = windows.WINAPI; pub const CERT_INFO = *opaque {}; pub const HCERTSTORE = *opaque {}; @@ -19,14 +18,14 @@ pub const CERT_CONTEXT = extern struct { pub extern "crypt32" fn CertOpenSystemStoreW( _: ?*const anyopaque, szSubsystemProtocol: LPCWSTR, -) callconv(WINAPI) ?HCERTSTORE; +) callconv(.winapi) ?HCERTSTORE; pub extern "crypt32" fn CertCloseStore( hCertStore: HCERTSTORE, dwFlags: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "crypt32" fn CertEnumCertificatesInStore( hCertStore: HCERTSTORE, pPrevCertContext: ?*CERT_CONTEXT, -) callconv(WINAPI) ?*CERT_CONTEXT; +) callconv(.winapi) ?*CERT_CONTEXT; diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig index b8ae72af55716923d6c3165a9e0fefae51391580..f2da7957a802d39d3ea82d4e38f1798949bd95a2 100644 --- a/lib/std/os/windows/kernel32.zig +++ b/lib/std/os/windows/kernel32.zig @@ -41,7 +41,6 @@ const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER; const WCHAR = windows.WCHAR; const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW; const Win32Error = windows.Win32Error; -const WINAPI = windows.WINAPI; const WORD = windows.WORD; // I/O - Filesystem @@ -55,18 +54,18 @@ pub extern "kernel32" fn ReadDirectoryChangesW( lpBytesReturned: ?*windows.DWORD, lpOverlapped: ?*windows.OVERLAPPED, lpCompletionRoutine: windows.LPOVERLAPPED_COMPLETION_ROUTINE, -) callconv(windows.WINAPI) windows.BOOL; +) callconv(.winapi) windows.BOOL; // TODO: Wrapper around NtCancelIoFile. pub extern "kernel32" fn CancelIo( hFile: HANDLE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtCancelIoFileEx. pub extern "kernel32" fn CancelIoEx( hFile: HANDLE, lpOverlapped: ?*OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn CreateFileW( lpFileName: LPCWSTR, @@ -76,7 +75,7 @@ pub extern "kernel32" fn CreateFileW( dwCreationDisposition: DWORD, dwFlagsAndAttributes: DWORD, hTemplateFile: ?HANDLE, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; // TODO A bunch of logic around NtCreateNamedPipe pub extern "kernel32" fn CreateNamedPipeW( @@ -88,16 +87,16 @@ pub extern "kernel32" fn CreateNamedPipeW( nInBufferSize: DWORD, nDefaultTimeOut: DWORD, lpSecurityAttributes: ?*const SECURITY_ATTRIBUTES, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; pub extern "kernel32" fn FindFirstFileW( lpFileName: LPCWSTR, lpFindFileData: *WIN32_FIND_DATAW, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; pub extern "kernel32" fn FindClose( hFindFile: HANDLE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around RtlGetFullPathName_UEx pub extern "kernel32" fn GetFullPathNameW( @@ -105,18 +104,18 @@ pub extern "kernel32" fn GetFullPathNameW( nBufferLength: DWORD, lpBuffer: LPWSTR, lpFilePart: ?*?LPWSTR, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: Matches `STD_*_HANDLE` to peb().ProcessParameters.Standard* pub extern "kernel32" fn GetStdHandle( nStdHandle: DWORD, -) callconv(WINAPI) ?HANDLE; +) callconv(.winapi) ?HANDLE; pub extern "kernel32" fn MoveFileExW( lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtSetInformationFile + `FILE_POSITION_INFORMATION`. // `FILE_STANDARD_INFORMATION` is also used if dwMoveMethod is `FILE_END` @@ -125,7 +124,7 @@ pub extern "kernel32" fn SetFilePointerEx( liDistanceToMove: LARGE_INTEGER, lpNewFilePointer: ?*LARGE_INTEGER, dwMoveMethod: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtSetInformationFile + `FILE_BASIC_INFORMATION` pub extern "kernel32" fn SetFileTime( @@ -133,7 +132,7 @@ pub extern "kernel32" fn SetFileTime( lpCreationTime: ?*const FILETIME, lpLastAccessTime: ?*const FILETIME, lpLastWriteTime: ?*const FILETIME, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn WriteFile( in_hFile: HANDLE, @@ -141,35 +140,35 @@ pub extern "kernel32" fn WriteFile( in_nNumberOfBytesToWrite: DWORD, out_lpNumberOfBytesWritten: ?*DWORD, in_out_lpOverlapped: ?*OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: wrapper for NtQueryInformationFile + `FILE_STANDARD_INFORMATION` pub extern "kernel32" fn GetFileSizeEx( hFile: HANDLE, lpFileSize: *LARGE_INTEGER, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around GetStdHandle + NtFlushBuffersFile. pub extern "kernel32" fn FlushFileBuffers( hFile: HANDLE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtSetInformationFile + `FILE_IO_COMPLETION_NOTIFICATION_INFORMATION`. pub extern "kernel32" fn SetFileCompletionNotificationModes( FileHandle: HANDLE, Flags: UCHAR, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: `RtlGetCurrentDirectory_U(nBufferLength * 2, lpBuffer)` pub extern "kernel32" fn GetCurrentDirectoryW( nBufferLength: DWORD, lpBuffer: ?[*]WCHAR, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: RtlDosPathNameToNtPathNameU_WithStatus + NtQueryAttributesFile. pub extern "kernel32" fn GetFileAttributesW( lpFileName: LPCWSTR, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; pub extern "kernel32" fn ReadFile( hFile: HANDLE, @@ -177,12 +176,12 @@ pub extern "kernel32" fn ReadFile( nNumberOfBytesToRead: DWORD, lpNumberOfBytesRead: ?*DWORD, lpOverlapped: ?*OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn GetSystemDirectoryW( lpBuffer: LPWSTR, uSize: UINT, -) callconv(WINAPI) UINT; +) callconv(.winapi) UINT; // I/O - Kernel Objects @@ -192,7 +191,7 @@ pub extern "kernel32" fn CreateEventExW( lpName: ?LPCWSTR, dwFlags: DWORD, dwDesiredAccess: DWORD, -) callconv(WINAPI) ?HANDLE; +) callconv(.winapi) ?HANDLE; // TODO: Wrapper around GetStdHandle + NtDuplicateObject. pub extern "kernel32" fn DuplicateHandle( @@ -203,14 +202,14 @@ pub extern "kernel32" fn DuplicateHandle( dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwOptions: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around GetStdHandle + NtQueryObject + NtSetInformationObject with .ObjectHandleFlagInformation. pub extern "kernel32" fn SetHandleInformation( hObject: HANDLE, dwMask: DWORD, dwFlags: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtRemoveIoCompletion. pub extern "kernel32" fn GetQueuedCompletionStatus( @@ -219,7 +218,7 @@ pub extern "kernel32" fn GetQueuedCompletionStatus( lpCompletionKey: *ULONG_PTR, lpOverlapped: *?*OVERLAPPED, dwMilliseconds: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtRemoveIoCompletionEx. pub extern "kernel32" fn GetQueuedCompletionStatusEx( @@ -229,7 +228,7 @@ pub extern "kernel32" fn GetQueuedCompletionStatusEx( ulNumEntriesRemoved: *ULONG, dwMilliseconds: DWORD, fAlertable: BOOL, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtSetIoCompletion with `IoStatus = .SUCCESS`. pub extern "kernel32" fn PostQueuedCompletionStatus( @@ -237,7 +236,7 @@ pub extern "kernel32" fn PostQueuedCompletionStatus( dwNumberOfBytesTransferred: DWORD, dwCompletionKey: ULONG_PTR, lpOverlapped: ?*OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: // GetOverlappedResultEx with bAlertable=false, which calls: GetStdHandle + WaitForSingleObjectEx. @@ -247,7 +246,7 @@ pub extern "kernel32" fn GetOverlappedResult( lpOverlapped: *OVERLAPPED, lpNumberOfBytesTransferred: *DWORD, bWait: BOOL, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtCreateIoCompletion + NtSetInformationFile with FILE_COMPLETION_INFORMATION. // This would be better splitting into two functions. @@ -256,30 +255,30 @@ pub extern "kernel32" fn CreateIoCompletionPort( ExistingCompletionPort: ?HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD, -) callconv(WINAPI) ?HANDLE; +) callconv(.winapi) ?HANDLE; // TODO: Forwarder to NtAddVectoredExceptionHandler. pub extern "kernel32" fn AddVectoredExceptionHandler( First: ULONG, Handler: ?VECTORED_EXCEPTION_HANDLER, -) callconv(WINAPI) ?LPVOID; +) callconv(.winapi) ?LPVOID; // TODO: Forwarder to NtRemoveVectoredExceptionHandler. pub extern "kernel32" fn RemoveVectoredExceptionHandler( Handle: HANDLE, -) callconv(WINAPI) ULONG; +) callconv(.winapi) ULONG; // TODO: Wrapper around RtlReportSilentProcessExit + NtTerminateProcess. pub extern "kernel32" fn TerminateProcess( hProcess: HANDLE, uExitCode: UINT, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: WaitForSingleObjectEx with bAlertable=false. pub extern "kernel32" fn WaitForSingleObject( hHandle: HANDLE, dwMilliseconds: DWORD, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: Wrapper for GetStdHandle + NtWaitForSingleObject. // Sets up an activation context before calling NtWaitForSingleObject. @@ -287,7 +286,7 @@ pub extern "kernel32" fn WaitForSingleObjectEx( hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: WaitForMultipleObjectsEx with alertable=false pub extern "kernel32" fn WaitForMultipleObjects( @@ -295,7 +294,7 @@ pub extern "kernel32" fn WaitForMultipleObjects( lpHandle: [*]const HANDLE, bWaitAll: BOOL, dwMilliseconds: DWORD, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: Wrapper around NtWaitForMultipleObjects. pub extern "kernel32" fn WaitForMultipleObjectsEx( @@ -304,7 +303,7 @@ pub extern "kernel32" fn WaitForMultipleObjectsEx( bWaitAll: BOOL, dwMilliseconds: DWORD, bAlertable: BOOL, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // Process Management @@ -319,57 +318,57 @@ pub extern "kernel32" fn CreateProcessW( lpCurrentDirectory: ?LPCWSTR, lpStartupInfo: *STARTUPINFOW, lpProcessInformation: *PROCESS_INFORMATION, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Fowarder to RtlExitUserProcess. pub extern "kernel32" fn ExitProcess( exit_code: UINT, -) callconv(WINAPI) noreturn; +) callconv(.winapi) noreturn; // TODO: SleepEx with bAlertable=false. pub extern "kernel32" fn Sleep( dwMilliseconds: DWORD, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Wrapper around NtQueryInformationProcess with `PROCESS_BASIC_INFORMATION`. pub extern "kernel32" fn GetExitCodeProcess( hProcess: HANDLE, lpExitCode: *DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Already a wrapper for this, see `windows.GetCurrentProcess`. -pub extern "kernel32" fn GetCurrentProcess() callconv(WINAPI) HANDLE; +pub extern "kernel32" fn GetCurrentProcess() callconv(.winapi) HANDLE; // TODO: memcpy peb().ProcessParameters.Environment, mem.span(0). Requires locking the PEB. -pub extern "kernel32" fn GetEnvironmentStringsW() callconv(WINAPI) ?LPWSTR; +pub extern "kernel32" fn GetEnvironmentStringsW() callconv(.winapi) ?LPWSTR; // TODO: RtlFreeHeap on the output of GetEnvironmentStringsW. pub extern "kernel32" fn FreeEnvironmentStringsW( penv: LPWSTR, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around RtlQueryEnvironmentVariable. pub extern "kernel32" fn GetEnvironmentVariableW( lpName: ?LPCWSTR, lpBuffer: ?[*]WCHAR, nSize: DWORD, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: Wrapper around RtlSetEnvironmentVar. pub extern "kernel32" fn SetEnvironmentVariableW( lpName: LPCWSTR, lpValue: ?LPCWSTR, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn CreateToolhelp32Snapshot( dwFlags: DWORD, th32ProcessID: DWORD, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; // Threading // TODO: Already a wrapper for this, see `windows.GetCurrentThreadId`. -pub extern "kernel32" fn GetCurrentThreadId() callconv(WINAPI) DWORD; +pub extern "kernel32" fn GetCurrentThreadId() callconv(.winapi) DWORD; // TODO: CreateRemoteThread with hProcess=NtCurrentProcess(). pub extern "kernel32" fn CreateThread( @@ -379,64 +378,64 @@ pub extern "kernel32" fn CreateThread( lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?*DWORD, -) callconv(WINAPI) ?HANDLE; +) callconv(.winapi) ?HANDLE; // TODO: Wrapper around RtlDelayExecution. -pub extern "kernel32" fn SwitchToThread() callconv(WINAPI) BOOL; +pub extern "kernel32" fn SwitchToThread() callconv(.winapi) BOOL; // Locks, critical sections, initializers // TODO: Forwarder to RtlInitializeCriticalSection pub extern "kernel32" fn InitializeCriticalSection( lpCriticalSection: *CRITICAL_SECTION, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlEnterCriticalSection pub extern "kernel32" fn EnterCriticalSection( lpCriticalSection: *CRITICAL_SECTION, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlLeaveCriticalSection pub extern "kernel32" fn LeaveCriticalSection( lpCriticalSection: *CRITICAL_SECTION, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlDeleteCriticalSection pub extern "kernel32" fn DeleteCriticalSection( lpCriticalSection: *CRITICAL_SECTION, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlTryAcquireSRWLockExclusive pub extern "kernel32" fn TryAcquireSRWLockExclusive( SRWLock: *SRWLOCK, -) callconv(WINAPI) BOOLEAN; +) callconv(.winapi) BOOLEAN; // TODO: Forwarder to RtlAcquireSRWLockExclusive pub extern "kernel32" fn AcquireSRWLockExclusive( SRWLock: *SRWLOCK, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlReleaseSRWLockExclusive pub extern "kernel32" fn ReleaseSRWLockExclusive( SRWLock: *SRWLOCK, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "kernel32" fn InitOnceExecuteOnce( InitOnce: *INIT_ONCE, InitFn: INIT_ONCE_FN, Parameter: ?*anyopaque, Context: ?*anyopaque, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Forwarder to RtlWakeConditionVariable pub extern "kernel32" fn WakeConditionVariable( ConditionVariable: *CONDITION_VARIABLE, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: Forwarder to RtlWakeAllConditionVariable pub extern "kernel32" fn WakeAllConditionVariable( ConditionVariable: *CONDITION_VARIABLE, -) callconv(WINAPI) void; +) callconv(.winapi) void; // TODO: // - dwMilliseconds -> LARGE_INTEGER. @@ -447,40 +446,40 @@ pub extern "kernel32" fn SleepConditionVariableSRW( SRWLock: *SRWLOCK, dwMilliseconds: DWORD, Flags: ULONG, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // Console management pub extern "kernel32" fn GetConsoleMode( hConsoleHandle: HANDLE, lpMode: *DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn SetConsoleMode( hConsoleHandle: HANDLE, dwMode: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn GetConsoleScreenBufferInfo( hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: *CONSOLE_SCREEN_BUFFER_INFO, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn SetConsoleTextAttribute( hConsoleOutput: HANDLE, wAttributes: WORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn SetConsoleCtrlHandler( HandlerRoutine: ?HANDLER_ROUTINE, Add: BOOL, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn SetConsoleOutputCP( wCodePageID: UINT, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; -pub extern "kernel32" fn GetConsoleOutputCP() callconv(WINAPI) UINT; +pub extern "kernel32" fn GetConsoleOutputCP() callconv(.winapi) UINT; pub extern "kernel32" fn FillConsoleOutputAttribute( hConsoleOutput: HANDLE, @@ -488,7 +487,7 @@ pub extern "kernel32" fn FillConsoleOutputAttribute( nLength: DWORD, dwWriteCoord: COORD, lpNumberOfAttrsWritten: *DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn FillConsoleOutputCharacterW( hConsoleOutput: HANDLE, @@ -496,12 +495,12 @@ pub extern "kernel32" fn FillConsoleOutputCharacterW( nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: *DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn SetConsoleCursorPosition( hConsoleOutput: HANDLE, dwCursorPosition: COORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn WriteConsoleW( hConsoleOutput: HANDLE, @@ -509,7 +508,7 @@ pub extern "kernel32" fn WriteConsoleW( nNumberOfCharsToWrite: DWORD, lpNumberOfCharsWritten: ?*DWORD, lpReserved: ?LPVOID, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn ReadConsoleOutputCharacterW( hConsoleOutput: HANDLE, @@ -517,7 +516,7 @@ pub extern "kernel32" fn ReadConsoleOutputCharacterW( nLength: DWORD, dwReadCoord: COORD, lpNumberOfCharsRead: *DWORD, -) callconv(windows.WINAPI) BOOL; +) callconv(.winapi) BOOL; // Memory Mapping/Allocation @@ -526,12 +525,12 @@ pub extern "kernel32" fn HeapCreate( flOptions: DWORD, dwInitialSize: SIZE_T, dwMaximumSize: SIZE_T, -) callconv(WINAPI) ?HANDLE; +) callconv(.winapi) ?HANDLE; // TODO: Wrapper around RtlDestroyHeap (BOOLEAN -> BOOL). pub extern "kernel32" fn HeapDestroy( hHeap: HANDLE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Forwarder to RtlReAllocateHeap. pub extern "kernel32" fn HeapReAlloc( @@ -539,28 +538,28 @@ pub extern "kernel32" fn HeapReAlloc( dwFlags: DWORD, lpMem: *anyopaque, dwBytes: SIZE_T, -) callconv(WINAPI) ?*anyopaque; +) callconv(.winapi) ?*anyopaque; // TODO: Fowrarder to RtlAllocateHeap. pub extern "kernel32" fn HeapAlloc( hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T, -) callconv(WINAPI) ?*anyopaque; +) callconv(.winapi) ?*anyopaque; // TODO: Fowrarder to RtlFreeHeap. pub extern "kernel32" fn HeapFree( hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around RtlValidateHeap (BOOLEAN -> BOOL) pub extern "kernel32" fn HeapValidate( hHeap: HANDLE, dwFlags: DWORD, lpMem: ?*const anyopaque, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtAllocateVirtualMemory. pub extern "kernel32" fn VirtualAlloc( @@ -568,7 +567,7 @@ pub extern "kernel32" fn VirtualAlloc( dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD, -) callconv(WINAPI) ?LPVOID; +) callconv(.winapi) ?LPVOID; // TODO: Wrapper around NtFreeVirtualMemory. // If the return value is .INVALID_PAGE_PROTECTION, calls RtlFlushSecureMemoryCache and try again. @@ -576,21 +575,21 @@ pub extern "kernel32" fn VirtualFree( lpAddress: ?LPVOID, dwSize: SIZE_T, dwFreeType: DWORD, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // TODO: Wrapper around NtQueryVirtualMemory. pub extern "kernel32" fn VirtualQuery( lpAddress: ?LPVOID, lpBuffer: PMEMORY_BASIC_INFORMATION, dwLength: SIZE_T, -) callconv(WINAPI) SIZE_T; +) callconv(.winapi) SIZE_T; pub extern "kernel32" fn LocalFree( hMem: HLOCAL, -) callconv(WINAPI) ?HLOCAL; +) callconv(.winapi) ?HLOCAL; // TODO: Getter for peb.ProcessHeap -pub extern "kernel32" fn GetProcessHeap() callconv(WINAPI) ?HANDLE; +pub extern "kernel32" fn GetProcessHeap() callconv(.winapi) ?HANDLE; // Code Libraries/Modules @@ -599,49 +598,49 @@ pub extern "kernel32" fn GetModuleFileNameW( hModule: ?HMODULE, lpFilename: [*]WCHAR, nSize: DWORD, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; extern "kernel32" fn K32GetModuleFileNameExW( hProcess: HANDLE, hModule: ?HMODULE, lpFilename: LPWSTR, nSize: DWORD, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; pub const GetModuleFileNameExW = K32GetModuleFileNameExW; // TODO: Wrapper around ntdll.LdrGetDllHandle, which is a wrapper around LdrGetDllHandleEx pub extern "kernel32" fn GetModuleHandleW( lpModuleName: ?LPCWSTR, -) callconv(WINAPI) ?HMODULE; +) callconv(.winapi) ?HMODULE; pub extern "kernel32" fn Module32First( hSnapshot: HANDLE, lpme: *MODULEENTRY32, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn Module32Next( hSnapshot: HANDLE, lpme: *MODULEENTRY32, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "kernel32" fn LoadLibraryW( lpLibFileName: LPCWSTR, -) callconv(WINAPI) ?HMODULE; +) callconv(.winapi) ?HMODULE; pub extern "kernel32" fn LoadLibraryExW( lpLibFileName: LPCWSTR, hFile: ?HANDLE, dwFlags: DWORD, -) callconv(WINAPI) ?HMODULE; +) callconv(.winapi) ?HMODULE; pub extern "kernel32" fn GetProcAddress( hModule: HMODULE, lpProcName: LPCSTR, -) callconv(WINAPI) ?FARPROC; +) callconv(.winapi) ?FARPROC; pub extern "kernel32" fn FreeLibrary( hModule: HMODULE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; // Error Management @@ -653,15 +652,15 @@ pub extern "kernel32" fn FormatMessageW( lpBuffer: LPWSTR, nSize: DWORD, Arguments: ?*va_list, -) callconv(WINAPI) DWORD; +) callconv(.winapi) DWORD; // TODO: Getter for teb().LastErrorValue. -pub extern "kernel32" fn GetLastError() callconv(WINAPI) Win32Error; +pub extern "kernel32" fn GetLastError() callconv(.winapi) Win32Error; // TODO: Wrapper around RtlSetLastWin32Error. pub extern "kernel32" fn SetLastError( dwErrCode: Win32Error, -) callconv(WINAPI) void; +) callconv(.winapi) void; // Everything Else @@ -670,4 +669,4 @@ pub extern "kernel32" fn SetLastError( // Much better to use NtQuerySystemTime or NtQuerySystemTimePrecise for guaranteed 0.1ns precision. pub extern "kernel32" fn GetSystemTimeAsFileTime( lpSystemTimeAsFileTime: *FILETIME, -) callconv(WINAPI) void; +) callconv(.winapi) void; diff --git a/lib/std/os/windows/ntdll.zig b/lib/std/os/windows/ntdll.zig index 4683b1e887c8a544e24798273954d5723e44fc27..b4c33a2e2d7151a57367efb3d34c063870780245 100644 --- a/lib/std/os/windows/ntdll.zig +++ b/lib/std/os/windows/ntdll.zig @@ -5,7 +5,6 @@ const BOOL = windows.BOOL; const DWORD = windows.DWORD; const DWORD64 = windows.DWORD64; const ULONG = windows.ULONG; -const WINAPI = windows.WINAPI; const NTSTATUS = windows.NTSTATUS; const WORD = windows.WORD; const HANDLE = windows.HANDLE; @@ -44,7 +43,7 @@ pub extern "ntdll" fn NtQueryInformationProcess( ProcessInformation: *anyopaque, ProcessInformationLength: ULONG, ReturnLength: ?*ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtQueryInformationThread( ThreadHandle: HANDLE, @@ -52,37 +51,37 @@ pub extern "ntdll" fn NtQueryInformationThread( ThreadInformation: *anyopaque, ThreadInformationLength: ULONG, ReturnLength: ?*ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtQuerySystemInformation( SystemInformationClass: SYSTEM_INFORMATION_CLASS, SystemInformation: PVOID, SystemInformationLength: ULONG, ReturnLength: ?*ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtSetInformationThread( ThreadHandle: HANDLE, ThreadInformationClass: THREADINFOCLASS, ThreadInformation: *const anyopaque, ThreadInformationLength: ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlGetVersion( lpVersionInformation: *RTL_OSVERSIONINFOW, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlCaptureStackBackTrace( FramesToSkip: DWORD, FramesToCapture: DWORD, BackTrace: **anyopaque, BackTraceHash: ?*DWORD, -) callconv(WINAPI) WORD; -pub extern "ntdll" fn RtlCaptureContext(ContextRecord: *CONTEXT) callconv(WINAPI) void; +) callconv(.winapi) WORD; +pub extern "ntdll" fn RtlCaptureContext(ContextRecord: *CONTEXT) callconv(.winapi) void; pub extern "ntdll" fn RtlLookupFunctionEntry( ControlPc: DWORD64, ImageBase: *DWORD64, HistoryTable: *UNWIND_HISTORY_TABLE, -) callconv(WINAPI) ?*RUNTIME_FUNCTION; +) callconv(.winapi) ?*RUNTIME_FUNCTION; pub extern "ntdll" fn RtlVirtualUnwind( HandlerType: DWORD, ImageBase: DWORD64, @@ -92,33 +91,33 @@ pub extern "ntdll" fn RtlVirtualUnwind( HandlerData: *?PVOID, EstablisherFrame: *DWORD64, ContextPointers: ?*KNONVOLATILE_CONTEXT_POINTERS, -) callconv(WINAPI) *EXCEPTION_ROUTINE; +) callconv(.winapi) *EXCEPTION_ROUTINE; pub extern "ntdll" fn NtQueryInformationFile( FileHandle: HANDLE, IoStatusBlock: *IO_STATUS_BLOCK, FileInformation: *anyopaque, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtSetInformationFile( FileHandle: HANDLE, IoStatusBlock: *IO_STATUS_BLOCK, FileInformation: PVOID, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtQueryAttributesFile( ObjectAttributes: *OBJECT_ATTRIBUTES, FileAttributes: *FILE_BASIC_INFORMATION, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; -pub extern "ntdll" fn RtlQueryPerformanceCounter(PerformanceCounter: *LARGE_INTEGER) callconv(WINAPI) BOOL; -pub extern "ntdll" fn RtlQueryPerformanceFrequency(PerformanceFrequency: *LARGE_INTEGER) callconv(WINAPI) BOOL; +pub extern "ntdll" fn RtlQueryPerformanceCounter(PerformanceCounter: *LARGE_INTEGER) callconv(.winapi) BOOL; +pub extern "ntdll" fn RtlQueryPerformanceFrequency(PerformanceFrequency: *LARGE_INTEGER) callconv(.winapi) BOOL; pub extern "ntdll" fn NtQueryPerformanceCounter( PerformanceCounter: *LARGE_INTEGER, PerformanceFrequency: ?*LARGE_INTEGER, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtCreateFile( FileHandle: *HANDLE, @@ -132,7 +131,7 @@ pub extern "ntdll" fn NtCreateFile( CreateOptions: ULONG, EaBuffer: ?*anyopaque, EaLength: ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtCreateSection( SectionHandle: *HANDLE, DesiredAccess: ACCESS_MASK, @@ -141,7 +140,7 @@ pub extern "ntdll" fn NtCreateSection( SectionPageProtection: ULONG, AllocationAttributes: ULONG, FileHandle: ?HANDLE, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtMapViewOfSection( SectionHandle: HANDLE, ProcessHandle: HANDLE, @@ -153,11 +152,11 @@ pub extern "ntdll" fn NtMapViewOfSection( InheritDispostion: SECTION_INHERIT, AllocationType: ULONG, Win32Protect: ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtUnmapViewOfSection( ProcessHandle: HANDLE, BaseAddress: PVOID, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtDeviceIoControlFile( FileHandle: HANDLE, Event: ?HANDLE, @@ -169,7 +168,7 @@ pub extern "ntdll" fn NtDeviceIoControlFile( InputBufferLength: ULONG, OutputBuffer: ?PVOID, OutputBufferLength: ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtFsControlFile( FileHandle: HANDLE, Event: ?HANDLE, @@ -181,15 +180,15 @@ pub extern "ntdll" fn NtFsControlFile( InputBufferLength: ULONG, OutputBuffer: ?PVOID, OutputBufferLength: ULONG, -) callconv(WINAPI) NTSTATUS; -pub extern "ntdll" fn NtClose(Handle: HANDLE) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; +pub extern "ntdll" fn NtClose(Handle: HANDLE) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlDosPathNameToNtPathName_U( DosPathName: [*:0]const u16, NtPathName: *UNICODE_STRING, NtFileNamePart: ?*?[*:0]const u16, DirectoryInfo: ?*CURDIR, -) callconv(WINAPI) BOOL; -pub extern "ntdll" fn RtlFreeUnicodeString(UnicodeString: *UNICODE_STRING) callconv(WINAPI) void; +) callconv(.winapi) BOOL; +pub extern "ntdll" fn RtlFreeUnicodeString(UnicodeString: *UNICODE_STRING) callconv(.winapi) void; /// Returns the number of bytes written to `Buffer`. /// If the returned count is larger than `BufferByteLength`, the buffer was too small. @@ -199,7 +198,7 @@ pub extern "ntdll" fn RtlGetFullPathName_U( BufferByteLength: ULONG, Buffer: [*]u16, ShortName: ?*[*:0]const u16, -) callconv(windows.WINAPI) windows.ULONG; +) callconv(.winapi) windows.ULONG; pub extern "ntdll" fn NtQueryDirectoryFile( FileHandle: HANDLE, @@ -213,30 +212,30 @@ pub extern "ntdll" fn NtQueryDirectoryFile( ReturnSingleEntry: BOOLEAN, FileName: ?*UNICODE_STRING, RestartScan: BOOLEAN, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtCreateKeyedEvent( KeyedEventHandle: *HANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: ?PVOID, Flags: ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtReleaseKeyedEvent( EventHandle: ?HANDLE, Key: ?*const anyopaque, Alertable: BOOLEAN, Timeout: ?*const LARGE_INTEGER, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtWaitForKeyedEvent( EventHandle: ?HANDLE, Key: ?*const anyopaque, Alertable: BOOLEAN, Timeout: ?*const LARGE_INTEGER, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; -pub extern "ntdll" fn RtlSetCurrentDirectory_U(PathName: *UNICODE_STRING) callconv(WINAPI) NTSTATUS; +pub extern "ntdll" fn RtlSetCurrentDirectory_U(PathName: *UNICODE_STRING) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtQueryObject( Handle: HANDLE, @@ -244,7 +243,7 @@ pub extern "ntdll" fn NtQueryObject( ObjectInformation: PVOID, ObjectInformationLength: ULONG, ReturnLength: ?*ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtQueryVolumeInformationFile( FileHandle: HANDLE, @@ -252,32 +251,32 @@ pub extern "ntdll" fn NtQueryVolumeInformationFile( FsInformation: *anyopaque, Length: ULONG, FsInformationClass: FS_INFORMATION_CLASS, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlWakeAddressAll( Address: ?*const anyopaque, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "ntdll" fn RtlWakeAddressSingle( Address: ?*const anyopaque, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "ntdll" fn RtlWaitOnAddress( Address: ?*const anyopaque, CompareAddress: ?*const anyopaque, AddressSize: SIZE_T, Timeout: ?*const LARGE_INTEGER, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlEqualUnicodeString( String1: *const UNICODE_STRING, String2: *const UNICODE_STRING, CaseInSensitive: BOOLEAN, -) callconv(WINAPI) BOOLEAN; +) callconv(.winapi) BOOLEAN; pub extern "ntdll" fn RtlUpcaseUnicodeChar( SourceCharacter: u16, -) callconv(WINAPI) u16; +) callconv(.winapi) u16; pub extern "ntdll" fn NtLockFile( FileHandle: HANDLE, @@ -290,7 +289,7 @@ pub extern "ntdll" fn NtLockFile( Key: ?*ULONG, FailImmediately: BOOLEAN, ExclusiveLock: BOOLEAN, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtUnlockFile( FileHandle: HANDLE, @@ -298,13 +297,13 @@ pub extern "ntdll" fn NtUnlockFile( ByteOffset: *const LARGE_INTEGER, Length: *const LARGE_INTEGER, Key: ?*ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtOpenKey( KeyHandle: *HANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: OBJECT_ATTRIBUTES, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlQueryRegistryValues( RelativeTo: ULONG, @@ -312,7 +311,7 @@ pub extern "ntdll" fn RtlQueryRegistryValues( QueryTable: [*]RTL_QUERY_REGISTRY_TABLE, Context: ?*anyopaque, Environment: ?*anyopaque, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtReadVirtualMemory( ProcessHandle: HANDLE, @@ -320,7 +319,7 @@ pub extern "ntdll" fn NtReadVirtualMemory( Buffer: LPVOID, NumberOfBytesToRead: SIZE_T, NumberOfBytesRead: ?*SIZE_T, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtWriteVirtualMemory( ProcessHandle: HANDLE, @@ -328,7 +327,7 @@ pub extern "ntdll" fn NtWriteVirtualMemory( Buffer: LPCVOID, NumberOfBytesToWrite: SIZE_T, NumberOfBytesWritten: ?*SIZE_T, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn NtProtectVirtualMemory( ProcessHandle: HANDLE, @@ -336,11 +335,11 @@ pub extern "ntdll" fn NtProtectVirtualMemory( NumberOfBytesToProtect: *SIZE_T, NewAccessProtection: ULONG, OldAccessProtection: *ULONG, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; pub extern "ntdll" fn RtlExitUserProcess( ExitStatus: u32, -) callconv(WINAPI) noreturn; +) callconv(.winapi) noreturn; pub extern "ntdll" fn NtCreateNamedPipeFile( FileHandle: *HANDLE, @@ -357,4 +356,4 @@ pub extern "ntdll" fn NtCreateNamedPipeFile( InboundQuota: ULONG, OutboundQuota: ULONG, DefaultTimeout: *LARGE_INTEGER, -) callconv(WINAPI) NTSTATUS; +) callconv(.winapi) NTSTATUS; diff --git a/lib/std/os/windows/test.zig b/lib/std/os/windows/test.zig index acaa7d12180f085218a86ee61f156cca2001030f..b4cecefbd771ea3c5ddb00d4a8878ddf0ac6eaed 100644 --- a/lib/std/os/windows/test.zig +++ b/lib/std/os/windows/test.zig @@ -250,7 +250,7 @@ test "loadWinsockExtensionFunction" { SendBufLen: windows.DWORD, BytesSent: *windows.DWORD, Overlapped: *windows.OVERLAPPED, - ) callconv(windows.WINAPI) windows.BOOL; + ) callconv(.winapi) windows.BOOL; _ = windows.loadWinsockExtensionFunction( LPFN_CONNECTEX, diff --git a/lib/std/os/windows/ws2_32.zig b/lib/std/os/windows/ws2_32.zig index f3a1fdca84acb0ad2cb1aca2bef1cc0ac9ecb3f7..e8375dc2c11f3b43a5684466802a2c6edcea5497 100644 --- a/lib/std/os/windows/ws2_32.zig +++ b/lib/std/os/windows/ws2_32.zig @@ -2,7 +2,6 @@ const std = @import("../../std.zig"); const assert = std.debug.assert; const windows = std.os.windows; -const WINAPI = windows.WINAPI; const OVERLAPPED = windows.OVERLAPPED; const WORD = windows.WORD; const DWORD = windows.DWORD; @@ -958,14 +957,14 @@ pub const LPCONDITIONPROC = *const fn ( lpCalleeData: *WSABUF, g: *u32, dwCallbackData: usize, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub const LPWSAOVERLAPPED_COMPLETION_ROUTINE = *const fn ( dwError: u32, cbTransferred: u32, lpOverlapped: *OVERLAPPED, dwFlags: u32, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub const FLOWSPEC = extern struct { TokenRate: u32, @@ -1196,7 +1195,7 @@ pub const LPFN_TRANSMITFILE = *const fn ( lpOverlapped: ?*OVERLAPPED, lpTransmitBuffers: ?*TRANSMIT_FILE_BUFFERS, dwReserved: u32, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub const LPFN_ACCEPTEX = *const fn ( sListenSocket: SOCKET, @@ -1207,7 +1206,7 @@ pub const LPFN_ACCEPTEX = *const fn ( dwRemoteAddressLength: u32, lpdwBytesReceived: *u32, lpOverlapped: *OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub const LPFN_GETACCEPTEXSOCKADDRS = *const fn ( lpOutputBuffer: *anyopaque, @@ -1218,7 +1217,7 @@ pub const LPFN_GETACCEPTEXSOCKADDRS = *const fn ( LocalSockaddrLength: *i32, RemoteSockaddr: **sockaddr, RemoteSockaddrLength: *i32, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub const LPFN_WSASENDMSG = *const fn ( s: SOCKET, @@ -1227,7 +1226,7 @@ pub const LPFN_WSASENDMSG = *const fn ( lpNumberOfBytesSent: ?*u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub const LPFN_WSARECVMSG = *const fn ( s: SOCKET, @@ -1235,12 +1234,12 @@ pub const LPFN_WSARECVMSG = *const fn ( lpdwNumberOfBytesRecv: ?*u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub const LPSERVICE_CALLBACK_PROC = *const fn ( lParam: LPARAM, hAsyncTaskHandle: HANDLE, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub const SERVICE_ASYNC_INFO = extern struct { lpServiceCallbackProc: LPSERVICE_CALLBACK_PROC, @@ -1252,7 +1251,7 @@ pub const LPLOOKUPSERVICE_COMPLETION_ROUTINE = *const fn ( dwError: u32, dwBytes: u32, lpOverlapped: *OVERLAPPED, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub const fd_set = extern struct { fd_count: u32, @@ -1725,41 +1724,41 @@ pub extern "ws2_32" fn accept( s: SOCKET, addr: ?*sockaddr, addrlen: ?*i32, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; pub extern "ws2_32" fn bind( s: SOCKET, name: *const sockaddr, namelen: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn closesocket( s: SOCKET, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn connect( s: SOCKET, name: *const sockaddr, namelen: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn ioctlsocket( s: SOCKET, cmd: i32, argp: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn getpeername( s: SOCKET, name: *sockaddr, namelen: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn getsockname( s: SOCKET, name: *sockaddr, namelen: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn getsockopt( s: SOCKET, @@ -1767,39 +1766,39 @@ pub extern "ws2_32" fn getsockopt( optname: i32, optval: [*]u8, optlen: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn htonl( hostlong: u32, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; pub extern "ws2_32" fn htons( hostshort: u16, -) callconv(WINAPI) u16; +) callconv(.winapi) u16; pub extern "ws2_32" fn inet_addr( cp: ?[*]const u8, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; pub extern "ws2_32" fn listen( s: SOCKET, backlog: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn ntohl( netlong: u32, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; pub extern "ws2_32" fn ntohs( netshort: u16, -) callconv(WINAPI) u16; +) callconv(.winapi) u16; pub extern "ws2_32" fn recv( s: SOCKET, buf: [*]u8, len: i32, flags: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn recvfrom( s: SOCKET, @@ -1808,7 +1807,7 @@ pub extern "ws2_32" fn recvfrom( flags: i32, from: ?*sockaddr, fromlen: ?*i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn select( nfds: i32, @@ -1816,14 +1815,14 @@ pub extern "ws2_32" fn select( writefds: ?*fd_set, exceptfds: ?*fd_set, timeout: ?*const timeval, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn send( s: SOCKET, buf: [*]const u8, len: i32, flags: u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn sendto( s: SOCKET, @@ -1832,7 +1831,7 @@ pub extern "ws2_32" fn sendto( flags: i32, to: *const sockaddr, tolen: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn setsockopt( s: SOCKET, @@ -1840,37 +1839,37 @@ pub extern "ws2_32" fn setsockopt( optname: i32, optval: ?[*]const u8, optlen: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn shutdown( s: SOCKET, how: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn socket( af: i32, @"type": i32, protocol: i32, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; pub extern "ws2_32" fn WSAStartup( wVersionRequired: WORD, lpWSAData: *WSADATA, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; -pub extern "ws2_32" fn WSACleanup() callconv(WINAPI) i32; +pub extern "ws2_32" fn WSACleanup() callconv(.winapi) i32; -pub extern "ws2_32" fn WSASetLastError(iError: i32) callconv(WINAPI) void; +pub extern "ws2_32" fn WSASetLastError(iError: i32) callconv(.winapi) void; -pub extern "ws2_32" fn WSAGetLastError() callconv(WINAPI) WinsockError; +pub extern "ws2_32" fn WSAGetLastError() callconv(.winapi) WinsockError; -pub extern "ws2_32" fn WSAIsBlocking() callconv(WINAPI) BOOL; +pub extern "ws2_32" fn WSAIsBlocking() callconv(.winapi) BOOL; -pub extern "ws2_32" fn WSAUnhookBlockingHook() callconv(WINAPI) i32; +pub extern "ws2_32" fn WSAUnhookBlockingHook() callconv(.winapi) i32; -pub extern "ws2_32" fn WSASetBlockingHook(lpBlockFunc: FARPROC) callconv(WINAPI) FARPROC; +pub extern "ws2_32" fn WSASetBlockingHook(lpBlockFunc: FARPROC) callconv(.winapi) FARPROC; -pub extern "ws2_32" fn WSACancelBlockingCall() callconv(WINAPI) i32; +pub extern "ws2_32" fn WSACancelBlockingCall() callconv(.winapi) i32; pub extern "ws2_32" fn WSAAsyncGetServByName( hWnd: HWND, @@ -1879,7 +1878,7 @@ pub extern "ws2_32" fn WSAAsyncGetServByName( proto: ?[*:0]const u8, buf: [*]u8, buflen: i32, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; pub extern "ws2_32" fn WSAAsyncGetServByPort( hWnd: HWND, @@ -1888,7 +1887,7 @@ pub extern "ws2_32" fn WSAAsyncGetServByPort( proto: ?[*:0]const u8, buf: [*]u8, buflen: i32, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; pub extern "ws2_32" fn WSAAsyncGetProtoByName( hWnd: HWND, @@ -1896,7 +1895,7 @@ pub extern "ws2_32" fn WSAAsyncGetProtoByName( name: [*:0]const u8, buf: [*]u8, buflen: i32, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; pub extern "ws2_32" fn WSAAsyncGetProtoByNumber( hWnd: HWND, @@ -1904,16 +1903,16 @@ pub extern "ws2_32" fn WSAAsyncGetProtoByNumber( number: i32, buf: [*]u8, buflen: i32, -) callconv(WINAPI) HANDLE; +) callconv(.winapi) HANDLE; -pub extern "ws2_32" fn WSACancelAsyncRequest(hAsyncTaskHandle: HANDLE) callconv(WINAPI) i32; +pub extern "ws2_32" fn WSACancelAsyncRequest(hAsyncTaskHandle: HANDLE) callconv(.winapi) i32; pub extern "ws2_32" fn WSAAsyncSelect( s: SOCKET, hWnd: HWND, wMsg: u32, lEvent: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAAccept( s: SOCKET, @@ -1921,9 +1920,9 @@ pub extern "ws2_32" fn WSAAccept( addrlen: ?*i32, lpfnCondition: ?LPCONDITIONPROC, dwCallbackData: usize, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; -pub extern "ws2_32" fn WSACloseEvent(hEvent: HANDLE) callconv(WINAPI) BOOL; +pub extern "ws2_32" fn WSACloseEvent(hEvent: HANDLE) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSAConnect( s: SOCKET, @@ -1933,7 +1932,7 @@ pub extern "ws2_32" fn WSAConnect( lpCalleeData: ?*WSABUF, lpSQOS: ?*QOS, lpGQOS: ?*QOS, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAConnectByNameW( s: SOCKET, @@ -1945,7 +1944,7 @@ pub extern "ws2_32" fn WSAConnectByNameW( RemoteAddress: ?*sockaddr, timeout: ?*const timeval, Reserved: *OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSAConnectByNameA( s: SOCKET, @@ -1957,7 +1956,7 @@ pub extern "ws2_32" fn WSAConnectByNameA( RemoteAddress: ?*sockaddr, timeout: ?*const timeval, Reserved: *OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSAConnectByList( s: SOCKET, @@ -1968,45 +1967,45 @@ pub extern "ws2_32" fn WSAConnectByList( RemoteAddress: ?*sockaddr, timeout: ?*const timeval, Reserved: *OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; -pub extern "ws2_32" fn WSACreateEvent() callconv(WINAPI) HANDLE; +pub extern "ws2_32" fn WSACreateEvent() callconv(.winapi) HANDLE; pub extern "ws2_32" fn WSADuplicateSocketA( s: SOCKET, dwProcessId: u32, lpProtocolInfo: *WSAPROTOCOL_INFOA, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSADuplicateSocketW( s: SOCKET, dwProcessId: u32, lpProtocolInfo: *WSAPROTOCOL_INFOW, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAEnumNetworkEvents( s: SOCKET, hEventObject: HANDLE, lpNetworkEvents: *WSANETWORKEVENTS, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAEnumProtocolsA( lpiProtocols: ?*i32, lpProtocolBuffer: ?*WSAPROTOCOL_INFOA, lpdwBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAEnumProtocolsW( lpiProtocols: ?*i32, lpProtocolBuffer: ?*WSAPROTOCOL_INFOW, lpdwBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAEventSelect( s: SOCKET, hEventObject: HANDLE, lNetworkEvents: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAGetOverlappedResult( s: SOCKET, @@ -2014,25 +2013,25 @@ pub extern "ws2_32" fn WSAGetOverlappedResult( lpcbTransfer: *u32, fWait: BOOL, lpdwFlags: *u32, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSAGetQOSByName( s: SOCKET, lpQOSName: *WSABUF, lpQOS: *QOS, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSAHtonl( s: SOCKET, hostlong: u32, lpnetlong: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAHtons( s: SOCKET, hostshort: u16, lpnetshort: *u16, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAIoctl( s: SOCKET, @@ -2044,7 +2043,7 @@ pub extern "ws2_32" fn WSAIoctl( lpcbBytesReturned: *u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAJoinLeaf( s: SOCKET, @@ -2055,19 +2054,19 @@ pub extern "ws2_32" fn WSAJoinLeaf( lpSQOS: ?*QOS, lpGQOS: ?*QOS, dwFlags: u32, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; pub extern "ws2_32" fn WSANtohl( s: SOCKET, netlong: u32, lphostlong: *u32, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; pub extern "ws2_32" fn WSANtohs( s: SOCKET, netshort: u16, lphostshort: *u16, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSARecv( s: SOCKET, @@ -2077,12 +2076,12 @@ pub extern "ws2_32" fn WSARecv( lpFlags: *u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSARecvDisconnect( s: SOCKET, lpInboundDisconnectData: ?*WSABUF, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSARecvFrom( s: SOCKET, @@ -2094,9 +2093,9 @@ pub extern "ws2_32" fn WSARecvFrom( lpFromlen: ?*i32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; -pub extern "ws2_32" fn WSAResetEvent(hEvent: HANDLE) callconv(WINAPI) i32; +pub extern "ws2_32" fn WSAResetEvent(hEvent: HANDLE) callconv(.winapi) i32; pub extern "ws2_32" fn WSASend( s: SOCKET, @@ -2106,7 +2105,7 @@ pub extern "ws2_32" fn WSASend( dwFlags: u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSASendMsg( s: SOCKET, @@ -2115,7 +2114,7 @@ pub extern "ws2_32" fn WSASendMsg( lpNumberOfBytesSent: ?*u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSARecvMsg( s: SOCKET, @@ -2123,12 +2122,12 @@ pub extern "ws2_32" fn WSARecvMsg( lpdwNumberOfBytesRecv: ?*u32, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSASendDisconnect( s: SOCKET, lpOutboundDisconnectData: ?*WSABUF, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSASendTo( s: SOCKET, @@ -2140,11 +2139,11 @@ pub extern "ws2_32" fn WSASendTo( iToLen: i32, lpOverlapped: ?*OVERLAPPED, lpCompletionRounte: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSASetEvent( hEvent: HANDLE, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "ws2_32" fn WSASocketA( af: i32, @@ -2153,7 +2152,7 @@ pub extern "ws2_32" fn WSASocketA( lpProtocolInfo: ?*WSAPROTOCOL_INFOA, g: u32, dwFlags: u32, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; pub extern "ws2_32" fn WSASocketW( af: i32, @@ -2162,7 +2161,7 @@ pub extern "ws2_32" fn WSASocketW( lpProtocolInfo: ?*WSAPROTOCOL_INFOW, g: u32, dwFlags: u32, -) callconv(WINAPI) SOCKET; +) callconv(.winapi) SOCKET; pub extern "ws2_32" fn WSAWaitForMultipleEvents( cEvents: u32, @@ -2170,7 +2169,7 @@ pub extern "ws2_32" fn WSAWaitForMultipleEvents( fWaitAll: BOOL, dwTimeout: u32, fAlertable: BOOL, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; pub extern "ws2_32" fn WSAAddressToStringA( lpsaAddress: *sockaddr, @@ -2178,7 +2177,7 @@ pub extern "ws2_32" fn WSAAddressToStringA( lpProtocolInfo: ?*WSAPROTOCOL_INFOA, lpszAddressString: [*]u8, lpdwAddressStringLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAAddressToStringW( lpsaAddress: *sockaddr, @@ -2186,7 +2185,7 @@ pub extern "ws2_32" fn WSAAddressToStringW( lpProtocolInfo: ?*WSAPROTOCOL_INFOW, lpszAddressString: [*]u16, lpdwAddressStringLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAStringToAddressA( AddressString: [*:0]const u8, @@ -2194,7 +2193,7 @@ pub extern "ws2_32" fn WSAStringToAddressA( lpProtocolInfo: ?*WSAPROTOCOL_INFOA, lpAddress: *sockaddr, lpAddressLength: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAStringToAddressW( AddressString: [*:0]const u16, @@ -2202,26 +2201,26 @@ pub extern "ws2_32" fn WSAStringToAddressW( lpProtocolInfo: ?*WSAPROTOCOL_INFOW, lpAddrses: *sockaddr, lpAddressLength: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAProviderConfigChange( lpNotificationHandle: *HANDLE, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPWSAOVERLAPPED_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn WSAPoll( fdArray: [*]WSAPOLLFD, fds: u32, timeout: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn WSARecvEx( s: SOCKET, buf: [*]u8, len: i32, flags: *i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn TransmitFile( hSocket: SOCKET, @@ -2231,7 +2230,7 @@ pub extern "mswsock" fn TransmitFile( lpOverlapped: ?*OVERLAPPED, lpTransmitBuffers: ?*TRANSMIT_FILE_BUFFERS, dwReserved: u32, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "mswsock" fn AcceptEx( sListenSocket: SOCKET, @@ -2242,7 +2241,7 @@ pub extern "mswsock" fn AcceptEx( dwRemoteAddressLength: u32, lpdwBytesReceived: *u32, lpOverlapped: *OVERLAPPED, -) callconv(WINAPI) BOOL; +) callconv(.winapi) BOOL; pub extern "mswsock" fn GetAcceptExSockaddrs( lpOutputBuffer: *anyopaque, @@ -2253,24 +2252,24 @@ pub extern "mswsock" fn GetAcceptExSockaddrs( LocalSockaddrLength: *i32, RemoteSockaddr: **sockaddr, RemoteSockaddrLength: *i32, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "ws2_32" fn WSAProviderCompleteAsyncCall( hAsyncCall: HANDLE, iRetCode: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn EnumProtocolsA( lpiProtocols: ?*i32, lpProtocolBuffer: *anyopaque, lpdwBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn EnumProtocolsW( lpiProtocols: ?*i32, lpProtocolBuffer: *anyopaque, lpdwBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetAddressByNameA( dwNameSpace: u32, @@ -2282,7 +2281,7 @@ pub extern "mswsock" fn GetAddressByNameA( lpCsaddrBuffer: *anyopaque, lpAliasBuffer: ?[*:0]const u8, lpdwAliasBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetAddressByNameW( dwNameSpace: u32, @@ -2295,36 +2294,36 @@ pub extern "mswsock" fn GetAddressByNameW( ldwBufferLEngth: *u32, lpAliasBuffer: ?[*:0]u16, lpdwAliasBufferLength: *u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetTypeByNameA( lpServiceName: [*:0]u8, lpServiceType: *GUID, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetTypeByNameW( lpServiceName: [*:0]u16, lpServiceType: *GUID, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetNameByTypeA( lpServiceType: *GUID, lpServiceName: [*:0]u8, dwNameLength: u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "mswsock" fn GetNameByTypeW( lpServiceType: *GUID, lpServiceName: [*:0]u16, dwNameLength: u32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn getaddrinfo( pNodeName: ?[*:0]const u8, pServiceName: ?[*:0]const u8, pHints: ?*const addrinfoa, ppResult: *?*addrinfoa, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn GetAddrInfoExA( pName: ?[*:0]const u8, @@ -2336,23 +2335,23 @@ pub extern "ws2_32" fn GetAddrInfoExA( timeout: ?*timeval, lpOverlapped: ?*OVERLAPPED, lpCompletionRoutine: ?LPLOOKUPSERVICE_COMPLETION_ROUTINE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn GetAddrInfoExCancel( lpHandle: *HANDLE, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn GetAddrInfoExOverlappedResult( lpOverlapped: *OVERLAPPED, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "ws2_32" fn freeaddrinfo( pAddrInfo: ?*addrinfoa, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "ws2_32" fn FreeAddrInfoEx( pAddrInfoEx: ?*addrinfoexA, -) callconv(WINAPI) void; +) callconv(.winapi) void; pub extern "ws2_32" fn getnameinfo( pSockaddr: *const sockaddr, @@ -2362,8 +2361,8 @@ pub extern "ws2_32" fn getnameinfo( pServiceBuffer: ?[*]u8, ServiceBufferName: u32, Flags: i32, -) callconv(WINAPI) i32; +) callconv(.winapi) i32; pub extern "iphlpapi" fn if_nametoindex( InterfaceName: [*:0]const u8, -) callconv(WINAPI) u32; +) callconv(.winapi) u32; diff --git a/lib/std/start.zig b/lib/std/start.zig index 1d1e38654bc0254ccf9315cc67c9b158c74b34d8..0ded8ea625432513b9831e4206d0d7be59cc8a9c 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -29,7 +29,7 @@ comptime { if (simplified_logic) { if (builtin.output_mode == .Exe) { if ((builtin.link_libc or builtin.object_format == .c) and @hasDecl(root, "main")) { - if (@typeInfo(@TypeOf(root.main)).@"fn".calling_convention != .C) { + if (!@typeInfo(@TypeOf(root.main)).@"fn".calling_convention.eql(.c)) { @export(&main2, .{ .name = "main" }); } } else if (builtin.os.tag == .windows) { @@ -96,7 +96,7 @@ comptime { // Simplified start code for stage2 until it supports more language features /// -fn main2() callconv(.C) c_int { +fn main2() callconv(.c) c_int { root.main(); return 0; } @@ -110,11 +110,11 @@ fn callMain2() noreturn { exit2(0); } -fn spirvMain2() callconv(.Kernel) void { +fn spirvMain2() callconv(.kernel) void { root.main(); } -fn wWinMainCRTStartup2() callconv(.C) noreturn { +fn wWinMainCRTStartup2() callconv(.c) noreturn { root.main(); exit2(0); } @@ -172,7 +172,7 @@ fn _DllMainCRTStartup( hinstDLL: std.os.windows.HINSTANCE, fdwReason: std.os.windows.DWORD, lpReserved: std.os.windows.LPVOID, -) callconv(std.os.windows.WINAPI) std.os.windows.BOOL { +) callconv(.winapi) std.os.windows.BOOL { if (!builtin.single_threaded and !builtin.link_libc) { _ = @import("os/windows/tls.zig"); } @@ -184,13 +184,13 @@ fn _DllMainCRTStartup( return std.os.windows.TRUE; } -fn wasm_freestanding_start() callconv(.C) void { +fn wasm_freestanding_start() callconv(.c) void { // This is marked inline because for some reason LLVM in // release mode fails to inline it, and we want fewer call frames in stack traces. _ = @call(.always_inline, callMain, .{}); } -fn wasi_start() callconv(.C) void { +fn wasi_start() callconv(.c) void { // The function call is marked inline because for some reason LLVM in // release mode fails to inline it, and we want fewer call frames in stack traces. switch (builtin.wasi_exec_model) { @@ -199,7 +199,7 @@ fn wasi_start() callconv(.C) void { } } -fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv(.C) usize { +fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv(.c) usize { uefi.handle = handle; uefi.system_table = system_table; @@ -221,7 +221,7 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv } } -fn _start() callconv(.Naked) noreturn { +fn _start() callconv(.naked) noreturn { // TODO set Top of Stack on non x86_64-plan9 if (native_os == .plan9 and native_arch == .x86_64) { // from /sys/src/libc/amd64/main9.s @@ -426,7 +426,7 @@ fn _start() callconv(.Naked) noreturn { ); } -fn WinStartup() callconv(.withStackAlign(.winapi, 1)) noreturn { +fn WinStartup() callconv(.withStackAlign(.c, 1)) noreturn { if (!builtin.single_threaded and !builtin.link_libc) { _ = @import("os/windows/tls.zig"); } @@ -436,7 +436,7 @@ fn WinStartup() callconv(.withStackAlign(.winapi, 1)) noreturn { std.os.windows.ntdll.RtlExitUserProcess(callMain()); } -fn wWinMainCRTStartup() callconv(.withStackAlign(.winapi, 1)) noreturn { +fn wWinMainCRTStartup() callconv(.withStackAlign(.c, 1)) noreturn { if (!builtin.single_threaded and !builtin.link_libc) { _ = @import("os/windows/tls.zig"); } @@ -447,7 +447,7 @@ fn wWinMainCRTStartup() callconv(.withStackAlign(.winapi, 1)) noreturn { std.os.windows.ntdll.RtlExitUserProcess(@as(std.os.windows.UINT, @bitCast(result))); } -fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn { +fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.c) noreturn { // We're not ready to panic until thread local storage is initialized. @setRuntimeSafety(false); // Code coverage instrumentation might try to use thread local variables. @@ -514,11 +514,11 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn { // to ask for more stack space. expandStackSize(phdrs); - const opt_init_array_start = @extern([*]*const fn () callconv(.C) void, .{ + const opt_init_array_start = @extern([*]*const fn () callconv(.c) void, .{ .name = "__init_array_start", .linkage = .weak, }); - const opt_init_array_end = @extern([*]*const fn () callconv(.C) void, .{ + const opt_init_array_end = @extern([*]*const fn () callconv(.c) void, .{ .name = "__init_array_end", .linkage = .weak, }); @@ -577,7 +577,7 @@ inline fn callMainWithArgs(argc: usize, argv: [*][*:0]u8, envp: [][*:0]u8) u8 { return callMain(); } -fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) callconv(.C) c_int { +fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) callconv(.c) c_int { var env_count: usize = 0; while (c_envp[env_count] != null) : (env_count += 1) {} const envp = @as([*][*:0]u8, @ptrCast(c_envp))[0..env_count]; @@ -592,7 +592,7 @@ fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) cal return callMainWithArgs(@as(usize, @intCast(c_argc)), @as([*][*:0]u8, @ptrCast(c_argv)), envp); } -fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]c_char) callconv(.C) c_int { +fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]c_char) callconv(.c) c_int { std.os.argv = @as([*][*:0]u8, @ptrCast(c_argv))[0..@as(usize, @intCast(c_argc))]; return callMain(); } @@ -702,4 +702,4 @@ fn maybeIgnoreSigpipe() void { } } -fn noopSigHandler(_: i32) callconv(.C) void {} +fn noopSigHandler(_: i32) callconv(.c) void {} diff --git a/src/Sema.zig b/src/Sema.zig index 46fe7f0a314838c4fa6fb9076610d16923d4dca5..65805b6a6716cf93ae39ee16dd340ac60e7293d1 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7574,13 +7574,13 @@ fn analyzeCall( if (try sema.resolveValue(func)) |func_val| if (func_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, call_src); - if (cc == .naked) { + if (!callConvIsCallable(cc)) { const maybe_func_inst = try sema.funcDeclSrcInst(func); const msg = msg: { const msg = try sema.errMsg( func_src, - "unable to call function with naked calling convention", - .{}, + "unable to call function with calling convention '{s}'", + .{@tagName(cc)}, ); errdefer msg.destroy(sema.gpa); @@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc: } } +fn callConvIsCallable(cc: std.builtin.CallingConvention.Tag) bool { + return switch (cc) { + .naked, + + .arm_interrupt, + .avr_interrupt, + .avr_signal, + .csky_interrupt, + .m68k_interrupt, + .mips_interrupt, + .mips64_interrupt, + .riscv32_interrupt, + .riscv64_interrupt, + .x86_interrupt, + .x86_64_interrupt, + + .amdgcn_kernel, + .nvptx_kernel, + .spirv_kernel, + .spirv_fragment, + .spirv_vertex, + => false, + + else => true, + }; +} + fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void { const pt = sema.pt; const zcu = pt.zcu; diff --git a/src/Zcu.zig b/src/Zcu.zig index 88bc4750af77baf9038956951937283572b2c46c..d03eb4cc9a0e9c4f3bbf352293127cbafd51c028 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -3607,18 +3607,37 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu .x86_64_vectorcall, .x86_64_regcall_v3_sysv, .x86_64_regcall_v4_win, + .x86_64_interrupt, .x86_fastcall, .x86_thiscall, .x86_vectorcall, .x86_regcall_v3, .x86_regcall_v4_win, + .x86_interrupt, .aarch64_vfabi, .aarch64_vfabi_sve, .arm_aapcs, - .arm_aapcs_vfp, + .csky_interrupt, .riscv64_lp64_v, .riscv32_ilp32_v, .m68k_rtd, + .m68k_interrupt, + => |opts| opts.incoming_stack_alignment == null, + + .arm_aapcs_vfp, + => |opts| opts.incoming_stack_alignment == null and target.os.tag != .watchos, + .arm_aapcs16_vfp, + => |opts| opts.incoming_stack_alignment == null and target.os.tag == .watchos, + + .arm_interrupt, + => |opts| opts.incoming_stack_alignment == null, + + .mips_interrupt, + .mips64_interrupt, + => |opts| opts.incoming_stack_alignment == null, + + .riscv32_interrupt, + .riscv64_interrupt, => |opts| opts.incoming_stack_alignment == null, .x86_sysv, @@ -3626,6 +3645,10 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu .x86_stdcall, => |opts| opts.incoming_stack_alignment == null and opts.register_params == 0, + .avr_interrupt, + .avr_signal, + => true, + .naked => true, else => false, diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 41ec422959980bfee78232be73f2cad2952d0566..0410023588d7bd6c3695014186c1227451b41bb2 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -7622,11 +7622,44 @@ fn toCallingConvention(cc: std.builtin.CallingConvention, zcu: *Zcu) ?[]const u8 .aarch64_vfabi => "aarch64_vector_pcs", .aarch64_vfabi_sve => "aarch64_sve_pcs", + .arm_aapcs => "pcs(\"aapcs\")", - .arm_aapcs_vfp => "pcs(\"aapcs-vfp\")", + .arm_aapcs_vfp, .arm_aapcs16_vfp => "pcs(\"aapcs-vfp\")", + + .arm_interrupt => |opts| switch (opts.type) { + .generic => "interrupt", + .irq => "interrupt(\"IRQ\")", + .fiq => "interrupt(\"FIQ\")", + .swi => "interrupt(\"SWI\")", + .abort => "interrupt(\"ABORT\")", + .undef => "interrupt(\"UNDEF\")", + }, + + .avr_signal => "signal", + + .mips_interrupt, + .mips64_interrupt, + => |opts| switch (opts.mode) { + inline else => |m| "interrupt(\"" ++ @tagName(m) ++ "\")", + }, + .riscv64_lp64_v, .riscv32_ilp32_v => "riscv_vector_cc", + + .riscv32_interrupt, + .riscv64_interrupt, + => |opts| switch (opts.mode) { + inline else => |m| "interrupt(\"" ++ @tagName(m) ++ "\")", + }, + .m68k_rtd => "m68k_rtd", + .avr_interrupt, + .csky_interrupt, + .m68k_interrupt, + .x86_interrupt, + .x86_64_interrupt, + => "interrupt", + else => unreachable, // `Zcu.callconvSupported` }; } diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index e4d4374f9adaf36489a8409bfd84abf6dfdca240..b7094032564876edb0f6e3a5cb6a72f1010cda37 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -11749,7 +11749,14 @@ fn toLlvmCallConvTag(cc_tag: std.builtin.CallingConvention.Tag, target: std.Targ .aarch64_vfabi_sve => .aarch64_sve_vector_pcs, .arm_apcs => .arm_apcscc, .arm_aapcs => .arm_aapcscc, - .arm_aapcs_vfp => .arm_aapcs_vfpcc, + .arm_aapcs_vfp => if (target.os.tag != .watchos) + .arm_aapcs_vfpcc + else + null, + .arm_aapcs16_vfp => if (target.os.tag == .watchos) + .arm_aapcs_vfpcc + else + null, .riscv64_lp64_v => .riscv_vectorcallcc, .riscv32_ilp32_v => .riscv_vectorcallcc, .avr_builtin => .avr_builtincc, @@ -11779,7 +11786,6 @@ fn toLlvmCallConvTag(cc_tag: std.builtin.CallingConvention.Tag, target: std.Targ .aarch64_aapcs, .aarch64_aapcs_darwin, .aarch64_aapcs_win, - .arm_aapcs16_vfp, .mips64_n64, .mips64_n32, .mips_o32, @@ -11977,7 +11983,7 @@ fn firstParamSRet(fn_info: InternPool.Key.FuncType, zcu: *Zcu, target: std.Targe .aarch64_aapcs_darwin, .aarch64_aapcs_win, => aarch64_c_abi.classifyType(return_type, zcu) == .memory, - .arm_aapcs, .arm_aapcs_vfp => switch (arm_c_abi.classifyType(return_type, zcu, .ret)) { + .arm_aapcs, .arm_aapcs_vfp, .arm_aapcs16_vfp => switch (arm_c_abi.classifyType(return_type, zcu, .ret)) { .memory, .i64_array => true, .i32_array => |size| size != 1, .byval => false, @@ -12027,7 +12033,7 @@ fn lowerFnRetTy(o: *Object, fn_info: InternPool.Key.FuncType) Allocator.Error!Bu .integer => return o.builder.intType(@intCast(return_type.bitSize(zcu))), .double_integer => return o.builder.arrayType(2, .i64), }, - .arm_aapcs, .arm_aapcs_vfp => switch (arm_c_abi.classifyType(return_type, zcu, .ret)) { + .arm_aapcs, .arm_aapcs_vfp, .arm_aapcs16_vfp => switch (arm_c_abi.classifyType(return_type, zcu, .ret)) { .memory, .i64_array => return .void, .i32_array => |len| return if (len == 1) .i32 else .void, .byval => return o.lowerType(return_type), @@ -12276,7 +12282,7 @@ const ParamTypeIterator = struct { .double_integer => return Lowering{ .i64_array = 2 }, } }, - .arm_aapcs, .arm_aapcs_vfp => { + .arm_aapcs, .arm_aapcs_vfp, .arm_aapcs16_vfp => { it.zig_index += 1; it.llvm_index += 1; switch (arm_c_abi.classifyType(ty, zcu, .arg)) { diff --git a/src/crash_report.zig b/src/crash_report.zig index d9f8bac350745aa083a37c911ef472b0575f8599..45410890a5fc62ff71e6e5f349dffe3efed324ba 100644 --- a/src/crash_report.zig +++ b/src/crash_report.zig @@ -229,7 +229,7 @@ const WindowsSegfaultMessage = union(enum) { illegal_instruction: void, }; -fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(windows.WINAPI) c_long { +fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.winapi) c_long { switch (info.ExceptionRecord.ExceptionCode) { windows.EXCEPTION_DATATYPE_MISALIGNMENT => handleSegfaultWindowsExtra(info, .{ .literal = "Unaligned Memory Access" }), windows.EXCEPTION_ACCESS_VIOLATION => handleSegfaultWindowsExtra(info, .segfault), diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index 2babe2b09020d84eef4ef12dc117dca867efb7b5..6653a8309a6f61cab6fead88664e5b8f2d2407e1 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -3415,8 +3415,8 @@ fn updateType( .x86_64_regcall_v3_sysv => .LLVM_X86RegCall, .x86_64_regcall_v4_win => .LLVM_X86RegCall, .x86_64_vectorcall => .LLVM_vectorcall, - .x86_sysv => .nocall, - .x86_win => .nocall, + .x86_sysv => .normal, + .x86_win => .normal, .x86_stdcall => .BORLAND_stdcall, .x86_fastcall => .BORLAND_msfastcall, .x86_thiscall => .BORLAND_thiscall, @@ -3425,16 +3425,17 @@ fn updateType( .x86_regcall_v4_win => .LLVM_X86RegCall, .x86_vectorcall => .LLVM_vectorcall, - .aarch64_aapcs => .LLVM_AAPCS, - .aarch64_aapcs_darwin => .LLVM_AAPCS, - .aarch64_aapcs_win => .LLVM_AAPCS, + .aarch64_aapcs => .normal, + .aarch64_aapcs_darwin => .normal, + .aarch64_aapcs_win => .normal, .aarch64_vfabi => .LLVM_AAPCS, .aarch64_vfabi_sve => .LLVM_AAPCS, - .arm_apcs => .nocall, + .arm_apcs => .normal, .arm_aapcs => .LLVM_AAPCS, - .arm_aapcs_vfp => .LLVM_AAPCS_VFP, - .arm_aapcs16_vfp => .nocall, + .arm_aapcs_vfp, + .arm_aapcs16_vfp, + => .LLVM_AAPCS_VFP, .riscv64_lp64_v, .riscv32_ilp32_v, @@ -3442,10 +3443,10 @@ fn updateType( .m68k_rtd => .LLVM_M68kRTD, - .amdgcn_kernel, + .amdgcn_kernel => .LLVM_OpenCLKernel, .nvptx_kernel, .spirv_kernel, - => .LLVM_OpenCLKernel, + => .nocall, .x86_64_interrupt, .x86_interrupt, diff --git a/test/cases/compile_errors/calling_function_with_naked_calling_convention.zig b/test/cases/compile_errors/calling_function_with_naked_calling_convention.zig index 2bd0364d4f8ebdb3e73ccf452fd2a0d43fa1388d..ea4e42f15d5a66ea734ea4835fcc1d85bb1028af 100644 --- a/test/cases/compile_errors/calling_function_with_naked_calling_convention.zig +++ b/test/cases/compile_errors/calling_function_with_naked_calling_convention.zig @@ -1,11 +1,11 @@ export fn entry() void { foo(); } -fn foo() callconv(.Naked) void {} +fn foo() callconv(.naked) void {} // error // backend=llvm // target=native // -// :2:5: error: unable to call function with naked calling convention +// :2:5: error: unable to call function with calling convention 'naked' // :4:1: note: function declared here diff --git a/tools/update_clang_options.zig b/tools/update_clang_options.zig index 3d32e4c7e1b7704c51636dddc5138246d038189f..637c9a5eaff6d50f5177ea234e8a18746febab3f 100644 --- a/tools/update_clang_options.zig +++ b/tools/update_clang_options.zig @@ -576,7 +576,7 @@ fn knownOption(name: []const u8) ?[]const u8 { const cpu_targets = struct { pub const aarch64 = std.Target.aarch64; - pub const amdgpu = std.Target.amdgpu; + pub const amdgcn = std.Target.amdgcn; pub const arc = std.Target.arc; pub const arm = std.Target.arm; pub const avr = std.Target.avr; diff --git a/tools/update_cpu_features.zig b/tools/update_cpu_features.zig index 2390a005755b890bd2fc7217352e5869a192adda..07d66213ff3842cb5f5fcdc0d383d819727815d9 100644 --- a/tools/update_cpu_features.zig +++ b/tools/update_cpu_features.zig @@ -390,7 +390,7 @@ const llvm_targets = [_]LlvmTarget{ }, }, .{ - .zig_name = "amdgpu", + .zig_name = "amdgcn", .llvm_name = "AMDGPU", .td_name = "AMDGPU.td", .feature_overrides = &.{