mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 12:27:41 +00:00
stage2 ARM: add testcases for non-leaf fns, parameters, return values
This commit is contained in:
parent
cfe486e388
commit
fb58fb2d8d
@ -402,7 +402,7 @@ pub const Instruction = union(enum) {
|
||||
return Instruction{
|
||||
.DataProcessing = .{
|
||||
.cond = @enumToInt(cond),
|
||||
.i = if (op2 == .Immediate) 1 else 0,
|
||||
.i = @boolToInt(op2 == .Immediate),
|
||||
.opcode = @enumToInt(opcode),
|
||||
.s = s,
|
||||
.rn = rn.id(),
|
||||
@ -430,11 +430,11 @@ pub const Instruction = union(enum) {
|
||||
.rd = rd.id(),
|
||||
.offset = offset.toU12(),
|
||||
.load_store = load_store,
|
||||
.write_back = if (write_back) 1 else 0,
|
||||
.write_back = @boolToInt(write_back),
|
||||
.byte_word = byte_word,
|
||||
.up_down = if (positive) 1 else 0,
|
||||
.pre_post = if (pre_index) 1 else 0,
|
||||
.imm = if (offset == .Immediate) 0 else 1,
|
||||
.up_down = @boolToInt(positive),
|
||||
.pre_post = @boolToInt(pre_index),
|
||||
.imm = @boolToInt(offset != .Immediate),
|
||||
},
|
||||
};
|
||||
}
|
||||
@ -454,7 +454,7 @@ pub const Instruction = union(enum) {
|
||||
.register_list = @bitCast(u16, reg_list),
|
||||
.rn = rn.id(),
|
||||
.load_store = load_store,
|
||||
.write_back = if (write_back) 1 else 0,
|
||||
.write_back = @boolToInt(write_back),
|
||||
.psr_or_user = psr_or_user,
|
||||
.up_down = up_down,
|
||||
.pre_post = pre_post,
|
||||
|
||||
116
test/stage2/arm.zig
Normal file
116
test/stage2/arm.zig
Normal file
@ -0,0 +1,116 @@
|
||||
const std = @import("std");
|
||||
const TestContext = @import("../../src/test.zig").TestContext;
|
||||
|
||||
const linux_arm = std.zig.CrossTarget{
|
||||
.cpu_arch = .arm,
|
||||
.os_tag = .linux,
|
||||
};
|
||||
|
||||
pub fn addCases(ctx: *TestContext) !void {
|
||||
{
|
||||
var case = ctx.exe("hello world", linux_arm);
|
||||
// Regular old hello world
|
||||
case.addCompareOutput(
|
||||
\\export fn _start() noreturn {
|
||||
\\ print();
|
||||
\\ exit();
|
||||
\\}
|
||||
\\
|
||||
\\fn print() void {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (4),
|
||||
\\ [arg1] "{r0}" (1),
|
||||
\\ [arg2] "{r1}" (@ptrToInt("Hello, World!\n")),
|
||||
\\ [arg3] "{r2}" (14)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ return;
|
||||
\\}
|
||||
\\
|
||||
\\fn exit() noreturn {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (1),
|
||||
\\ [arg1] "{r0}" (0)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
var case = ctx.exe("parameters and return values", linux_arm);
|
||||
// Testing simple parameters and return values
|
||||
//
|
||||
// TODO: The parameters to the asm statement in print() had to
|
||||
// be in a specific order because otherwise the write to r0
|
||||
// would overwrite the len parameter which resides in r0
|
||||
case.addCompareOutput(
|
||||
\\export fn _start() noreturn {
|
||||
\\ print(id(14));
|
||||
\\ exit();
|
||||
\\}
|
||||
\\
|
||||
\\fn id(x: u32) u32 {
|
||||
\\ return x;
|
||||
\\}
|
||||
\\
|
||||
\\fn print(len: u32) void {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (4),
|
||||
\\ [arg3] "{r2}" (len),
|
||||
\\ [arg1] "{r0}" (1),
|
||||
\\ [arg2] "{r1}" (@ptrToInt("Hello, World!\n"))
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ return;
|
||||
\\}
|
||||
\\
|
||||
\\fn exit() noreturn {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (1),
|
||||
\\ [arg1] "{r0}" (0)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
var case = ctx.exe("non-leaf functions", linux_arm);
|
||||
// Testing non-leaf functions
|
||||
case.addCompareOutput(
|
||||
\\export fn _start() noreturn {
|
||||
\\ foo();
|
||||
\\ exit();
|
||||
\\}
|
||||
\\
|
||||
\\fn foo() void {
|
||||
\\ bar();
|
||||
\\}
|
||||
\\
|
||||
\\fn bar() void {}
|
||||
\\
|
||||
\\fn exit() noreturn {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (1),
|
||||
\\ [arg1] "{r0}" (0)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
"",
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -21,11 +21,6 @@ const linux_riscv64 = std.zig.CrossTarget{
|
||||
.os_tag = .linux,
|
||||
};
|
||||
|
||||
const linux_arm = std.zig.CrossTarget{
|
||||
.cpu_arch = .arm,
|
||||
.os_tag = .linux,
|
||||
};
|
||||
|
||||
const wasi = std.zig.CrossTarget{
|
||||
.cpu_arch = .wasm32,
|
||||
.os_tag = .wasi,
|
||||
@ -35,6 +30,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
try @import("zir.zig").addCases(ctx);
|
||||
try @import("cbe.zig").addCases(ctx);
|
||||
try @import("spu-ii.zig").addCases(ctx);
|
||||
try @import("arm.zig").addCases(ctx);
|
||||
|
||||
{
|
||||
var case = ctx.exe("hello world with updates", linux_x64);
|
||||
@ -76,7 +72,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
// Now change the message only
|
||||
@ -108,7 +104,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"What is up? This is a longer message that will force the data to be relocated in virtual address space.\n",
|
||||
);
|
||||
// Now we print it twice.
|
||||
@ -184,42 +180,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
var case = ctx.exe("hello world", linux_arm);
|
||||
// Regular old hello world
|
||||
case.addCompareOutput(
|
||||
\\export fn _start() noreturn {
|
||||
\\ print();
|
||||
\\ exit();
|
||||
\\}
|
||||
\\
|
||||
\\fn print() void {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (4),
|
||||
\\ [arg1] "{r0}" (1),
|
||||
\\ [arg2] "{r1}" (@ptrToInt("Hello, World!\n")),
|
||||
\\ [arg3] "{r2}" (14)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ return;
|
||||
\\}
|
||||
\\
|
||||
\\fn exit() noreturn {
|
||||
\\ asm volatile ("svc #0"
|
||||
\\ :
|
||||
\\ : [number] "{r7}" (1),
|
||||
\\ [arg1] "{r0}" (0)
|
||||
\\ : "memory"
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
}
|
||||
@ -244,7 +205,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"Hello, World!\n",
|
||||
);
|
||||
}
|
||||
@ -271,7 +232,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
}
|
||||
@ -298,7 +259,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
}
|
||||
@ -329,7 +290,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -362,7 +323,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -398,7 +359,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -435,7 +396,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -465,7 +426,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -499,7 +460,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -523,7 +484,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -562,7 +523,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"hello\nhello\nhello\nhello\n",
|
||||
);
|
||||
|
||||
@ -599,7 +560,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -641,7 +602,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -693,7 +654,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -755,7 +716,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -788,7 +749,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -820,7 +781,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -845,7 +806,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -871,7 +832,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"",
|
||||
);
|
||||
|
||||
@ -904,7 +865,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ );
|
||||
\\ unreachable;
|
||||
\\}
|
||||
,
|
||||
,
|
||||
"hello\nhello\nhello\nhello\nhello\n",
|
||||
);
|
||||
}
|
||||
@ -923,7 +884,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ bar();
|
||||
\\}
|
||||
\\fn bar() void {}
|
||||
,
|
||||
,
|
||||
"42\n",
|
||||
);
|
||||
|
||||
@ -941,7 +902,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ bar();
|
||||
\\}
|
||||
\\fn bar() void {}
|
||||
,
|
||||
,
|
||||
"42\n",
|
||||
);
|
||||
|
||||
@ -957,10 +918,10 @@ pub fn addCases(ctx: *TestContext) !void {
|
||||
\\ bar();
|
||||
\\}
|
||||
\\fn bar() void {}
|
||||
,
|
||||
// This is what you get when you take the bits of the IEE-754
|
||||
// representation of 42.0 and reinterpret them as an unsigned
|
||||
// integer. Guess that's a bug in wasmtime.
|
||||
,
|
||||
// This is what you get when you take the bits of the IEE-754
|
||||
// representation of 42.0 and reinterpret them as an unsigned
|
||||
// integer. Guess that's a bug in wasmtime.
|
||||
"1109917696\n",
|
||||
);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user