zig/lib/std/target/riscv.zig

113 lines
3.1 KiB
Zig
Raw Normal View History

2020-01-20 19:21:45 -08:00
const std = @import("../std.zig");
const Cpu = std.Target.Cpu;
2019-12-20 16:27:13 -08:00
2020-01-20 19:21:45 -08:00
pub const Feature = enum {
@"64bit",
a,
c,
d,
e,
f,
m,
relax,
2019-12-20 16:27:13 -08:00
};
2020-01-20 19:21:45 -08:00
pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
2019-12-20 16:27:13 -08:00
2020-01-20 19:21:45 -08:00
pub const all_features = blk: {
const len = @typeInfo(Feature).Enum.fields.len;
std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
2020-01-20 19:21:45 -08:00
var result: [len]Cpu.Feature = undefined;
result[@enumToInt(Feature.@"64bit")] = .{
.llvm_name = "64bit",
.description = "Implements RV64",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.a)] = .{
.llvm_name = "a",
.description = "'A' (Atomic Instructions)",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.c)] = .{
.llvm_name = "c",
.description = "'C' (Compressed Instructions)",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.d)] = .{
.llvm_name = "d",
.description = "'D' (Double-Precision Floating-Point)",
.dependencies = sparseFeatureSet(&[_]Feature{
2020-01-20 19:21:45 -08:00
.f,
}),
};
result[@enumToInt(Feature.e)] = .{
.llvm_name = "e",
.description = "Implements RV32E (provides 16 rather than 32 GPRs)",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.f)] = .{
.llvm_name = "f",
.description = "'F' (Single-Precision Floating-Point)",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.m)] = .{
.llvm_name = "m",
.description = "'M' (Integer Multiplication and Division)",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
result[@enumToInt(Feature.relax)] = .{
.llvm_name = "relax",
.description = "Enable Linker relaxation.",
.dependencies = sparseFeatureSet(&[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
const ti = @typeInfo(Feature);
for (result) |*elem, i| {
elem.index = i;
elem.name = ti.Enum.fields[i].name;
elem.dependencies.initAsDependencies(i, &result);
}
2020-01-20 19:21:45 -08:00
break :blk result;
2019-12-20 16:27:13 -08:00
};
2020-01-20 19:21:45 -08:00
pub const cpu = struct {
pub const generic_rv32 = Cpu{
.name = "generic_rv32",
.llvm_name = "generic-rv32",
.features = featureSet(&all_features, &[_]Feature{}),
2020-01-20 19:21:45 -08:00
};
pub const generic_rv64 = Cpu{
.name = "generic_rv64",
.llvm_name = "generic-rv64",
.features = featureSet(&all_features, &[_]Feature{
2020-01-20 19:21:45 -08:00
.@"64bit",
}),
};
2019-12-20 16:27:13 -08:00
};
2020-01-20 19:21:45 -08:00
/// All riscv CPUs, sorted alphabetically by name.
/// TODO: Replace this with usage of `std.meta.declList`. It does work, but stage1
/// compiler has inefficient memory and CPU usage, affecting build times.
pub const all_cpus = &[_]*const Cpu{
&cpu.generic_rv32,
&cpu.generic_rv64,
2019-12-20 16:27:13 -08:00
};
2020-01-20 20:14:35 -08:00
pub const baseline_32_features = featureSet(&all_features, &[_]Feature{
2020-01-20 20:14:35 -08:00
.a,
.c,
.d,
.f,
.m,
.relax,
});
pub const baseline_64_features = featureSet(&all_features, &[_]Feature{
2020-01-20 20:14:35 -08:00
.@"64bit",
.a,
.c,
.d,
.f,
.m,
.relax,
});