aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-01-19 23:36:42 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-23 13:48:36 -0500
commit1aa2c32055c53657fd3a9825427454e0d74c20ed (patch)
tree382eb6948ec3ae17e373ef0ec75945d14a2c2e4a /src/codegen
parentce6de2df826347feadb66d087c43c77b2891dc0b (diff)
downloadzig-1aa2c32055c53657fd3a9825427454e0d74c20ed.tar.gz
zig-1aa2c32055c53657fd3a9825427454e0d74c20ed.zip
cbe: fixes for x86
- Emit calling convention - Fix .Naked handling for msvc - Add teb helper for x86 - Fix 128-bit shl implementation when rhs is >= 64 - Add 128-bit shl tests
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index c1adbfe6cf..18b3a32c36 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -1459,7 +1459,12 @@ pub const DeclGen = struct {
fn renderFunctionSignature(dg: *DeclGen, w: anytype, kind: TypedefKind, export_index: u32) !void {
const fn_info = dg.decl.ty.fnInfo();
- if (fn_info.cc == .Naked) try w.writeAll("zig_naked ");
+ if (fn_info.cc == .Naked) {
+ switch (kind) {
+ .Forward => try w.writeAll("zig_naked_decl "),
+ .Complete => try w.writeAll("zig_naked "),
+ }
+ }
if (dg.decl.val.castTag(.function)) |func_payload|
if (func_payload.data.is_cold) try w.writeAll("zig_cold ");
@@ -1469,6 +1474,13 @@ pub const DeclGen = struct {
try dg.renderType(w, ret_ty, kind);
try w.writeByte(' ');
+
+ if (toCallingConvention(fn_info.cc)) |call_conv| {
+ try w.print("zig_callconv({s}) ", .{call_conv});
+ }
+
+ if (fn_info.alignment > 0 and kind == .Complete) try w.print(" zig_align_fn({})", .{ fn_info.alignment });
+
try dg.renderDeclName(w, dg.decl_index, export_index);
try w.writeByte('(');
@@ -1488,7 +1500,7 @@ pub const DeclGen = struct {
try dg.renderType(w, Type.void, kind);
}
try w.writeByte(')');
- if (fn_info.alignment > 0) try w.print(" zig_align_fn({})", .{fn_info.alignment});
+ if (fn_info.alignment > 0 and kind == .Forward) try w.print(" zig_align_fn({})", .{fn_info.alignment});
}
fn renderPtrToFnTypedef(dg: *DeclGen, t: Type) error{ OutOfMemory, AnalysisFail }![]const u8 {
@@ -7035,6 +7047,15 @@ fn writeMemoryOrder(w: anytype, order: std.builtin.AtomicOrder) !void {
return w.writeAll(toMemoryOrder(order));
}
+fn toCallingConvention(call_conv: std.builtin.CallingConvention) ?[]const u8 {
+ return switch (call_conv) {
+ .Stdcall => "stdcall",
+ .Fastcall => "fastcall",
+ .Vectorcall => "vectorcall",
+ else => null,
+ };
+}
+
fn toAtomicRmwSuffix(order: std.builtin.AtomicRmwOp) []const u8 {
return switch (order) {
.Xchg => "xchg",