Source
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.addsubiw)] = .{
.llvm_name = "addsubiw",
.description = "Enable 16-bit register-immediate addition and subtraction instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.avr0)] = .{
.llvm_name = "avr0",
.description = "The device is a part of the avr0 family",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.avr1)] = .{
.llvm_name = "avr1",
.description = "The device is a part of the avr1 family",
.dependencies = featureSet(&[_]Feature{
.avr0,
.lpm,
.memmappedregs,
}),
};
result[@intFromEnum(Feature.avr2)] = .{
.llvm_name = "avr2",
.description = "The device is a part of the avr2 family",
.dependencies = featureSet(&[_]Feature{
.addsubiw,
.avr1,
.ijmpcall,
.sram,
}),
};
result[@intFromEnum(Feature.avr25)] = .{
.llvm_name = "avr25",
.description = "The device is a part of the avr25 family",
.dependencies = featureSet(&[_]Feature{
.avr2,
.@"break",
.lpmx,
.movw,
.spm,
}),
};
result[@intFromEnum(Feature.avr3)] = .{
.llvm_name = "avr3",
.description = "The device is a part of the avr3 family",
.dependencies = featureSet(&[_]Feature{
.avr2,
.jmpcall,
}),
};
result[@intFromEnum(Feature.avr31)] = .{
.llvm_name = "avr31",
.description = "The device is a part of the avr31 family",
.dependencies = featureSet(&[_]Feature{
.avr3,
.elpm,
}),
};
result[@intFromEnum(Feature.avr35)] = .{
.llvm_name = "avr35",
.description = "The device is a part of the avr35 family",
.dependencies = featureSet(&[_]Feature{
.avr3,
.@"break",
.lpmx,
.movw,
.spm,
}),
};
result[@intFromEnum(Feature.avr4)] = .{
.llvm_name = "avr4",
.description = "The device is a part of the avr4 family",
.dependencies = featureSet(&[_]Feature{
.avr2,
.@"break",
.lpmx,
.movw,
.mul,
.spm,
}),
};
result[@intFromEnum(Feature.avr5)] = .{
.llvm_name = "avr5",
.description = "The device is a part of the avr5 family",
.dependencies = featureSet(&[_]Feature{
.avr3,
.@"break",
.lpmx,
.movw,
.mul,
.spm,
}),
};
result[@intFromEnum(Feature.avr51)] = .{
.llvm_name = "avr51",
.description = "The device is a part of the avr51 family",
.dependencies = featureSet(&[_]Feature{
.avr5,
.elpm,
.elpmx,
}),
};
result[@intFromEnum(Feature.avr6)] = .{
.llvm_name = "avr6",
.description = "The device is a part of the avr6 family",
.dependencies = featureSet(&[_]Feature{
.avr51,
.eijmpcall,
}),
};
result[@intFromEnum(Feature.avrtiny)] = .{
.llvm_name = "avrtiny",
.description = "The device is a part of the avrtiny family",
.dependencies = featureSet(&[_]Feature{
.avr0,
.@"break",
.smallstack,
.sram,
.tinyencoding,
}),
};
result[@intFromEnum(Feature.@"break")] = .{
.llvm_name = "break",
.description = "The device supports the `BREAK` debugging instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.des)] = .{
.llvm_name = "des",
.description = "The device supports the `DES k` encryption instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.eijmpcall)] = .{
.llvm_name = "eijmpcall",
.description = "The device supports the `EIJMP`/`EICALL` instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.elpm)] = .{
.llvm_name = "elpm",
.description = "The device supports the ELPM instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.elpmx)] = .{
.llvm_name = "elpmx",
.description = "The device supports the `ELPM Rd, Z[+]` instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.ijmpcall)] = .{
.llvm_name = "ijmpcall",
.description = "The device supports `IJMP`/`ICALL`instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.jmpcall)] = .{
.llvm_name = "jmpcall",
.description = "The device supports the `JMP` and `CALL` instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.lowbytefirst)] = .{
.llvm_name = "lowbytefirst",
.description = "Do the low byte first when writing a 16-bit port or storing a 16-bit word",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.lpm)] = .{
.llvm_name = "lpm",
.description = "The device supports the `LPM` instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.lpmx)] = .{
.llvm_name = "lpmx",
.description = "The device supports the `LPM Rd, Z[+]` instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.memmappedregs)] = .{
.llvm_name = "memmappedregs",
.description = "The device has CPU registers mapped in data address space",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.movw)] = .{
.llvm_name = "movw",
.description = "The device supports the 16-bit MOVW instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.mul)] = .{
.llvm_name = "mul",
.description = "The device supports the multiplication instructions",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.rmw)] = .{
.llvm_name = "rmw",
.description = "The device supports the read-write-modify instructions: XCH, LAS, LAC, LAT",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.smallstack)] = .{
.llvm_name = "smallstack",
.description = "The device has an 8-bit stack pointer",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.special)] = .{
.llvm_name = "special",
.description = "Enable use of the entire instruction set - used for debugging",
.dependencies = featureSet(&[_]Feature{
.addsubiw,
.@"break",
.des,
.eijmpcall,
.elpm,
.elpmx,
.ijmpcall,
.jmpcall,
.lpm,
.lpmx,
.memmappedregs,
.movw,
.mul,
.rmw,
.spm,
.spmx,
.sram,
}),
};
result[@intFromEnum(Feature.spm)] = .{
.llvm_name = "spm",
.description = "The device supports the `SPM` instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.spmx)] = .{
.llvm_name = "spmx",
.description = "The device supports the `SPM Z+` instruction",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.sram)] = .{
.llvm_name = "sram",
.description = "The device has random access memory",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.tinyencoding)] = .{
.llvm_name = "tinyencoding",
.description = "The device has Tiny core specific instruction encodings",
.dependencies = featureSet(&[_]Feature{}),
};
result[@intFromEnum(Feature.xmega)] = .{
.llvm_name = "xmega",
.description = "The device is a part of the xmega family",
.dependencies = featureSet(&[_]Feature{
.addsubiw,
.avr0,
.@"break",
.des,
.eijmpcall,
.elpm,
.elpmx,
.ijmpcall,
.jmpcall,
.lowbytefirst,
.lpm,
.lpmx,
.movw,
.mul,
.spm,
.spmx,
.sram,
}),
};
result[@intFromEnum(Feature.xmega3)] = .{
.llvm_name = "xmega3",
.description = "The device is a part of the xmega3 family",
.dependencies = featureSet(&[_]Feature{
.addsubiw,
.avr0,
.@"break",
.ijmpcall,
.jmpcall,
.lowbytefirst,
.lpm,
.lpmx,
.movw,
.mul,
.sram,
}),
};
result[@intFromEnum(Feature.xmegau)] = .{
.llvm_name = "xmegau",
.description = "The device is a part of the xmegau family",
.dependencies = featureSet(&[_]Feature{
.rmw,
.xmega,
}),
};
const ti = @typeInfo(Feature);
for (&result, 0..) |*elem, i| {
elem.index = i;
elem.name = ti.@"enum".fields[i].name;
}
break :blk result;
}