aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Rubin <daviru007@icloud.com>2024-07-04 17:38:03 -0700
committerDavid Rubin <daviru007@icloud.com>2024-07-26 04:05:38 -0700
commit9766b68c475438e24885dd75cf137d51e72ccfa3 (patch)
tree85096570a8f57a68f209c741c5960d7bfb036786 /src
parentf2bf6c1b11702179329a4693cea429d550f519e1 (diff)
downloadzig-9766b68c475438e24885dd75cf137d51e72ccfa3.tar.gz
zig-9766b68c475438e24885dd75cf137d51e72ccfa3.zip
riscv: un-cache the `avl` and `vtype` when returning from a function call
the csrs `avl` and `vtype` are considered caller-saved so it could have changed while inside of the function. the easiest way to handle this is to just set the cached `vtype` and `avl` to null, so that the next time something needs to set it, it'll emit an instruction instead of relying on a potentially invalid setting.
Diffstat (limited to 'src')
-rw-r--r--src/arch/riscv64/CodeGen.zig11
-rw-r--r--src/arch/riscv64/Encoding.zig7
-rw-r--r--src/arch/riscv64/Mir.zig2
-rw-r--r--src/arch/riscv64/abi.zig2
4 files changed, 21 insertions, 1 deletions
diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig
index 6e203161c2..13713ccb84 100644
--- a/src/arch/riscv64/CodeGen.zig
+++ b/src/arch/riscv64/CodeGen.zig
@@ -2481,6 +2481,11 @@ fn genBinOp(
.Float => .vfsubvv,
else => unreachable,
},
+ .mul => switch (child_ty.zigTypeTag(zcu)) {
+ .Int => .vmulvv,
+ .Float => .vfmulvv,
+ else => unreachable,
+ },
else => return func.fail("TODO: genBinOp {s} Vector", .{@tagName(tag)}),
};
@@ -2490,7 +2495,7 @@ fn genBinOp(
16 => .@"16",
32 => .@"32",
64 => .@"64",
- else => unreachable,
+ else => return func.fail("TODO: genBinOp > 64 bit elements, found {d}", .{elem_size}),
},
.vlmul = .m1,
.vma = true,
@@ -4638,6 +4643,10 @@ fn genCall(
.lib => return func.fail("TODO: lib func calls", .{}),
}
+ // reset the vector settings as they might have changed in the function
+ func.avl = null;
+ func.vtype = null;
+
return call_info.return_value.short;
}
diff --git a/src/arch/riscv64/Encoding.zig b/src/arch/riscv64/Encoding.zig
index f4684fe42b..77cd905e7f 100644
--- a/src/arch/riscv64/Encoding.zig
+++ b/src/arch/riscv64/Encoding.zig
@@ -288,6 +288,9 @@ pub const Mnemonic = enum {
vfaddvv,
vfsubvv,
+ vmulvv,
+ vfmulvv,
+
vadcvv,
vmvvx,
@@ -546,9 +549,11 @@ pub const Mnemonic = enum {
.vsetvli => .{ .opcode = .OP_V, .data = .{ .f = .{ .funct3 = 0b111 } } },
.vaddvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b000000, .funct3 = .OPIVV } } },
.vsubvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b000010, .funct3 = .OPIVV } } },
+ .vmulvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b100101, .funct3 = .OPIVV } } },
.vfaddvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b000000, .funct3 = .OPFVV } } },
.vfsubvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b000010, .funct3 = .OPFVV } } },
+ .vfmulvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b100100, .funct3 = .OPFVV } } },
.vadcvv => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b010000, .funct3 = .OPMVV } } },
.vmvvx => .{ .opcode = .OP_V, .data = .{ .vecmath = .{ .vm = true, .funct6 = 0b010111, .funct3 = .OPIVX } } },
@@ -710,8 +715,10 @@ pub const InstEnc = enum {
.vaddvv,
.vsubvv,
+ .vmulvv,
.vfaddvv,
.vfsubvv,
+ .vfmulvv,
.vadcvv,
.vmvvx,
.vslidedownvx,
diff --git a/src/arch/riscv64/Mir.zig b/src/arch/riscv64/Mir.zig
index 1478bf5d5b..78da136706 100644
--- a/src/arch/riscv64/Mir.zig
+++ b/src/arch/riscv64/Mir.zig
@@ -145,6 +145,8 @@ pub const Inst = struct {
vfaddvv,
vsubvv,
vfsubvv,
+ vmulvv,
+ vfmulvv,
vslidedownvx,
/// A pseudo-instruction. Used for anything that isn't 1:1 with an
diff --git a/src/arch/riscv64/abi.zig b/src/arch/riscv64/abi.zig
index 3f5f7f6744..baed5cc68c 100644
--- a/src/arch/riscv64/abi.zig
+++ b/src/arch/riscv64/abi.zig
@@ -200,6 +200,8 @@ pub fn classifySystem(ty: Type, pt: Zcu.PerThread) [8]SystemClass {
result[0] = .integer;
return result;
}
+ // we should pass vector registers of size <= 128 through 2 integer registers
+ // but we haven't implemented seperating vector registers into register_pairs
return memory_class;
},
else => |bad_ty| std.debug.panic("classifySystem {s}", .{@tagName(bad_ty)}),