| ... | ... | @@ -2984,11 +2984,50 @@ pub fn addCCArgs( |
| 2984 | 2984 | // all CPU features here. |
| 2985 | 2985 | switch (target.cpu.arch) { |
| 2986 | 2986 | .riscv32, .riscv64 => { |
| 2987 | const RvArchFeat = struct { char: u8, feat: std.Target.riscv.Feature }; |
| 2988 | const letters = [_]RvArchFeat{ |
| 2989 | .{ .char = 'm', .feat = .m }, |
| 2990 | .{ .char = 'a', .feat = .a }, |
| 2991 | .{ .char = 'f', .feat = .f }, |
| 2992 | .{ .char = 'd', .feat = .d }, |
| 2993 | .{ .char = 'c', .feat = .c }, |
| 2994 | }; |
| 2995 | const prefix: []const u8 = if (target.cpu.arch == .riscv64) "rv64" else "rv32"; |
| 2996 | const prefix_len = 4; |
| 2997 | assert(prefix.len == prefix_len); |
| 2998 | var march_buf: [prefix_len + letters.len + 1]u8 = undefined; |
| 2999 | var march_index: usize = prefix_len; |
| 3000 | mem.copy(u8, &march_buf, prefix); |
| 3001 | |
| 3002 | if (std.Target.riscv.featureSetHas(target.cpu.features, .e)) { |
| 3003 | march_buf[march_index] = 'e'; |
| 3004 | } else { |
| 3005 | march_buf[march_index] = 'i'; |
| 3006 | } |
| 3007 | march_index += 1; |
| 3008 | |
| 3009 | for (letters) |letter| { |
| 3010 | if (std.Target.riscv.featureSetHas(target.cpu.features, letter.feat)) { |
| 3011 | march_buf[march_index] = letter.char; |
| 3012 | march_index += 1; |
| 3013 | } |
| 3014 | } |
| 3015 | |
| 3016 | const march_arg = try std.fmt.allocPrint(arena, "-march={s}", .{ |
| 3017 | march_buf[0..march_index], |
| 3018 | }); |
| 3019 | try argv.append(march_arg); |
| 3020 | |
| 2987 | 3021 | if (std.Target.riscv.featureSetHas(target.cpu.features, .relax)) { |
| 2988 | 3022 | try argv.append("-mrelax"); |
| 2989 | 3023 | } else { |
| 2990 | 3024 | try argv.append("-mno-relax"); |
| 2991 | 3025 | } |
| 3026 | if (std.Target.riscv.featureSetHas(target.cpu.features, .save_restore)) { |
| 3027 | try argv.append("-msave-restore"); |
| 3028 | } else { |
| 3029 | try argv.append("-mno-save-restore"); |
| 3030 | } |
| 2992 | 3031 | }, |
| 2993 | 3032 | else => { |
| 2994 | 3033 | // TODO |