mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
x86_64: implement strict float @reduce(.Add)
This commit is contained in:
parent
a4a1ebdeed
commit
d1785cf61c
@ -2389,7 +2389,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
}
|
||||
|
||||
fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
@setEvalBranchQuota(23_800);
|
||||
@setEvalBranchQuota(23_900);
|
||||
const pt = cg.pt;
|
||||
const zcu = pt.zcu;
|
||||
const ip = &zcu.intern_pool;
|
||||
@ -117442,7 +117442,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
switch (reduce.operation) {
|
||||
.And, .Or, .Xor => {},
|
||||
.Min, .Max => break :fallback try cg.airReduce(inst),
|
||||
.Add, .Mul => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst),
|
||||
.Add => {},
|
||||
.Mul => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst),
|
||||
}
|
||||
var ops = try cg.tempsFromOperands(inst, .{reduce.operand});
|
||||
var res: [1]Temp = undefined;
|
||||
@ -126545,6 +126546,852 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ },
|
||||
.{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .dword, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
|
||||
.{ ._, .vh_ps, .add, .dst0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .dword, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
|
||||
.{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .qword, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
|
||||
.{ ._, .vh_ps, .add, .tmp0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, .v_ps, .shuf, .dst0x, .dst0x, .dst0x, .ui(0b11_10_11_10) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .qword, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
|
||||
.{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b11_10_11_10) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
|
||||
.{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f16, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
|
||||
.{ .@"0:", .vp_w, .insr, .dst0x, .dst0x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(1) },
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ },
|
||||
.{ ._, .vh_ps, .add, .dst0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .f16c, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f16, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
|
||||
.{ .@"0:", .vp_w, .insr, .dst0x, .dst0x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(1) },
|
||||
.{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ },
|
||||
.{ ._, .v_ps, .shuf, .tmp1x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp1x, ._ },
|
||||
.{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.call_frame = .{ .alignment = .@"16" },
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f16, .kind = .{ .reg = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
|
||||
.{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
|
||||
.{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) },
|
||||
.{ ._, ._, .call, .tmp2d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse2, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.call_frame = .{ .alignment = .@"16" },
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f16, .kind = .{ .reg = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .p_, .xor, .dst0x, .dst0x, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .p_w, .insr, .dst0x, .mem(.src0w), .ui(0), ._ },
|
||||
.{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
|
||||
.{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
|
||||
.{ ._, ._, .call, .tmp2d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .word }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .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 = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .movzx, .tmp1d, .mem(.src0w), ._, ._ },
|
||||
.{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
|
||||
.{ ._, ._ss, .mov, .dst0x, .mem(.tmp2d), ._, ._ },
|
||||
.{ .@"0:", ._ps, .xor, .tmp3x, .tmp3x, ._, ._ },
|
||||
.{ ._, ._ss, .mov, .tmp3x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .call, .tmp4d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vh_ps, .add, .dst0x, .src0x, .src0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .shuf, .tmp0x, .src0x, .src0x, .ui(0b01_01_01_01) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .src0x, .tmp0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse3, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .h_ps, .add, .dst0x, .src0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._ps, .mova, .tmp0x, .src0x, ._, ._ },
|
||||
.{ ._, ._ps, .shuf, .tmp0x, .tmp0x, .ui(0b01_01_01_01), ._ },
|
||||
.{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vh_ps, .add, .tmp0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_ps, .movhl, .dst0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .movhl, .tmp0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_ps, .add, .tmp0x, .src0x, .tmp0x, ._ },
|
||||
.{ ._, .v_ps, .shuf, .dst0x, .src0x, .src0x, .ui(0b01_01_01_01) },
|
||||
.{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse3, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
|
||||
.{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
|
||||
.{ ._, .h_ps, .add, .dst0x, .src0x, ._, ._ },
|
||||
.{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
|
||||
.{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
|
||||
.{ ._, ._ss, .add, .tmp0x, .src0x, ._, ._ },
|
||||
.{ ._, ._ps, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ },
|
||||
.{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .sse }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(4, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .v_ss, .mov, .dst0x, .mem(.src0d), ._, ._ },
|
||||
.{ .@"0:", .v_ss, .add, .dst0x, .dst0x, .memia(.src0d, .tmp0, .add_unaligned_size), ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .dword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .sse }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(4, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, ._ss, .mov, .dst0x, .mem(.src0d), ._, ._ },
|
||||
.{ .@"0:", ._ss, .add, .dst0x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vh_pd, .add, .dst0x, .src0x, .src0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_ps, .movhl, .tmp0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_sd, .add, .dst0x, .src0x, .tmp0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse3, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .h_pd, .add, .dst0x, .src0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse2, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
|
||||
.{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
|
||||
.{ ._, ._sd, .add, .dst0x, .tmp0x, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, .fast_hops, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .vh_pd, .add, .tmp0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_f128, .extract, .dst0x, .src0y, .ui(1), ._ },
|
||||
.{ ._, .v_sd, .add, .dst0x, .tmp0x, .dst0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_sse, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ },
|
||||
.{ ._, .v_pd, .add, .tmp0x, .src0x, .tmp0x, ._ },
|
||||
.{ ._, .v_ps, .movhl, .dst0x, .src0x, .src0x, ._ },
|
||||
.{ ._, .v_sd, .add, .dst0x, .tmp0x, .dst0x, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .sse }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .v_sd, .mov, .dst0x, .mem(.src0q), ._, ._ },
|
||||
.{ .@"0:", .v_sd, .add, .dst0x, .dst0x, .memia(.src0q, .tmp0, .add_unaligned_size), ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse2, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .sse }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, ._sd, .mov, .dst0x, .mem(.src0q), ._, ._ },
|
||||
.{ .@"0:", ._sd, .add, .dst0x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .x87, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .qword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f64, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .mem(.src0q), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .add, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .x87, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .tbyte }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .tbyte } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st6 } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .mem(.src0t), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
|
||||
.{ ._, .f_p, .add, ._, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .xword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.call_frame = .{ .alignment = .@"16" },
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f128, .kind = .{ .reg = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ },
|
||||
.{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .call, .tmp2d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse2, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .xword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.call_frame = .{ .alignment = .@"16" },
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f128, .kind = .{ .reg = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ },
|
||||
.{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .call, .tmp2d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .sse, null, null, null },
|
||||
.dst_constraints = .{ .{ .float = .xword }, .any },
|
||||
.src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.call_frame = .{ .alignment = .@"16" },
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f128, .kind = .{ .reg = .xmm1 } },
|
||||
.{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .reg = .xmm0 }, .unused },
|
||||
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
|
||||
.{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ },
|
||||
.{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .call, .tmp2d, ._, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
} },
|
||||
.Mul => comptime &.{ .{
|
||||
.required_features = .{ .avx, null, null, null },
|
||||
@ -131596,7 +132443,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f64, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
.unused,
|
||||
@ -131611,10 +132458,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .memad(.src0q, .add_unaligned_size, -8), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .add, .memi(.src0q, .tmp0), ._, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0p, .si(8), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
|
||||
} },
|
||||
@ -131626,7 +132473,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st6 } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
@ -131641,11 +132488,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .memad(.src0t, .add_unaligned_size, -16), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .ld, .memi(.src0t, .tmp0), ._, ._, ._ },
|
||||
.{ ._, .f_p, .add, ._, ._, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
|
||||
.{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
|
||||
} },
|
||||
@ -133139,7 +133986,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f64, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
.unused,
|
||||
@ -133154,10 +134001,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .memad(.src0q, .add_unaligned_size, -8), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .mul, .memi(.src0q, .tmp0), ._, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0p, .si(8), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
|
||||
} },
|
||||
@ -133169,7 +134016,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.{ .src = .{ .to_mem, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .isize, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st6 } },
|
||||
.{ .type = .f80, .kind = .{ .reg = .st7 } },
|
||||
.unused,
|
||||
@ -133184,11 +134031,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
.dst_temps = .{ .mem, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0p, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
|
||||
.{ ._, .f_, .ld, .memad(.src0t, .add_unaligned_size, -16), ._, ._, ._ },
|
||||
.{ .@"0:", .f_, .ld, .memi(.src0t, .tmp0), ._, ._, ._ },
|
||||
.{ ._, .f_p, .mul, ._, ._, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0p, .si(16), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
|
||||
.{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
|
||||
} },
|
||||
|
||||
@ -5100,6 +5100,7 @@ inline fn reduceAdd(comptime Type: type, rhs: Type) @typeInfo(Type).vector.child
|
||||
test reduceAdd {
|
||||
const test_reduce_add = unary(reduceAdd, .{});
|
||||
try test_reduce_add.testIntVectors();
|
||||
try test_reduce_add.testFloatVectors();
|
||||
}
|
||||
|
||||
inline fn reduceMul(comptime Type: type, rhs: Type) @typeInfo(Type).vector.child {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user