aboutsummaryrefslogtreecommitdiff
path: root/lib/std/target/mips.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-01-21 19:40:44 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-01-21 19:40:44 -0500
commit92559cd02cbf6497b99eb5193c9094e6d92c214e (patch)
tree13ff36b93f06555fd31803750debbd03d10f4b47 /lib/std/target/mips.zig
parent15d5cab569a5ffc6495d606f460264429043aabf (diff)
downloadzig-92559cd02cbf6497b99eb5193c9094e6d92c214e.tar.gz
zig-92559cd02cbf6497b99eb5193c9094e6d92c214e.zip
hit a comptime limitation with computing dense sets
Diffstat (limited to 'lib/std/target/mips.zig')
-rw-r--r--lib/std/target/mips.zig240
1 files changed, 74 insertions, 166 deletions
diff --git a/lib/std/target/mips.zig b/lib/std/target/mips.zig
index 19ea4d7009..51835f2980 100644
--- a/lib/std/target/mips.zig
+++ b/lib/std/target/mips.zig
@@ -57,135 +57,101 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
pub const all_features = blk: {
const len = @typeInfo(Feature).Enum.fields.len;
- std.debug.assert(len <= Cpu.Feature.Set.bit_count);
+ std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
var result: [len]Cpu.Feature = undefined;
result[@enumToInt(Feature.abs2008)] = .{
- .index = @enumToInt(Feature.abs2008),
- .name = @tagName(Feature.abs2008),
.llvm_name = "abs2008",
.description = "Disable IEEE 754-2008 abs.fmt mode",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.cnmips)] = .{
- .index = @enumToInt(Feature.cnmips),
- .name = @tagName(Feature.cnmips),
.llvm_name = "cnmips",
.description = "Octeon cnMIPS Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips64r2,
}),
};
result[@enumToInt(Feature.crc)] = .{
- .index = @enumToInt(Feature.crc),
- .name = @tagName(Feature.crc),
.llvm_name = "crc",
.description = "Mips R6 CRC ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.dsp)] = .{
- .index = @enumToInt(Feature.dsp),
- .name = @tagName(Feature.dsp),
.llvm_name = "dsp",
.description = "Mips DSP ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.dspr2)] = .{
- .index = @enumToInt(Feature.dspr2),
- .name = @tagName(Feature.dspr2),
.llvm_name = "dspr2",
.description = "Mips DSP-R2 ASE",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.dsp,
}),
};
result[@enumToInt(Feature.dspr3)] = .{
- .index = @enumToInt(Feature.dspr3),
- .name = @tagName(Feature.dspr3),
.llvm_name = "dspr3",
.description = "Mips DSP-R3 ASE",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.dsp,
.dspr2,
}),
};
result[@enumToInt(Feature.eva)] = .{
- .index = @enumToInt(Feature.eva),
- .name = @tagName(Feature.eva),
.llvm_name = "eva",
.description = "Mips EVA ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.fp64)] = .{
- .index = @enumToInt(Feature.fp64),
- .name = @tagName(Feature.fp64),
.llvm_name = "fp64",
.description = "Support 64-bit FP registers",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.fpxx)] = .{
- .index = @enumToInt(Feature.fpxx),
- .name = @tagName(Feature.fpxx),
.llvm_name = "fpxx",
.description = "Support for FPXX",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.ginv)] = .{
- .index = @enumToInt(Feature.ginv),
- .name = @tagName(Feature.ginv),
.llvm_name = "ginv",
.description = "Mips Global Invalidate ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.gp64)] = .{
- .index = @enumToInt(Feature.gp64),
- .name = @tagName(Feature.gp64),
.llvm_name = "gp64",
.description = "General Purpose Registers are 64-bit wide",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.long_calls)] = .{
- .index = @enumToInt(Feature.long_calls),
- .name = @tagName(Feature.long_calls),
.llvm_name = "long-calls",
.description = "Disable use of the jal instruction",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.micromips)] = .{
- .index = @enumToInt(Feature.micromips),
- .name = @tagName(Feature.micromips),
.llvm_name = "micromips",
.description = "microMips mode",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips1)] = .{
- .index = @enumToInt(Feature.mips1),
- .name = @tagName(Feature.mips1),
.llvm_name = "mips1",
.description = "Mips I ISA Support [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips16)] = .{
- .index = @enumToInt(Feature.mips16),
- .name = @tagName(Feature.mips16),
.llvm_name = "mips16",
.description = "Mips16 mode",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips2)] = .{
- .index = @enumToInt(Feature.mips2),
- .name = @tagName(Feature.mips2),
.llvm_name = "mips2",
.description = "Mips II ISA Support [highly experimental]",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips1,
}),
};
result[@enumToInt(Feature.mips3)] = .{
- .index = @enumToInt(Feature.mips3),
- .name = @tagName(Feature.mips3),
.llvm_name = "mips3",
.description = "MIPS III ISA Support [highly experimental]",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.fp64,
.gp64,
.mips2,
@@ -194,22 +160,18 @@ pub const all_features = blk: {
}),
};
result[@enumToInt(Feature.mips32)] = .{
- .index = @enumToInt(Feature.mips32),
- .name = @tagName(Feature.mips32),
.llvm_name = "mips32",
.description = "Mips32 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips2,
.mips3_32,
.mips4_32,
}),
};
result[@enumToInt(Feature.mips32r2)] = .{
- .index = @enumToInt(Feature.mips32r2),
- .name = @tagName(Feature.mips32r2),
.llvm_name = "mips32r2",
.description = "Mips32r2 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32,
.mips3_32r2,
.mips4_32r2,
@@ -217,29 +179,23 @@ pub const all_features = blk: {
}),
};
result[@enumToInt(Feature.mips32r3)] = .{
- .index = @enumToInt(Feature.mips32r3),
- .name = @tagName(Feature.mips32r3),
.llvm_name = "mips32r3",
.description = "Mips32r3 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r2,
}),
};
result[@enumToInt(Feature.mips32r5)] = .{
- .index = @enumToInt(Feature.mips32r5),
- .name = @tagName(Feature.mips32r5),
.llvm_name = "mips32r5",
.description = "Mips32r5 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r3,
}),
};
result[@enumToInt(Feature.mips32r6)] = .{
- .index = @enumToInt(Feature.mips32r6),
- .name = @tagName(Feature.mips32r6),
.llvm_name = "mips32r6",
.description = "Mips32r6 ISA Support [experimental]",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.abs2008,
.fp64,
.mips32r5,
@@ -247,107 +203,83 @@ pub const all_features = blk: {
}),
};
result[@enumToInt(Feature.mips3_32)] = .{
- .index = @enumToInt(Feature.mips3_32),
- .name = @tagName(Feature.mips3_32),
.llvm_name = "mips3_32",
.description = "Subset of MIPS-III that is also in MIPS32 [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips3_32r2)] = .{
- .index = @enumToInt(Feature.mips3_32r2),
- .name = @tagName(Feature.mips3_32r2),
.llvm_name = "mips3_32r2",
.description = "Subset of MIPS-III that is also in MIPS32r2 [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips4)] = .{
- .index = @enumToInt(Feature.mips4),
- .name = @tagName(Feature.mips4),
.llvm_name = "mips4",
.description = "MIPS IV ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips3,
.mips4_32,
.mips4_32r2,
}),
};
result[@enumToInt(Feature.mips4_32)] = .{
- .index = @enumToInt(Feature.mips4_32),
- .name = @tagName(Feature.mips4_32),
.llvm_name = "mips4_32",
.description = "Subset of MIPS-IV that is also in MIPS32 [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips4_32r2)] = .{
- .index = @enumToInt(Feature.mips4_32r2),
- .name = @tagName(Feature.mips4_32r2),
.llvm_name = "mips4_32r2",
.description = "Subset of MIPS-IV that is also in MIPS32r2 [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips5)] = .{
- .index = @enumToInt(Feature.mips5),
- .name = @tagName(Feature.mips5),
.llvm_name = "mips5",
.description = "MIPS V ISA Support [highly experimental]",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips4,
.mips5_32r2,
}),
};
result[@enumToInt(Feature.mips5_32r2)] = .{
- .index = @enumToInt(Feature.mips5_32r2),
- .name = @tagName(Feature.mips5_32r2),
.llvm_name = "mips5_32r2",
.description = "Subset of MIPS-V that is also in MIPS32r2 [highly experimental]",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mips64)] = .{
- .index = @enumToInt(Feature.mips64),
- .name = @tagName(Feature.mips64),
.llvm_name = "mips64",
.description = "Mips64 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32,
.mips5,
}),
};
result[@enumToInt(Feature.mips64r2)] = .{
- .index = @enumToInt(Feature.mips64r2),
- .name = @tagName(Feature.mips64r2),
.llvm_name = "mips64r2",
.description = "Mips64r2 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r2,
.mips64,
}),
};
result[@enumToInt(Feature.mips64r3)] = .{
- .index = @enumToInt(Feature.mips64r3),
- .name = @tagName(Feature.mips64r3),
.llvm_name = "mips64r3",
.description = "Mips64r3 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r3,
.mips64r2,
}),
};
result[@enumToInt(Feature.mips64r5)] = .{
- .index = @enumToInt(Feature.mips64r5),
- .name = @tagName(Feature.mips64r5),
.llvm_name = "mips64r5",
.description = "Mips64r5 ISA Support",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r5,
.mips64r3,
}),
};
result[@enumToInt(Feature.mips64r6)] = .{
- .index = @enumToInt(Feature.mips64r6),
- .name = @tagName(Feature.mips64r6),
.llvm_name = "mips64r6",
.description = "Mips64r6 ISA Support [experimental]",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.abs2008,
.mips32r6,
.mips64r5,
@@ -355,112 +287,88 @@ pub const all_features = blk: {
}),
};
result[@enumToInt(Feature.msa)] = .{
- .index = @enumToInt(Feature.msa),
- .name = @tagName(Feature.msa),
.llvm_name = "msa",
.description = "Mips MSA ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.mt)] = .{
- .index = @enumToInt(Feature.mt),
- .name = @tagName(Feature.mt),
.llvm_name = "mt",
.description = "Mips MT ASE",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.nan2008)] = .{
- .index = @enumToInt(Feature.nan2008),
- .name = @tagName(Feature.nan2008),
.llvm_name = "nan2008",
.description = "IEEE 754-2008 NaN encoding",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.noabicalls)] = .{
- .index = @enumToInt(Feature.noabicalls),
- .name = @tagName(Feature.noabicalls),
.llvm_name = "noabicalls",
.description = "Disable SVR4-style position-independent code",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.nomadd4)] = .{
- .index = @enumToInt(Feature.nomadd4),
- .name = @tagName(Feature.nomadd4),
.llvm_name = "nomadd4",
.description = "Disable 4-operand madd.fmt and related instructions",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.nooddspreg)] = .{
- .index = @enumToInt(Feature.nooddspreg),
- .name = @tagName(Feature.nooddspreg),
.llvm_name = "nooddspreg",
.description = "Disable odd numbered single-precision registers",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.p5600)] = .{
- .index = @enumToInt(Feature.p5600),
- .name = @tagName(Feature.p5600),
.llvm_name = "p5600",
.description = "The P5600 Processor",
- .dependencies = featureSet(&[_]Feature{
+ .dependencies = sparseFeatureSet(&[_]Feature{
.mips32r5,
}),
};
result[@enumToInt(Feature.ptr64)] = .{
- .index = @enumToInt(Feature.ptr64),
- .name = @tagName(Feature.ptr64),
.llvm_name = "ptr64",
.description = "Pointers are 64-bit wide",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.single_float)] = .{
- .index = @enumToInt(Feature.single_float),
- .name = @tagName(Feature.single_float),
.llvm_name = "single-float",
.description = "Only supports single precision float",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.soft_float)] = .{
- .index = @enumToInt(Feature.soft_float),
- .name = @tagName(Feature.soft_float),
.llvm_name = "soft-float",
.description = "Does not support floating point instructions",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.sym32)] = .{
- .index = @enumToInt(Feature.sym32),
- .name = @tagName(Feature.sym32),
.llvm_name = "sym32",
.description = "Symbols are 32 bit on Mips64",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.use_indirect_jump_hazard)] = .{
- .index = @enumToInt(Feature.use_indirect_jump_hazard),
- .name = @tagName(Feature.use_indirect_jump_hazard),
.llvm_name = "use-indirect-jump-hazard",
.description = "Use indirect jump guards to prevent certain speculation based attacks",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.use_tcc_in_div)] = .{
- .index = @enumToInt(Feature.use_tcc_in_div),
- .name = @tagName(Feature.use_tcc_in_div),
.llvm_name = "use-tcc-in-div",
.description = "Force the assembler to use trapping",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.vfpu)] = .{
- .index = @enumToInt(Feature.vfpu),
- .name = @tagName(Feature.vfpu),
.llvm_name = "vfpu",
.description = "Enable vector FPU instructions",
- .dependencies = featureSet(&[_]Feature{}),
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
};
result[@enumToInt(Feature.virt)] = .{
- .index = @enumToInt(Feature.virt),
- .name = @tagName(Feature.virt),
.llvm_name = "virt",
.description = "Mips Virtualization ASE",
- .dependencies = featureSet(&[_]Feature{}),
- };
+ .dependencies = sparseFeatureSet(&[_]Feature{}),
+ };
+ const ti = @typeInfo(Feature);
+ for (result) |*elem, i| {
+ elem.index = i;
+ elem.name = ti.Enum.fields[i].name;
+ elem.dependencies.initAsDependencies(i, &result);
+ }
break :blk result;
};
@@ -468,112 +376,112 @@ pub const cpu = struct {
pub const mips1 = Cpu{
.name = "mips1",
.llvm_name = "mips1",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips1,
}),
};
pub const mips2 = Cpu{
.name = "mips2",
.llvm_name = "mips2",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips2,
}),
};
pub const mips3 = Cpu{
.name = "mips3",
.llvm_name = "mips3",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips3,
}),
};
pub const mips32 = Cpu{
.name = "mips32",
.llvm_name = "mips32",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips32,
}),
};
pub const mips32r2 = Cpu{
.name = "mips32r2",
.llvm_name = "mips32r2",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips32r2,
}),
};
pub const mips32r3 = Cpu{
.name = "mips32r3",
.llvm_name = "mips32r3",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips32r3,
}),
};
pub const mips32r5 = Cpu{
.name = "mips32r5",
.llvm_name = "mips32r5",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips32r5,
}),
};
pub const mips32r6 = Cpu{
.name = "mips32r6",
.llvm_name = "mips32r6",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips32r6,
}),
};
pub const mips4 = Cpu{
.name = "mips4",
.llvm_name = "mips4",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips4,
}),
};
pub const mips5 = Cpu{
.name = "mips5",
.llvm_name = "mips5",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips5,
}),
};
pub const mips64 = Cpu{
.name = "mips64",
.llvm_name = "mips64",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips64,
}),
};
pub const mips64r2 = Cpu{
.name = "mips64r2",
.llvm_name = "mips64r2",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips64r2,
}),
};
pub const mips64r3 = Cpu{
.name = "mips64r3",
.llvm_name = "mips64r3",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips64r3,
}),
};
pub const mips64r5 = Cpu{
.name = "mips64r5",
.llvm_name = "mips64r5",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips64r5,
}),
};
pub const mips64r6 = Cpu{
.name = "mips64r6",
.llvm_name = "mips64r6",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.mips64r6,
}),
};
pub const octeon = Cpu{
.name = "octeon",
.llvm_name = "octeon",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.cnmips,
.mips64r2,
}),
@@ -581,7 +489,7 @@ pub const cpu = struct {
pub const p5600 = Cpu{
.name = "p5600",
.llvm_name = "p5600",
- .features = featureSet(&[_]Feature{
+ .features = featureSet(&all_features, &[_]Feature{
.p5600,
}),
};