diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Air.zig | 1 | ||||
| -rw-r--r-- | src/InternPool.zig | 5 | ||||
| -rw-r--r-- | src/Sema.zig | 1 | ||||
| -rw-r--r-- | src/Type.zig | 1 | ||||
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 2115 | ||||
| -rw-r--r-- | src/codegen/c/Type.zig | 15 |
6 files changed, 1942 insertions, 196 deletions
diff --git a/src/Air.zig b/src/Air.zig index f6ca6edb03..22727adbd9 100644 --- a/src/Air.zig +++ b/src/Air.zig @@ -1001,6 +1001,7 @@ pub const Inst = struct { vector_4_u64_type = @intFromEnum(InternPool.Index.vector_4_u64_type), vector_4_f16_type = @intFromEnum(InternPool.Index.vector_4_f16_type), vector_8_f16_type = @intFromEnum(InternPool.Index.vector_8_f16_type), + vector_2_f32_type = @intFromEnum(InternPool.Index.vector_2_f32_type), vector_4_f32_type = @intFromEnum(InternPool.Index.vector_4_f32_type), vector_8_f32_type = @intFromEnum(InternPool.Index.vector_8_f32_type), vector_2_f64_type = @intFromEnum(InternPool.Index.vector_2_f64_type), diff --git a/src/InternPool.zig b/src/InternPool.zig index ed585a0393..3668228e07 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -4593,6 +4593,7 @@ pub const Index = enum(u32) { vector_4_u64_type, vector_4_f16_type, vector_8_f16_type, + vector_2_f32_type, vector_4_f32_type, vector_8_f32_type, vector_2_f64_type, @@ -5124,6 +5125,8 @@ pub const static_keys = [_]Key{ .{ .vector_type = .{ .len = 4, .child = .f16_type } }, // @Vector(8, f16) .{ .vector_type = .{ .len = 8, .child = .f16_type } }, + // @Vector(2, f32) + .{ .vector_type = .{ .len = 2, .child = .f32_type } }, // @Vector(4, f32) .{ .vector_type = .{ .len = 4, .child = .f32_type } }, // @Vector(8, f32) @@ -11778,6 +11781,7 @@ pub fn typeOf(ip: *const InternPool, index: Index) Index { .vector_4_u64_type, .vector_4_f16_type, .vector_8_f16_type, + .vector_2_f32_type, .vector_4_f32_type, .vector_8_f32_type, .vector_2_f64_type, @@ -12117,6 +12121,7 @@ pub fn zigTypeTag(ip: *const InternPool, index: Index) std.builtin.TypeId { .vector_4_u64_type, .vector_4_f16_type, .vector_8_f16_type, + .vector_2_f32_type, .vector_4_f32_type, .vector_8_f32_type, .vector_2_f64_type, diff --git a/src/Sema.zig b/src/Sema.zig index 4a11dd4544..8c7962fbde 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -36733,6 +36733,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { .vector_4_u64_type, .vector_4_f16_type, .vector_8_f16_type, + .vector_2_f32_type, .vector_4_f32_type, .vector_8_f32_type, .vector_2_f64_type, diff --git a/src/Type.zig b/src/Type.zig index e6fc9c7d6a..8b9690e76c 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -4209,6 +4209,7 @@ pub const vector_2_u64: Type = .{ .ip_index = .vector_2_u64_type }; pub const vector_4_u64: Type = .{ .ip_index = .vector_4_u64_type }; pub const vector_4_f16: Type = .{ .ip_index = .vector_4_f16_type }; pub const vector_8_f16: Type = .{ .ip_index = .vector_8_f16_type }; +pub const vector_2_f32: Type = .{ .ip_index = .vector_2_f32_type }; pub const vector_4_f32: Type = .{ .ip_index = .vector_4_f32_type }; pub const vector_8_f32: Type = .{ .ip_index = .vector_8_f32_type }; pub const vector_2_f64: Type = .{ .ip_index = .vector_2_f64_type }; diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 5b56cc4c02..24fcf31064 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -2414,7 +2414,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { - @setEvalBranchQuota(3_900); + @setEvalBranchQuota(4_100); const pt = cg.pt; const zcu = pt.zcu; const ip = &zcu.intern_pool; @@ -5567,13 +5567,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) }, .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5600,14 +5600,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5634,7 +5634,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, @@ -5642,7 +5642,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5657,7 +5657,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .eax } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, .{ .type = .f32, .kind = .mem }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, @@ -5669,7 +5669,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, @@ -5680,7 +5680,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5878,14 +5878,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5911,7 +5911,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -5919,7 +5919,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -5945,7 +5945,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -5955,7 +5955,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6179,14 +6179,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, .{ ._, .v_pd, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6212,7 +6212,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -6220,7 +6220,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6246,7 +6246,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -6256,7 +6256,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6283,14 +6283,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(8), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6580,12 +6580,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6612,12 +6612,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -6644,12 +6644,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, } }) catch |err| switch (err) { @@ -9411,13 +9411,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) }, .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9444,14 +9444,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9478,7 +9478,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, @@ -9486,7 +9486,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9501,7 +9501,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .eax } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, .{ .type = .f32, .kind = .mem }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, @@ -9513,7 +9513,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, @@ -9524,7 +9524,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9722,14 +9722,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, .{ ._, .v_ps, .min, .tmp1y, .tmp2y, .tmp1y, ._ }, .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9755,7 +9755,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -9763,7 +9763,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -9789,7 +9789,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -9799,7 +9799,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10023,14 +10023,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, .{ ._, .v_pd, .min, .tmp1y, .tmp2y, .tmp1y, ._ }, .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10056,7 +10056,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -10064,7 +10064,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10090,7 +10090,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, @@ -10100,7 +10100,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10127,14 +10127,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(8), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10412,12 +10412,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10444,12 +10444,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -10476,12 +10476,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, } }) catch |err| switch (err) { @@ -11990,13 +11990,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_src0_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp2q, .leaia(.qword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_src0_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp2q, .leai(.qword, .tmp1, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 8), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .patterns = &.{ @@ -12015,13 +12016,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_src0_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp2d, .leaia(.dword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_src0_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .leai(.dword, .tmp1, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp2d, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 4), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, } }, } }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ @@ -20246,7 +20248,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 8), ._, ._ }, .{ ._, ._, .sub, .tmp1d, .si(8), ._, ._ }, .{ ._, ._a, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .cmp, .tmp0d, .sa(.none, .add_src0_unaligned_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ }, .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, } }, }, .{ @@ -21899,7 +21901,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .patterns = &.{ .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, } }, @@ -21910,7 +21912,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .patterns = &.{ .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, } }, @@ -21921,7 +21923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .patterns = &.{ .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_, .cvtps2ph, .dst0x, .src0y, .rm(.{}), ._ }, } }, @@ -21950,6 +21952,152 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memsia(.src0y, .@"2", .tmp0, .add_size), ._, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, @@ -21975,60 +22123,158 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, + .{ .src = .{ .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, - .{ ._, .v_ss, .cvtsd2, .dst0x, .dst0x, .src0q, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_ss, .cvtsd2, .dst0x, .src0x, .src0q, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mut_sse, .none } }, + .{ .src = .{ .mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, ._ss, .cvtsd2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_ss, .cvtsd2, .dst0x, .dst0x, .src0q, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .sse, .none } }, + .{ .src = .{ .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, - .{ ._, ._ss, .cvtsd2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ss, .cvtsd2, .dst0x, .src0x, .src0q, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .mem, .none } }, + .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ + .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, .{ ._, ._ss, .cvtsd2, .dst0x, .src0q, ._, ._ }, } }, }, .{ @@ -22062,9 +22308,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtpd2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, @@ -22074,9 +22320,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, ._ps, .cvtpd2, .dst0x, .src0q, ._, ._ }, + .{ ._, ._ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -22086,12 +22332,93 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtpd2, .dst0x, .src0y, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtpd2, .tmp1x, .memsia(.src0y, .@"2", .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .cvtpd2, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtpd2, .dst0y, .src0x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .avx, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ @@ -22117,7 +22444,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .sse2, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ @@ -22143,7 +22470,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .sse, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ @@ -22169,6 +22496,129 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, @@ -22194,6 +22644,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ @@ -22217,6 +22694,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, @@ -22241,6 +22745,125 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, @@ -22265,6 +22888,93 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, @@ -22289,6 +22999,93 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, @@ -22312,6 +23109,96 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, } }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ @tagName(air_tag), @@ -22334,7 +23221,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .patterns = &.{ .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, } }, @@ -22346,7 +23233,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, } }, @@ -22358,7 +23245,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, } }, @@ -22388,12 +23275,130 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .dst0d, ._ }, @@ -22406,7 +23411,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, .{ ._, .v_pd, .cvtps2, .dst0x, .dst0q, ._, ._ }, @@ -22419,12 +23424,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, .{ ._, .v_pd, .cvtps2, .dst0y, .dst0x, ._, ._ }, } }, }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .zword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none } }, + .{ .src = .{ .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .tmp0y, .src0x, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, + .{ ._, .v_f128, .extract, .tmp0x, .tmp0y, .ui(1), ._ }, + .{ ._, .v_pd, .mova, .mem(.dst0y), .tmp1y, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, + .{ ._, .v_pd, .mova, .memd(.dst0y, 32), .tmp1y, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, @@ -22449,6 +23482,128 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, + .{ ._, .v_f128, .extract, .tmp1x, .tmp1y, .ui(1), ._ }, + .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"4", .tmp0, .add_size), .tmp2y, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, + .{ ._, .v_pd, .mova, .memsiad(.dst0y, .@"4", .tmp0, .add_size, 32), .tmp2y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .f16c, .x87, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, @@ -22456,7 +23611,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } }, + .{ .type = .f32, .kind = .{ .rc = .sse } }, .{ .type = .f32, .kind = .mem }, .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, @@ -22498,6 +23653,100 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, @@ -22523,60 +23772,129 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, + .{ .src = .{ .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, - .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .src0d, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_sd, .cvtss2, .dst0x, .src0x, .src0d, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mut_sse, .none } }, + .{ .src = .{ .mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, ._sd, .cvtss2, .dst0x, .src0d, ._, ._ }, + .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .src0d, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .sse, .none } }, + .{ .src = .{ .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ - .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, - .{ ._, ._sd, .cvtss2, .dst0x, .src0d, ._, ._ }, + .{ ._, .v_sd, .cvtss2, .dst0x, .src0x, .src0d, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .mem, .none } }, + .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ + .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, .{ ._, ._sd, .cvtss2, .dst0x, .src0d, ._, ._ }, } }, }, .{ @@ -22610,7 +23928,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_pd, .cvtps2, .dst0x, .src0q, ._, ._ }, } }, @@ -22622,7 +23940,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, ._pd, .cvtps2, .dst0x, .src0q, ._, ._ }, } }, @@ -22634,11 +23952,92 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .mem, .none } }, .{ .src = .{ .to_sse, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, .v_pd, .cvtps2, .dst0y, .src0x, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_pd, .cvtps2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._pd, .cvtps2, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, @@ -22662,6 +24061,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, @@ -22686,6 +24111,93 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, @@ -22709,6 +24221,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, @@ -22733,7 +24271,95 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .avx, null, null }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ @@ -22759,7 +24385,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .sse2, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ @@ -22785,7 +24411,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .sse, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ @@ -22810,6 +24436,96 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .mova, .mem(.tmp0x), .dst0x, ._, ._ }, .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, } }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ @tagName(air_tag), @@ -30715,6 +32431,7 @@ fn genBinOp( try self.copyToTmpRegister(rhs_ty, rhs_mcv)).to128(), ); try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg, dst_reg); + try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp_reg, dst_reg); break :src .{ .register = tmp_reg }; } else rhs_mcv; @@ -43508,7 +45225,7 @@ const Select = struct { top: u3, fn emitLabel(s: *Select, label_index: Label) void { - if (label_index == ._) return; + assert(@intFromEnum(label_index) < @intFromEnum(Label._)); const label = &s.labels[@intFromEnum(label_index)]; for (&label.forward) |*reloc| { if (reloc.*) |r| s.cg.performReloc(r); @@ -43518,29 +45235,35 @@ const Select = struct { } fn emit(s: *Select, inst: Instruction) !void { - s.emitLabel(inst[0]); const mir_tag: Mir.Inst.FixedTag = .{ inst[1], inst[2] }; - var mir_ops: [4]CodeGen.Operand = undefined; - inline for (&mir_ops, 3..) |*mir_op, inst_index| mir_op.* = try inst[inst_index].lower(s); - s.cg.asmOps(mir_tag, mir_ops) catch |err| switch (err) { - error.InvalidInstruction => { - const fixes = @tagName(mir_tag[0]); - const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?; - return s.cg.fail( - "invalid instruction: '{s}{s}{s} {s} {s} {s} {s}'", - .{ - fixes[0..fixes_blank], - @tagName(mir_tag[1]), - fixes[fixes_blank + 1 ..], - @tagName(mir_ops[0]), - @tagName(mir_ops[1]), - @tagName(mir_ops[2]), - @tagName(mir_ops[3]), - }, - ); - }, - else => |e| return e, - }; + pseudo: { + switch (inst[0]) { + .@"0:", .@"1:", .@"2:" => |label| s.emitLabel(label), + ._ => {}, + .pseudo => break :pseudo, + } + var mir_ops: [4]CodeGen.Operand = undefined; + inline for (&mir_ops, 3..) |*mir_op, inst_index| mir_op.* = try inst[inst_index].lower(s); + s.cg.asmOps(mir_tag, mir_ops) catch |err| switch (err) { + error.InvalidInstruction => { + const fixes = @tagName(mir_tag[0]); + const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?; + return s.cg.fail( + "invalid instruction: '{s}{s}{s} {s} {s} {s} {s}'", + .{ + fixes[0..fixes_blank], + @tagName(mir_tag[1]), + fixes[fixes_blank + 1 ..], + @tagName(mir_ops[0]), + @tagName(mir_ops[1]), + @tagName(mir_ops[2]), + @tagName(mir_ops[3]), + }, + ); + }, + else => |e| return e, + }; + } switch (mir_tag[0]) { .f_ => switch (mir_tag[1]) { .@"2xm1", @@ -43594,32 +45317,6 @@ const Select = struct { .yl2x => s.top +%= 1, else => unreachable, }, - .fb_ => switch (mir_tag[1]) { - .ld => s.top -%= 1, - else => unreachable, - }, - .fb_p => switch (mir_tag[1]) { - .st => s.top +%= 1, - else => unreachable, - }, - .fi_ => switch (mir_tag[1]) { - .add, .com, .div, .divr, .mul, .st, .stt, .sub, .subr => {}, - .ld => s.top -%= 1, - else => unreachable, - }, - .fi_p => switch (mir_tag[1]) { - .com, .st => s.top +%= 1, - else => unreachable, - }, - .fn_ => switch (mir_tag[1]) { - .clex => {}, - .init, .save => s.top = 0, - else => unreachable, - }, - .fn_cw, .fn_env, .fn_sw => switch (mir_tag[1]) { - .st => {}, - else => unreachable, - }, .f_cstp => switch (mir_tag[1]) { .de => s.top -%= 1, .in => s.top +%= 1, @@ -43646,6 +45343,32 @@ const Select = struct { .com, .ucom => s.top +%= 2, else => unreachable, }, + .fb_ => switch (mir_tag[1]) { + .ld => s.top -%= 1, + else => unreachable, + }, + .fb_p => switch (mir_tag[1]) { + .st => s.top +%= 1, + else => unreachable, + }, + .fi_ => switch (mir_tag[1]) { + .add, .com, .div, .divr, .mul, .st, .stt, .sub, .subr => {}, + .ld => s.top -%= 1, + else => unreachable, + }, + .fi_p => switch (mir_tag[1]) { + .com, .st => s.top +%= 1, + else => unreachable, + }, + .fn_ => switch (mir_tag[1]) { + .clex => {}, + .init, .save => s.top = 0, + else => unreachable, + }, + .fn_cw, .fn_env, .fn_sw => switch (mir_tag[1]) { + .st => {}, + else => unreachable, + }, .fx_ => switch (mir_tag[1]) { .rstor => unreachable, .save => {}, @@ -44199,7 +45922,7 @@ const Select = struct { Select.Operand, Select.Operand, }; - const Label = enum { @"0:", @"1:", @"2:", @"_" }; + const Label = enum { @"0:", @"1:", @"2:", @"_", pseudo }; const Operand = struct { tag: Tag, base: Ref.Sized = .none, @@ -44228,7 +45951,7 @@ const Select = struct { ptr_bit_size, size, size_sub_elem_size, - src0_unaligned_size, + unaligned_size, bit_size, src0_bit_size, len, @@ -44252,8 +45975,8 @@ const Select = struct { const sub_size_div_4: Adjust = .{ .sign = .neg, .lhs = .size, .op = .div, .rhs = .@"4" }; const sub_size: Adjust = .{ .sign = .neg, .lhs = .size, .op = .mul, .rhs = .@"1" }; const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" }; - const add_src0_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" }; - const sub_src0_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" }; + const add_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" }; + const sub_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" }; const add_2_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"2" }; const add_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"1" }; const sub_bit_size: Adjust = .{ .sign = .neg, .lhs = .bit_size, .op = .mul, .rhs = .@"1" }; @@ -44744,7 +46467,7 @@ const Select = struct { const ty = op.base.ref.deref(s).typeOf(s.cg); break :lhs @intCast(ty.abiSize(s.cg.pt.zcu) - ty.elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu)); }, - .src0_unaligned_size => @intCast(s.cg.unalignedSize(Select.Operand.Ref.src0.deref(s).typeOf(s.cg))), + .unaligned_size => @intCast(s.cg.unalignedSize(op.base.ref.deref(s).typeOf(s.cg))), .bit_size => @intCast(op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)), .src0_bit_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)), .len => @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu)), diff --git a/src/codegen/c/Type.zig b/src/codegen/c/Type.zig index 53e8a6be82..4c6f37c69d 100644 --- a/src/codegen/c/Type.zig +++ b/src/codegen/c/Type.zig @@ -1707,6 +1707,21 @@ pub const Pool = struct { }; return pool.fromFields(allocator, .@"struct", &fields, kind); }, + .vector_2_f32_type => { + const vector_ctype = try pool.getVector(allocator, .{ + .elem_ctype = .f32, + .len = 2, + }); + if (!kind.isParameter()) return vector_ctype; + var fields = [_]Info.Field{ + .{ + .name = .{ .index = .array }, + .ctype = vector_ctype, + .alignas = AlignAs.fromAbiAlignment(Type.f32.abiAlignment(zcu)), + }, + }; + return pool.fromFields(allocator, .@"struct", &fields, kind); + }, .vector_4_f32_type => { const vector_ctype = try pool.getVector(allocator, .{ .elem_ctype = .f32, |
