| ... | ... | @@ -11,11 +11,18 @@ const FeatureOverride = struct { |
| 11 | 11 | desc: ?[]const u8 = null, |
| 12 | 12 | }; |
| 13 | 13 | |
| 14 | const ExtraCpu = struct { |
| 15 | llvm_name: ?[]const u8, |
| 16 | zig_name: []const u8, |
| 17 | features: []const []const u8, |
| 18 | }; |
| 19 | |
| 14 | 20 | const LlvmTarget = struct { |
| 15 | 21 | zig_name: []const u8, |
| 16 | 22 | llvm_name: []const u8, |
| 17 | 23 | td_name: []const u8, |
| 18 | 24 | feature_overrides: []const FeatureOverride = &.{}, |
| 25 | extra_cpus: []const ExtraCpu = &.{}, |
| 19 | 26 | branch_quota: ?usize = null, |
| 20 | 27 | }; |
| 21 | 28 | |
| ... | ... | @@ -98,6 +105,18 @@ const llvm_targets = [_]LlvmTarget{ |
| 98 | 105 | .zig_name = "riscv", |
| 99 | 106 | .llvm_name = "RISCV", |
| 100 | 107 | .td_name = "RISCV.td", |
| 108 | .extra_cpus = &.{ |
| 109 | .{ |
| 110 | .llvm_name = null, |
| 111 | .zig_name = "baseline_rv32", |
| 112 | .features = &.{ "a", "c", "d", "f", "m" }, |
| 113 | }, |
| 114 | .{ |
| 115 | .llvm_name = null, |
| 116 | .zig_name = "baseline_rv64", |
| 117 | .features = &.{ "64bit", "a", "c", "d", "f", "m" }, |
| 118 | }, |
| 119 | }, |
| 101 | 120 | }, |
| 102 | 121 | .{ |
| 103 | 122 | .zig_name = "sparc", |
| ... | ... | @@ -433,7 +452,44 @@ fn processOneTarget(job: Job) anyerror!void { |
| 433 | 452 | \\pub const cpu = struct { |
| 434 | 453 | \\ |
| 435 | 454 | ); |
| 436 | | |
| 455 | for (llvm_target.extra_cpus) |extra_cpu| { |
| 456 | try w.print( |
| 457 | \\ pub const {} = CpuModel{{ |
| 458 | \\ .name = "{}", |
| 459 | \\ |
| 460 | , .{ |
| 461 | std.zig.fmtId(extra_cpu.zig_name), |
| 462 | std.zig.fmtEscapes(extra_cpu.zig_name), |
| 463 | }); |
| 464 | if (extra_cpu.llvm_name) |llvm_name| { |
| 465 | try w.print( |
| 466 | \\ .llvm_name = "{}", |
| 467 | \\ .features = featureSet(&[_]Feature{{ |
| 468 | , .{std.zig.fmtEscapes(llvm_name)}); |
| 469 | } else { |
| 470 | try w.writeAll( |
| 471 | \\ .llvm_name = null, |
| 472 | \\ .features = featureSet(&[_]Feature{ |
| 473 | ); |
| 474 | } |
| 475 | if (extra_cpu.features.len == 0) { |
| 476 | try w.writeAll( |
| 477 | \\}), |
| 478 | \\ }; |
| 479 | \\ |
| 480 | ); |
| 481 | } else { |
| 482 | try w.writeAll("\n"); |
| 483 | for (extra_cpu.features) |feature_zig_name| { |
| 484 | try w.print(" .{},\n", .{std.zig.fmtId(feature_zig_name)}); |
| 485 | } |
| 486 | try w.writeAll( |
| 487 | \\ }), |
| 488 | \\ }; |
| 489 | \\ |
| 490 | ); |
| 491 | } |
| 492 | } |
| 437 | 493 | for (all_cpus.items) |obj| { |
| 438 | 494 | const llvm_name = obj.get("Name").?.String; |
| 439 | 495 | var deps_set = std.StringHashMap(void).init(arena); |
| ... | ... | @@ -516,7 +572,7 @@ fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn { |
| 516 | 572 | fn objectLessThan(context: void, a: *json.ObjectMap, b: *json.ObjectMap) bool { |
| 517 | 573 | const a_key = a.get("Name").?.String; |
| 518 | 574 | const b_key = b.get("Name").?.String; |
| 519 | | return std.mem.lessThan(u8, a_key, b_key); |
| 575 | return std.ascii.lessThanIgnoreCase(a_key, b_key); |
| 520 | 576 | } |
| 521 | 577 | |
| 522 | 578 | fn llvmNameToZigName( |