Merge pull request #21095 from alexrp/mips64-tests

Get `mips64(el)-linux` working and start testing it
This commit is contained in:
Andrew Kelley 2024-08-22 20:09:08 -07:00 committed by GitHub
commit ee84deda98
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 424 additions and 275 deletions

View File

@ -2722,7 +2722,39 @@ pub const SYS = switch (native_os) {
};
/// Renamed from `sigaction` to `Sigaction` to avoid conflict with function name.
pub const Sigaction = switch (native_os) {
.linux => linux.Sigaction,
.linux => switch (native_arch) {
.mips,
.mipsel,
.mips64,
.mips64el,
=> if (builtin.target.isMusl())
linux.Sigaction
else if (builtin.target.ptrBitWidth() == 64) extern struct {
pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void;
flags: c_uint,
handler: extern union {
handler: ?handler_fn,
sigaction: ?sigaction_fn,
},
mask: sigset_t,
restorer: ?*const fn () callconv(.C) void = null,
} else extern struct {
pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void;
flags: c_uint,
handler: extern union {
handler: ?handler_fn,
sigaction: ?sigaction_fn,
},
mask: sigset_t,
restorer: ?*const fn () callconv(.C) void = null,
__resv: [1]c_int = .{0},
},
else => linux.Sigaction,
},
.emscripten => emscripten.Sigaction,
.netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
@ -6326,16 +6358,46 @@ pub const Stat = switch (native_os) {
return self.ctim;
}
},
.mips, .mipsel => extern struct {
.mips, .mipsel => if (builtin.target.isMusl()) extern struct {
dev: dev_t,
__pad0: [2]u32,
__pad0: [2]i32,
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: dev_t,
__pad1: [2]u32,
__pad1: [2]i32,
size: off_t,
atim: timespec,
mtim: timespec,
ctim: timespec,
blksize: blksize_t,
__pad3: i32,
blocks: blkcnt_t,
__pad4: [14]i32,
pub fn atime(self: @This()) timespec {
return self.atim;
}
pub fn mtime(self: @This()) timespec {
return self.mtim;
}
pub fn ctime(self: @This()) timespec {
return self.ctim;
}
} else extern struct {
dev: dev_t,
__pad0: [3]u32,
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: dev_t,
__pad1: [3]u32,
size: off_t,
atim: timespec,
mtim: timespec,
@ -6357,6 +6419,68 @@ pub const Stat = switch (native_os) {
return self.ctim;
}
},
.mips64, .mips64el => if (builtin.target.isMusl()) extern struct {
dev: dev_t,
__pad0: [3]i32,
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: dev_t,
__pad1: [2]u32,
size: off_t,
__pad2: i32,
atim: timespec,
mtim: timespec,
ctim: timespec,
blksize: blksize_t,
__pad3: u32,
blocks: blkcnt_t,
__pad4: [14]i32,
pub fn atime(self: @This()) timespec {
return self.atim;
}
pub fn mtime(self: @This()) timespec {
return self.mtim;
}
pub fn ctime(self: @This()) timespec {
return self.ctim;
}
} else extern struct {
dev: dev_t,
__pad0: [3]u32,
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: dev_t,
__pad1: [3]u32,
size: off_t,
atim: timespec,
mtim: timespec,
ctim: timespec,
blksize: blksize_t,
__pad3: u32,
blocks: blkcnt_t,
__pad4: [14]i32,
pub fn atime(self: @This()) timespec {
return self.atim;
}
pub fn mtime(self: @This()) timespec {
return self.mtim;
}
pub fn ctime(self: @This()) timespec {
return self.ctim;
}
},
else => std.os.linux.Stat, // libc stat is the same as kernel stat.
},

View File

@ -56,6 +56,8 @@ pub const sys_can_stack_trace = switch (builtin.cpu.arch) {
// TODO: Make this work.
.mips,
.mipsel,
.mips64,
.mips64el,
=> false,
// `@returnAddress()` in LLVM 10 gives

View File

@ -2272,7 +2272,7 @@ pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
length_halves[0],
length_halves[1],
);
} else if (comptime native_arch == .mips or native_arch == .mipsel) {
} else if (native_arch.isMIPS32()) {
// MIPS O32 does not deal with the register alignment issue, so pass a dummy value.
const offset_halves = splitValue64(offset);
@ -2382,7 +2382,7 @@ pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize {
}
pub const E = switch (native_arch) {
.mips, .mipsel => enum(u16) {
.mips, .mipsel, .mips64, .mips64el => enum(u16) {
/// No error occurred.
SUCCESS = 0,
@ -7068,53 +7068,166 @@ pub const ifreq = extern struct {
};
// doc comments copied from musl
pub const rlimit_resource = if (native_arch.isMIPS() or native_arch.isSPARC())
arch_bits.rlimit_resource
else
enum(c_int) {
pub const rlimit_resource = if (native_arch.isMIPS()) enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU,
CPU = 0,
/// Largest file that can be created, in bytes.
FSIZE,
FSIZE = 1,
/// Maximum size of data segment, in bytes.
DATA,
DATA = 2,
/// Maximum size of stack segment, in bytes.
STACK,
STACK = 3,
/// Largest core file that can be created, in bytes.
CORE,
CORE = 4,
/// Number of open files.
NOFILE = 5,
/// Address space limit.
AS = 6,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS,
RSS = 7,
/// Number of processes.
NPROC,
/// Number of open files.
NOFILE,
NPROC = 8,
/// Locked-in-memory address space.
MEMLOCK,
/// Address space limit.
AS,
MEMLOCK = 9,
/// Maximum number of file locks.
LOCKS,
LOCKS = 10,
/// Maximum number of pending signals.
SIGPENDING,
SIGPENDING = 11,
/// Maximum bytes in POSIX message queues.
MSGQUEUE,
MSGQUEUE = 12,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE,
NICE = 13,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO,
RTPRIO = 14,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME,
RTTIME = 15,
_,
};
} else if (native_arch.isSPARC()) enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU = 0,
/// Largest file that can be created, in bytes.
FSIZE = 1,
/// Maximum size of data segment, in bytes.
DATA = 2,
/// Maximum size of stack segment, in bytes.
STACK = 3,
/// Largest core file that can be created, in bytes.
CORE = 4,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS = 5,
/// Number of open files.
NOFILE = 6,
/// Number of processes.
NPROC = 7,
/// Locked-in-memory address space.
MEMLOCK = 8,
/// Address space limit.
AS = 9,
/// Maximum number of file locks.
LOCKS = 10,
/// Maximum number of pending signals.
SIGPENDING = 11,
/// Maximum bytes in POSIX message queues.
MSGQUEUE = 12,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE = 13,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO = 14,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME = 15,
_,
} else enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU = 0,
/// Largest file that can be created, in bytes.
FSIZE = 1,
/// Maximum size of data segment, in bytes.
DATA = 2,
/// Maximum size of stack segment, in bytes.
STACK = 3,
/// Largest core file that can be created, in bytes.
CORE = 4,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS = 5,
/// Number of processes.
NPROC = 6,
/// Number of open files.
NOFILE = 7,
/// Locked-in-memory address space.
MEMLOCK = 8,
/// Address space limit.
AS = 9,
/// Maximum number of file locks.
LOCKS = 10,
/// Maximum number of pending signals.
SIGPENDING = 11,
/// Maximum bytes in POSIX message queues.
MSGQUEUE = 12,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE = 13,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO = 14,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME = 15,
_,
};
pub const rlim_t = u64;

View File

@ -14,7 +14,8 @@ const timespec = linux.timespec;
pub fn syscall0(number: SYS) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
\\ .set noat
\\ .set noreorder
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ nop
\\ b 2f
\\ subu $2, $0, $2
@ -46,7 +47,8 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
pub fn syscall1(number: SYS, arg1: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -59,7 +61,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -73,7 +76,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -88,7 +92,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -108,7 +113,8 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
\\ sw %[arg5], 16($sp)
\\ syscall
\\ addu $sp, $sp, 24
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -141,7 +147,8 @@ pub fn syscall6(
\\ sw %[arg6], 20($sp)
\\ syscall
\\ addu $sp, $sp, 24
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -174,7 +181,8 @@ pub fn syscall7(
\\ sw %[arg7], 24($sp)
\\ syscall
\\ addu $sp, $sp, 32
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ subu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -314,7 +322,7 @@ pub const msghdr_const = extern struct {
flags: i32,
};
pub const blksize_t = i32;
pub const blksize_t = u32;
pub const nlink_t = u32;
pub const time_t = i32;
pub const mode_t = u32;
@ -323,36 +331,47 @@ pub const ino_t = u64;
pub const dev_t = u64;
pub const blkcnt_t = i64;
// The `stat` definition used by the Linux kernel.
// The `stat64` definition used by the Linux kernel.
pub const Stat = extern struct {
dev: u32,
__pad0: [3]u32, // Reserved for st_dev expansion
dev: dev_t,
__pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: u32,
__pad1: [3]u32,
rdev: dev_t,
__pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
size: off_t,
atim: timespec,
mtim: timespec,
ctim: timespec,
atim: i32,
atim_nsec: u32,
mtim: i32,
mtim_nsec: u32,
ctim: i32,
ctim_nsec: u32,
blksize: blksize_t,
__pad3: u32,
blocks: blkcnt_t,
__pad4: [14]usize,
pub fn atime(self: @This()) timespec {
return self.atim;
return .{
.sec = self.atim,
.nsec = self.atim_nsec,
};
}
pub fn mtime(self: @This()) timespec {
return self.mtim;
return .{
.sec = self.mtim,
.nsec = self.mtim_nsec,
};
}
pub fn ctime(self: @This()) timespec {
return self.ctim;
return .{
.sec = self.ctim,
.nsec = self.ctim_nsec,
};
}
};
@ -368,66 +387,6 @@ pub const timezone = extern struct {
pub const Elf_Symndx = u32;
pub const rlimit_resource = enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU,
/// Largest file that can be created, in bytes.
FSIZE,
/// Maximum size of data segment, in bytes.
DATA,
/// Maximum size of stack segment, in bytes.
STACK,
/// Largest core file that can be created, in bytes.
CORE,
/// Number of open files.
NOFILE,
/// Address space limit.
AS,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS,
/// Number of processes.
NPROC,
/// Locked-in-memory address space.
MEMLOCK,
/// Maximum number of file locks.
LOCKS,
/// Maximum number of pending signals.
SIGPENDING,
/// Maximum bytes in POSIX message queues.
MSGQUEUE,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME,
_,
};
/// TODO
pub const ucontext_t = void;

View File

@ -14,7 +14,8 @@ const timespec = linux.timespec;
pub fn syscall0(number: SYS) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -28,7 +29,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
\\ .set noat
\\ .set noreorder
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ nop
\\ b 2f
\\ subu $2, $0, $2
@ -46,7 +47,9 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
pub fn syscall1(number: SYS, arg1: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ nop
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -59,7 +62,8 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -73,7 +77,8 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -88,7 +93,8 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -104,7 +110,8 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -129,7 +136,8 @@ pub fn syscall6(
) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -156,7 +164,8 @@ pub fn syscall7(
) usize {
return asm volatile (
\\ syscall
\\ blez $7, 1f
\\ beq $7, $zero, 1f
\\ blez $2, 1f
\\ dsubu $2, $0, $2
\\ 1:
: [ret] "={$2}" (-> usize),
@ -292,7 +301,7 @@ pub const msghdr_const = extern struct {
flags: i32,
};
pub const blksize_t = i32;
pub const blksize_t = u32;
pub const nlink_t = u32;
pub const time_t = i32;
pub const mode_t = u32;
@ -303,34 +312,45 @@ pub const blkcnt_t = i64;
// The `stat` definition used by the Linux kernel.
pub const Stat = extern struct {
dev: u32,
__pad0: [3]u32, // Reserved for st_dev expansion
dev: dev_t,
__pad0: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
ino: ino_t,
mode: mode_t,
nlink: nlink_t,
uid: uid_t,
gid: gid_t,
rdev: u32,
__pad1: [3]u32,
rdev: dev_t,
__pad1: [2]u32, // -1 because our dev_t is u64 (kernel dev_t is really u32).
size: off_t,
atim: timespec,
mtim: timespec,
ctim: timespec,
atim: u32,
atim_nsec: u32,
mtim: u32,
mtim_nsec: u32,
ctim: u32,
ctim_nsec: u32,
blksize: blksize_t,
__pad3: u32,
blocks: blkcnt_t,
__pad4: [14]usize,
pub fn atime(self: @This()) timespec {
return self.atim;
return .{
.sec = self.atim,
.nsec = self.atim_nsec,
};
}
pub fn mtime(self: @This()) timespec {
return self.mtim;
return .{
.sec = self.mtim,
.nsec = self.mtim_nsec,
};
}
pub fn ctime(self: @This()) timespec {
return self.ctim;
return .{
.sec = self.ctim,
.nsec = self.ctim_nsec,
};
}
};
@ -346,66 +366,6 @@ pub const timezone = extern struct {
pub const Elf_Symndx = u32;
pub const rlimit_resource = enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU,
/// Largest file that can be created, in bytes.
FSIZE,
/// Maximum size of data segment, in bytes.
DATA,
/// Maximum size of stack segment, in bytes.
STACK,
/// Largest core file that can be created, in bytes.
CORE,
/// Number of open files.
NOFILE,
/// Address space limit.
AS,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS,
/// Number of processes.
NPROC,
/// Locked-in-memory address space.
MEMLOCK,
/// Maximum number of file locks.
LOCKS,
/// Maximum number of pending signals.
SIGPENDING,
/// Maximum bytes in POSIX message queues.
MSGQUEUE,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME,
_,
};
/// TODO
pub const ucontext_t = void;

View File

@ -448,63 +448,3 @@ pub const ucontext_t = extern struct {
/// TODO
pub const getcontext = {};
pub const rlimit_resource = enum(c_int) {
/// Per-process CPU limit, in seconds.
CPU,
/// Largest file that can be created, in bytes.
FSIZE,
/// Maximum size of data segment, in bytes.
DATA,
/// Maximum size of stack segment, in bytes.
STACK,
/// Largest core file that can be created, in bytes.
CORE,
/// Largest resident set size, in bytes.
/// This affects swapping; processes that are exceeding their
/// resident set size will be more likely to have physical memory
/// taken from them.
RSS,
/// Number of open files.
NOFILE,
/// Number of processes.
NPROC,
/// Locked-in-memory address space.
MEMLOCK,
/// Address space limit.
AS,
/// Maximum number of file locks.
LOCKS,
/// Maximum number of pending signals.
SIGPENDING,
/// Maximum bytes in POSIX message queues.
MSGQUEUE,
/// Maximum nice priority allowed to raise to.
/// Nice levels 19 .. -20 correspond to 0 .. 39
/// values of this resource limit.
NICE,
/// Maximum realtime priority allowed for non-privileged
/// processes.
RTPRIO,
/// Maximum CPU time in µs that a process scheduled under a real-time
/// scheduling policy may consume without making a blocking system
/// call before being forcibly descheduled.
RTTIME,
_,
};

View File

@ -146,6 +146,8 @@ test "@min/max for floats" {
};
inline for (.{ f16, f32, f64, f80, f128, c_longdouble }) |T| {
if (T == c_longdouble and builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21090
try S.doTheTest(T);
try comptime S.doTheTest(T);
}

View File

@ -773,6 +773,7 @@ test "vector reduce operation" {
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21091
const S = struct {
fn testReduce(comptime op: std.builtin.ReduceOp, x: anytype, expected: anytype) !void {

View File

@ -365,6 +365,54 @@ const test_targets = blk: {
.slow_backend = true,
},
.{
.target = .{
.cpu_arch = .mips64,
.os_tag = .linux,
.abi = .none,
},
},
.{
.target = .{
.cpu_arch = .mips64,
.os_tag = .linux,
.abi = .musl,
},
.link_libc = true,
},
.{
.target = .{
.cpu_arch = .mips64,
.os_tag = .linux,
.abi = .gnuabi64,
},
.link_libc = true,
},
.{
.target = .{
.cpu_arch = .mips64el,
.os_tag = .linux,
.abi = .none,
},
},
.{
.target = .{
.cpu_arch = .mips64el,
.os_tag = .linux,
.abi = .musl,
},
.link_libc = true,
},
.{
.target = .{
.cpu_arch = .mips64el,
.os_tag = .linux,
.abi = .gnuabi64,
},
.link_libc = true,
},
.{
.target = .{
.cpu_arch = .powerpc,