mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-06-02 23:28:07 +03:00
std.zig.system.loongarch: implement individual cpu feature bit tests (#30915)
closes #30902 Co-authored-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30915 Reviewed-by: Alex Rønne Petersen <alex@alexrp.com> Co-authored-by: bartimaeusnek <bartimaeusnek@noreply.codeberg.org> Co-committed-by: bartimaeusnek <bartimaeusnek@noreply.codeberg.org>
This commit is contained in:
committed by
Alex Rønne Petersen
parent
c8edfbe1d5
commit
37288e53ae
@@ -1,6 +1,16 @@
|
|||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
inline fn bit(input: u32, offset: u5) bool {
|
||||||
|
return (input >> offset) & 1 != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setFeature(cpu: *std.Target.Cpu, feature: std.Target.loongarch.Feature, enabled: bool) void {
|
||||||
|
const idx = @as(std.Target.Cpu.Feature.Set.Index, @intFromEnum(feature));
|
||||||
|
|
||||||
|
if (enabled) cpu.features.addFeature(idx) else cpu.features.removeFeature(idx);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn detectNativeCpuAndFeatures(
|
pub fn detectNativeCpuAndFeatures(
|
||||||
arch: std.Target.Cpu.Arch,
|
arch: std.Target.Cpu.Arch,
|
||||||
os: std.Target.Os,
|
os: std.Target.Os,
|
||||||
@@ -9,9 +19,6 @@ pub fn detectNativeCpuAndFeatures(
|
|||||||
_ = os;
|
_ = os;
|
||||||
_ = query;
|
_ = query;
|
||||||
|
|
||||||
// Clearly this code could do better in the future by actually querying specific CPU features
|
|
||||||
// with the cpucfg instruction like on x86. But with the small number of well-known LoongArch
|
|
||||||
// models that exist at the moment, simply checking the PRID is plenty.
|
|
||||||
var cpu: std.Target.Cpu = .{
|
var cpu: std.Target.Cpu = .{
|
||||||
.arch = arch,
|
.arch = arch,
|
||||||
.model = switch (cpucfg(0) & 0xf000) {
|
.model = switch (cpucfg(0) & 0xf000) {
|
||||||
@@ -23,6 +30,31 @@ pub fn detectNativeCpuAndFeatures(
|
|||||||
};
|
};
|
||||||
|
|
||||||
cpu.features.addFeatureSet(cpu.model.features);
|
cpu.features.addFeatureSet(cpu.model.features);
|
||||||
|
|
||||||
|
const cfg1 = cpucfg(1);
|
||||||
|
const cfg2 = cpucfg(2);
|
||||||
|
const cfg3 = cpucfg(3);
|
||||||
|
|
||||||
|
setFeature(&cpu, .ual, bit(cfg1, 20));
|
||||||
|
|
||||||
|
const has_fpu = bit(cfg2, 0);
|
||||||
|
setFeature(&cpu, .f, has_fpu and bit(cfg2, 1));
|
||||||
|
setFeature(&cpu, .d, has_fpu and bit(cfg2, 2));
|
||||||
|
|
||||||
|
setFeature(&cpu, .lsx, bit(cfg2, 6));
|
||||||
|
setFeature(&cpu, .lasx, bit(cfg2, 7));
|
||||||
|
setFeature(&cpu, .lvz, bit(cfg2, 10));
|
||||||
|
|
||||||
|
setFeature(&cpu, .lbt, bit(cfg2, 18) and bit(cfg2, 19) and bit(cfg2, 20));
|
||||||
|
|
||||||
|
setFeature(&cpu, .frecipe, bit(cfg2, 25));
|
||||||
|
setFeature(&cpu, .div32, bit(cfg2, 26));
|
||||||
|
setFeature(&cpu, .lam_bh, bit(cfg2, 27));
|
||||||
|
setFeature(&cpu, .lamcas, bit(cfg2, 28));
|
||||||
|
setFeature(&cpu, .scq, bit(cfg2, 30));
|
||||||
|
|
||||||
|
setFeature(&cpu, .ld_seq_sa, bit(cfg3, 23));
|
||||||
|
|
||||||
cpu.features.populateDependencies(cpu.arch.allFeaturesList());
|
cpu.features.populateDependencies(cpu.arch.allFeaturesList());
|
||||||
|
|
||||||
return cpu;
|
return cpu;
|
||||||
|
|||||||
Reference in New Issue
Block a user