aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/x86_64/CodeGen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen/x86_64/CodeGen.zig')
-rw-r--r--src/codegen/x86_64/CodeGen.zig1175
1 files changed, 882 insertions, 293 deletions
diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig
index c62d54ccec..cf6f91e0c6 100644
--- a/src/codegen/x86_64/CodeGen.zig
+++ b/src/codegen/x86_64/CodeGen.zig
@@ -2292,7 +2292,7 @@ fn genBodyBlock(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
}
fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
- @setEvalBranchQuota(29_500);
+ @setEvalBranchQuota(29_600);
const pt = cg.pt;
const zcu = pt.zcu;
const ip = &zcu.intern_pool;
@@ -23288,10 +23288,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-8, .src0, .add_elem_size), ._, ._ },
.{ .@"1:", ._, .xor, .tmp5d, .tmp5d, ._, ._ },
.{ ._, ._, .@"or", .tmp5q, .leai(.tmp1q, .tmp4), ._, ._ },
@@ -23339,10 +23339,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -23393,10 +23393,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -23447,10 +23447,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -23502,10 +23502,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -26107,10 +26107,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-8, .src0, .add_elem_size), ._, ._ },
.{ .@"1:", ._, .xor, .tmp5d, .tmp5d, ._, ._ },
.{ ._, ._, .@"or", .tmp5q, .leai(.tmp1q, .tmp4), ._, ._ },
@@ -26158,10 +26158,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -26212,10 +26212,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -26266,10 +26266,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -26321,10 +26321,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
- .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size), ._, ._ },
- .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size, 8), ._, ._ },
- .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
+ .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_unaligned_size), ._, ._ },
+ .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_unaligned_size, 8), ._, ._ },
+ .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .mov, .tmp4d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ },
.{ .@"1:", ._, .lea, .tmp5p, .leaa(.tmp4, .sub_src0_elem_size_div_8), ._, ._ },
.{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
@@ -37912,7 +37912,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
.{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, .i_, .div, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._, ._ },
- .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1h, ._, ._ },
+ .{ ._, ._, .movsx, .tmp1d, .tmp1h, ._, ._ },
+ .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1l, ._, ._ },
.{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
} },
@@ -37944,7 +37945,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
.{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, .i_, .div, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._, ._ },
- .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1h, ._, ._ },
+ .{ ._, ._, .movsx, .tmp1d, .tmp1h, ._, ._ },
+ .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1l, ._, ._ },
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
} },
@@ -37977,7 +37979,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
.{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .div, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._, ._ },
- .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1h, ._, ._ },
+ .{ ._, ._, .movzx, .tmp1d, .tmp1h, ._, ._ },
+ .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1l, ._, ._ },
.{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
.{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
} },
@@ -38009,7 +38012,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
.{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
.{ ._, ._, .div, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._, ._ },
- .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1h, ._, ._ },
+ .{ ._, ._, .movzx, .tmp1d, .tmp1h, ._, ._ },
+ .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1l, ._, ._ },
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
} },
@@ -59429,9 +59433,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .mmx, null, null, null },
.src_constraints = .{ .{ .size = .qword }, .{ .size = .qword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_mm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_mm, .to_mm, .none } },
+ .{ .src = .{ .to_mut_mmx, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_mmx, .to_mmx, .none } },
},
.dst_temps = .{ .{ .ref = .src0 }, .unused },
.each = .{ .once = &.{
@@ -59441,9 +59445,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -59453,9 +59457,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_mut_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .ref = .src0 }, .unused },
.each = .{ .once = &.{
@@ -59465,9 +59469,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .sse, null, null, null },
.src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_mut_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .ref = .src0 }, .unused },
.each = .{ .once = &.{
@@ -59477,9 +59481,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .mem, .none } },
- .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_ymm, .to_ymm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -59489,9 +59493,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .mem, .none } },
- .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_ymm, .to_ymm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -64077,6 +64081,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
var res: [1]Temp = undefined;
cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
+ .src_constraints = .{ .{ .bool_vec = .byte }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mut_mem, .none, .none } },
+ .{ .src = .{ .to_mut_gpr, .none, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .not, .dst0b, ._, ._, ._ },
+ } },
+ }, .{
.src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any, .any },
.patterns = &.{
.{ .src = .{ .mut_mem, .none, .none } },
@@ -64098,6 +64112,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ },
} },
}, .{
+ .src_constraints = .{ .{ .bool_vec = .word }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mut_mem, .none, .none } },
+ .{ .src = .{ .to_mut_gpr, .none, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .not, .dst0w, ._, ._, ._ },
+ } },
+ }, .{
.src_constraints = .{ .{ .signed_or_exact_int = .word }, .any, .any },
.patterns = &.{
.{ .src = .{ .mut_mem, .none, .none } },
@@ -64119,6 +64143,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ },
} },
}, .{
+ .src_constraints = .{ .{ .bool_vec = .dword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mut_mem, .none, .none } },
+ .{ .src = .{ .to_mut_gpr, .none, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .not, .dst0d, ._, ._, ._ },
+ } },
+ }, .{
.src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mut_mem, .none, .none } },
@@ -64141,6 +64175,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .qword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mut_mem, .none, .none } },
+ .{ .src = .{ .to_mut_gpr, .none, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .not, .dst0q, ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mut_mem, .none, .none } },
@@ -64164,10 +64209,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .mmx, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .qword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
+ },
+ .dst_temps = .{ .{ .rc = .mmx }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },
+ .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .mmx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_mm, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
},
.dst_temps = .{ .{ .rc = .mmx }, .unused },
.each = .{ .once = &.{
@@ -64178,7 +64235,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .mmx, null, null, null },
.src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_mm, .none, .none } },
+ .{ .src = .{ .to_mut_mmx, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64200,10 +64257,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
+ },
+ .dst_temps = .{ .{ .rc = .sse }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },
+ .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -64214,7 +64283,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64236,10 +64305,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .sse2, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
+ },
+ .dst_temps = .{ .{ .rc = .sse }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },
+ .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -64250,7 +64331,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .none, .none } },
+ .{ .src = .{ .to_mut_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64272,9 +64353,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .sse, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_sse, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
+ .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .sse, null, null, null },
.src_constraints = .{ .{ .int = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .none, .none } },
+ .{ .src = .{ .to_mut_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64296,10 +64401,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx2, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .yword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
+ },
+ .dst_temps = .{ .{ .rc = .sse }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },
+ .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -64310,7 +64427,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64332,10 +64449,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx, null, null, null },
+ .src_constraints = .{ .{ .bool_vec = .yword }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
+ },
+ .dst_temps = .{ .{ .rc = .sse }, .unused },
+ .each = .{ .once = &.{
+ .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .vp(.true) },
+ .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -64346,7 +64475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -64368,6 +64497,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx2, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
+ .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
+ .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
+ .{ ._, .v_dqu, .mov, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
+ .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64399,6 +64559,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx2, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .yword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
+ .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
+ .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64428,6 +64617,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
+ .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .vp(.true) },
+ .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
+ .{ ._, .v_pd, .movu, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
+ .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64459,6 +64679,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .yword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .vp(.true) },
+ .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
+ .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64488,6 +64737,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .avx, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ ._, .vp_q, .cmpeq, .tmp1x, .tmp1x, .tmp1x, ._ },
+ .{ .@"0:", .v_, .xor, .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._ },
+ .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64517,6 +64795,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .sse2, null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .kind = .{ .rc = .sse } },
+ .{ .kind = .{ .rc = .sse } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ ._, .p_d, .cmpeq, .tmp1x, .tmp1x, ._, ._ },
+ .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
+ .{ ._, .p_, .xor, .tmp2x, .tmp1x, ._, ._ },
+ .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -64547,6 +64855,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .mut_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ .@"0:", ._, .not, .memia(.dst0q, .tmp0, .add_size), ._, ._, ._ },
+ .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, 8), ._, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .mut_mem, .none, .none } },
@@ -64575,6 +64911,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
+ .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
+ .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
+ .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
.src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
@@ -65038,7 +65403,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_mm, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
},
.dst_temps = .{ .{ .rc = .mmx }, .unused },
.each = .{ .once = &.{
@@ -65049,7 +65414,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .mmx, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_mm, .none, .none } },
+ .{ .src = .{ .to_mut_mmx, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65074,7 +65439,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -65085,7 +65450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65110,7 +65475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_xmm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -65121,7 +65486,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .none, .none } },
+ .{ .src = .{ .to_mut_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65145,7 +65510,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .sse, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .none, .none } },
+ .{ .src = .{ .to_mut_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65170,7 +65535,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -65181,7 +65546,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65206,7 +65571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.dst_temps = .{ .{ .rc = .sse }, .unused },
.each = .{ .once = &.{
@@ -65217,7 +65582,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .none, .none } },
+ .{ .src = .{ .to_sse, .none, .none } },
},
.extra_temps = .{
.{ .type = .usize, .kind = .{ .rc = .general_purpose } },
@@ -65239,6 +65604,118 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
} },
}, .{
.required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .qword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .any_signed_int_or_full_vec, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
.patterns = &.{
.{ .src = .{ .to_mem, .none, .none } },
},
@@ -65257,14 +65734,94 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
},
.dst_temps = .{ .mem, .unused },
.each = .{ .once = &.{
- .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
.{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, ._, .xor, .tmp2q, .leai(.tmp1q, .tmp0), ._, ._ },
.{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ },
- .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 8), ._, ._ },
- .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ },
- .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .dword, .is = .dword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .any_signed_int_or_full_vec, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .none, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
+ .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
+ .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
} },
}, .{
.patterns = &.{
@@ -65285,14 +65842,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
},
.dst_temps = .{ .mem, .unused },
.each = .{ .once = &.{
- .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
.{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, ._, .xor, .tmp2d, .leai(.tmp1d, .tmp0), ._, ._ },
.{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp2d, ._, ._ },
- .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 4), ._, ._ },
- .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ },
- .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
+ .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
} },
} }) catch |err| switch (err) {
error.SelectFailed => return cg.fail("failed to select {s} {f} {f}", .{
@@ -75367,7 +75923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_mm, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
},
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
.each = .{ .once = &.{
@@ -75378,7 +75934,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_mm, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
},
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
.each = .{ .once = &.{
@@ -75389,7 +75945,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any },
.patterns = &.{
.{ .src = .{ .mem, .none, .none } },
- .{ .src = .{ .to_mm, .none, .none } },
+ .{ .src = .{ .to_mmx, .none, .none } },
},
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
.each = .{ .once = &.{
@@ -112415,7 +112971,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movsxb, .tmp1y, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memsi(.dst0x, .@"2", .tmp0), .tmp1y, .rm(.{}), ._ },
@@ -112445,7 +113001,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movsxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memsi(.dst0q, .@"2", .tmp0), .tmp1x, .rm(.{}), ._ },
@@ -112475,7 +113031,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movzxb, .tmp1y, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memsi(.dst0x, .@"2", .tmp0), .tmp1y, .rm(.{}), ._ },
@@ -112505,7 +113061,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movzxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memsi(.dst0q, .@"2", .tmp0), .tmp1x, .rm(.{}), ._ },
@@ -113099,7 +113655,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .vp_d, .movsxw, .tmp1y, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0x, .tmp0), .tmp1y, .rm(.{}), ._ },
@@ -113129,7 +113685,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movsxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0q, .tmp0), .tmp1x, .rm(.{}), ._ },
@@ -113159,7 +113715,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .vp_d, .movzxw, .tmp1y, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0x, .tmp0), .tmp1y, .rm(.{}), ._ },
@@ -113189,7 +113745,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movzxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0q, .tmp0), .tmp1x, .rm(.{}), ._ },
@@ -113499,7 +114055,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .v_ps, .cvtdq2, .tmp1y, .memsi(.src0y, .@"2", .tmp0), ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0x, .tmp0), .tmp1y, .rm(.{}), ._ },
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
@@ -113528,7 +114084,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .v_ps, .cvtdq2, .tmp1x, .memsi(.src0x, .@"2", .tmp0), ._, ._ },
.{ ._, .v_, .cvtps2ph, .memi(.dst0q, .tmp0), .tmp1x, .rm(.{}), ._ },
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
@@ -115542,7 +116098,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movsxb, .tmp1y, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0y, .@"4", .tmp0), .tmp1y, ._, ._ },
@@ -115572,7 +116128,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movsxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0x, .@"4", .tmp0), .tmp1x, ._, ._ },
@@ -115602,7 +116158,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .p_d, .movsxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, ._ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, ._ps, .mova, .memsi(.dst0x, .@"4", .tmp0), .tmp1x, ._, ._ },
@@ -115632,7 +116188,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movzxb, .tmp1y, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0y, .@"4", .tmp0), .tmp1y, ._, ._ },
@@ -115662,7 +116218,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movzxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0x, .@"4", .tmp0), .tmp1x, ._, ._ },
@@ -115692,7 +116248,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .p_d, .movzxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, ._ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, ._ps, .mova, .memsi(.dst0x, .@"4", .tmp0), .tmp1x, ._, ._ },
@@ -116048,7 +116604,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .vp_d, .movsxw, .tmp1y, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0y, .@"2", .tmp0), .tmp1y, ._, ._ },
@@ -116078,7 +116634,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movsxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
@@ -116108,7 +116664,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .p_d, .movsxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, ._ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, ._ps, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
@@ -116138,7 +116694,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .vp_d, .movzxw, .tmp1y, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1y, .tmp1y, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0y, .@"2", .tmp0), .tmp1y, ._, ._ },
@@ -116168,7 +116724,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movzxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .v_ps, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
@@ -116198,7 +116754,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .p_d, .movzxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, ._ps, .cvtdq2, .tmp1x, .tmp1x, ._, ._ },
.{ ._, ._ps, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
@@ -116388,7 +116944,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size_up_32), ._, ._ },
.{ .@"0:", .v_ps, .cvtdq2, .tmp1y, .memi(.src0y, .tmp0), ._, ._ },
.{ ._, .v_ps, .mova, .memi(.dst0y, .tmp0), .tmp1y, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ },
@@ -116417,7 +116973,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .v_ps, .cvtdq2, .tmp1x, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_ps, .mova, .memi(.dst0x, .tmp0), .tmp1x, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
@@ -116446,7 +117002,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", ._ps, .cvtdq2, .tmp1x, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, ._ps, .mova, .memi(.dst0x, .tmp0), .tmp1x, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
@@ -118062,7 +118618,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movsxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1y, .tmp1x, ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0y, .@"8", .tmp0), .tmp1y, ._, ._ },
@@ -118092,7 +118648,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size_up_2), ._, ._ },
.{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
.{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memi(.src0w, .tmp0), .ui(0) },
.{ ._, .vp_d, .movsxb, .tmp1x, .tmp1d, ._, ._ },
@@ -118124,7 +118680,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size_up_2), ._, ._ },
.{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .p_w, .insr, .tmp1x, .memi(.src0w, .tmp0), .ui(0), ._ },
.{ ._, .p_d, .movsxb, .tmp1x, .tmp1d, ._, ._ },
@@ -118156,7 +118712,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .vp_d, .movzxb, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1y, .tmp1x, ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0y, .@"8", .tmp0), .tmp1y, ._, ._ },
@@ -118186,7 +118742,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size_up_2), ._, ._ },
.{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
.{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memi(.src0w, .tmp0), .ui(0) },
.{ ._, .vp_d, .movzxb, .tmp1x, .tmp1d, ._, ._ },
@@ -118218,7 +118774,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size_up_2), ._, ._ },
.{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
.{ ._, .p_w, .insr, .tmp1x, .memi(.src0w, .tmp0), .ui(0), ._ },
.{ ._, .p_d, .movzxb, .tmp1x, .tmp1d, ._, ._ },
@@ -118700,7 +119256,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movsxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1y, .tmp1x, ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0y, .@"4", .tmp0), .tmp1y, ._, ._ },
@@ -118730,7 +119286,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .v_d, .mov, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .vp_d, .movsxw, .tmp1x, .tmp1q, ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1x, .tmp1q, ._, ._ },
@@ -118761,7 +119317,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", ._d, .mov, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .p_d, .movsxw, .tmp1x, .tmp1q, ._, ._ },
.{ ._, ._pd, .cvtdq2, .tmp1x, .tmp1q, ._, ._ },
@@ -118792,7 +119348,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .vp_d, .movzxw, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1y, .tmp1x, ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0y, .@"4", .tmp0), .tmp1y, ._, ._ },
@@ -118822,7 +119378,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", .v_d, .mov, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .vp_d, .movzxw, .tmp1x, .tmp1q, ._, ._ },
.{ ._, .v_pd, .cvtdq2, .tmp1x, .tmp1q, ._, ._ },
@@ -118853,7 +119409,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
.{ .@"0:", ._d, .mov, .tmp1x, .memi(.src0d, .tmp0), ._, ._ },
.{ ._, .p_d, .movzxw, .tmp1x, .tmp1q, ._, ._ },
.{ ._, ._pd, .cvtdq2, .tmp1x, .tmp1q, ._, ._ },
@@ -119106,7 +119662,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size_up_16), ._, ._ },
.{ .@"0:", .v_pd, .cvtdq2, .tmp1y, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0y, .@"2", .tmp0), .tmp1y, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
@@ -119135,7 +119691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", .v_pd, .cvtdq2, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, .v_pd, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
@@ -119164,7 +119720,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
.{ .@"0:", ._pd, .cvtdq2, .tmp1x, .memi(.src0q, .tmp0), ._, ._ },
.{ ._, ._pd, .mova, .memsi(.dst0x, .@"2", .tmp0), .tmp1x, ._, ._ },
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
@@ -168582,7 +169138,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
.dst_temps = .{ .mem, .unused },
.clobbers = .{ .eflags = true, .caller_preserved = .ccc },
.each = .{ .once = &.{
- .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .sub_unaligned_size), ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
.{ .@"0:", ._ps, .mova, .tmp1x, .memi(.src0x, .tmp0), ._, ._ },
.{ ._, ._ps, .mova, .tmp2x, .memi(.src1x, .tmp0), ._, ._ },
.{ ._, ._ps, .mova, .tmp3x, .memi(.src2x, .tmp0), ._, ._ },
@@ -182106,68 +182662,135 @@ fn genSetMem(
}
}
-fn genInlineMemcpy(self: *CodeGen, dst_ptr: MCValue, src_ptr: MCValue, len: MCValue, opts: struct {
+fn genInlineMemcpy(cg: *CodeGen, dst_ptr: MCValue, src_ptr: MCValue, len: MCValue, opts: struct {
no_alias: bool,
}) InnerError!void {
- if (opts.no_alias and dst_ptr.isAddress() and src_ptr.isAddress()) switch (len) {
- else => {},
- .immediate => |len_imm| switch (len_imm) {
- else => {},
- 1 => if (self.register_manager.tryAllocReg(null, abi.RegisterClass.gp)) |reg| {
- try self.asmRegisterMemory(.{ ._, .mov }, reg.to8(), try src_ptr.deref().mem(self, .{ .size = .byte }));
- try self.asmMemoryRegister(.{ ._, .mov }, try dst_ptr.deref().mem(self, .{ .size = .byte }), reg.to8());
- return;
- },
- 2 => if (self.register_manager.tryAllocReg(null, abi.RegisterClass.gp)) |reg| {
- try self.asmRegisterMemory(.{ ._, .mov }, reg.to16(), try src_ptr.deref().mem(self, .{ .size = .word }));
- try self.asmMemoryRegister(.{ ._, .mov }, try dst_ptr.deref().mem(self, .{ .size = .word }), reg.to16());
- return;
- },
- 4 => if (self.register_manager.tryAllocReg(null, abi.RegisterClass.gp)) |reg| {
- try self.asmRegisterMemory(.{ ._, .mov }, reg.to32(), try src_ptr.deref().mem(self, .{ .size = .dword }));
- try self.asmMemoryRegister(.{ ._, .mov }, try dst_ptr.deref().mem(self, .{ .size = .dword }), reg.to32());
- return;
- },
- 8 => if (self.target.cpu.arch == .x86_64) {
- if (self.register_manager.tryAllocReg(null, abi.RegisterClass.gp)) |reg| {
- try self.asmRegisterMemory(.{ ._, .mov }, reg.to64(), try src_ptr.deref().mem(self, .{ .size = .qword }));
- try self.asmMemoryRegister(.{ ._, .mov }, try dst_ptr.deref().mem(self, .{ .size = .qword }), reg.to64());
- return;
- }
- },
- 16 => if (self.hasFeature(.avx)) {
- if (self.register_manager.tryAllocReg(null, abi.RegisterClass.sse)) |reg| {
- try self.asmRegisterMemory(.{ .v_dqu, .mov }, reg.to128(), try src_ptr.deref().mem(self, .{ .size = .xword }));
- try self.asmMemoryRegister(.{ .v_dqu, .mov }, try dst_ptr.deref().mem(self, .{ .size = .xword }), reg.to128());
- return;
- }
- } else if (self.hasFeature(.sse2)) {
- if (self.register_manager.tryAllocReg(null, abi.RegisterClass.sse)) |reg| {
- try self.asmRegisterMemory(.{ ._dqu, .mov }, reg.to128(), try src_ptr.deref().mem(self, .{ .size = .xword }));
- try self.asmMemoryRegister(.{ ._dqu, .mov }, try dst_ptr.deref().mem(self, .{ .size = .xword }), reg.to128());
- return;
- }
- } else if (self.hasFeature(.sse)) {
- if (self.register_manager.tryAllocReg(null, abi.RegisterClass.sse)) |reg| {
- try self.asmRegisterMemory(.{ ._ps, .movu }, reg.to128(), try src_ptr.deref().mem(self, .{ .size = .xword }));
- try self.asmMemoryRegister(.{ ._ps, .movu }, try dst_ptr.deref().mem(self, .{ .size = .xword }), reg.to128());
- return;
- }
- },
- 32 => if (self.hasFeature(.avx)) {
- if (self.register_manager.tryAllocReg(null, abi.RegisterClass.sse)) |reg| {
- try self.asmRegisterMemory(.{ .v_dqu, .mov }, reg.to256(), try src_ptr.deref().mem(self, .{ .size = .yword }));
- try self.asmMemoryRegister(.{ .v_dqu, .mov }, try dst_ptr.deref().mem(self, .{ .size = .yword }), reg.to256());
- return;
- }
- },
- },
+ if (opts.no_alias and len == .immediate and cg.useConstMemcpyForSize(len.immediate)) {
+ if (try cg.genConstMemcpy(dst_ptr, src_ptr, len.immediate)) {
+ return;
+ }
+ }
+
+ try cg.spillRegisters(&.{ .rsi, .rdi, .rcx });
+ try cg.genSetReg(.rsi, .usize, src_ptr, .{});
+ try cg.genSetReg(.rdi, .usize, dst_ptr, .{});
+ try cg.genSetReg(.rcx, .usize, len, .{});
+ try cg.asmOpOnly(.{ .@"rep _sb", .mov });
+}
+
+/// Returns `true` iff it would be efficient to use `genConstMemcpy` for a copy
+/// of `len` bytes instead of using `rep movsb`.
+fn useConstMemcpyForSize(cg: *CodeGen, len: u64) bool {
+ // LLVM's threshold here is 8 load/store pairs. However, after that threshold, it typically
+ // calls through to `memcpy` instead of emitting `rep movsb`; if we don't have the `fsrm` CPU
+ // feature, `rep movsb` has a high startup cost, so is inefficient for small copies. Since we
+ // don't currently call compiler_rt in the case of longer copies, we use a higher threshold if
+ // we don't have the `fsrm` feature.
+ return switch (len) {
+ 0...128 => true,
+ 129...256 => cg.hasFeature(.avx) or !cg.hasFeature(.fsrm), // if we have AVX, each pair is 32 bytes
+ 257...512 => !cg.hasFeature(.fsrm), // the threshold should probably be higher, but I'm being cautious
+ else => false,
};
- try self.spillRegisters(&.{ .rsi, .rdi, .rcx });
- try self.genSetReg(.rsi, .usize, src_ptr, .{});
- try self.genSetReg(.rdi, .usize, dst_ptr, .{});
- try self.genSetReg(.rcx, .usize, len, .{});
- try self.asmOpOnly(.{ .@"rep _sb", .mov });
+}
+/// If we can trivially copy `len` bytes from `orig_src_ptr` to `dst_ptr` using simple loads and
+/// stored through already-free register[s] (i.e. without spilling anything), emits that code and
+/// returns `true`. Otherwise, returns `false`, and the caller must lower the operation themselves,
+/// for instance with `rep movsb`.
+fn genConstMemcpy(
+ cg: *CodeGen,
+ dst_ptr: MCValue,
+ orig_src_ptr: MCValue,
+ len: u64,
+) !bool {
+ if (!dst_ptr.isAddress()) return false;
+
+ const src_reg: ?Register = r: {
+ if (orig_src_ptr.isAddress()) break :r null;
+ if (orig_src_ptr == .lea_uav or orig_src_ptr == .lea_nav) {
+ // To "hack around linker relocation bugs", a `lea_uav` isn't considered an address, but
+ // we want to avoid pessimising that case because it's common (e.g. returning constant
+ // values over 8 bytes). So if there's a register free, load the source address into it.
+ if (cg.register_manager.tryAllocReg(null, abi.RegisterClass.gp)) |src_reg| {
+ // We'll actually do the load a little later, in case another register alloc fails.
+ break :r src_reg;
+ }
+ }
+ return false;
+ };
+
+ // Prevent `src_reg` from aliasing `gp_reg` below.
+ const src_lock: ?RegisterLock = if (src_reg) |r| cg.register_manager.lockReg(r) else null;
+ defer if (src_lock) |l| cg.register_manager.unlockReg(l);
+
+ const want_sse_reg = len >= 16 and cg.hasFeature(.sse);
+ const sse_reg: ?Register = if (want_sse_reg) r: {
+ break :r cg.register_manager.tryAllocReg(null, abi.RegisterClass.sse);
+ } else null;
+
+ const need_gp_reg = len % 16 != 0 or sse_reg == null;
+ const gp_reg: Register = if (need_gp_reg) r: {
+ break :r cg.register_manager.tryAllocReg(null, abi.RegisterClass.gp) orelse return false;
+ } else undefined;
+
+ const src_ptr: MCValue = src_ptr: {
+ const reg = src_reg orelse break :src_ptr orig_src_ptr;
+ try cg.asmRegisterMemory(.{ ._, .lea }, reg.to64(), switch (orig_src_ptr) {
+ .lea_uav => |uav| .{ .base = .{ .uav = uav } },
+ .lea_nav => |nav| .{ .base = .{ .nav = nav } },
+ else => unreachable,
+ });
+ break :src_ptr .{ .register = reg.to64() };
+ };
+
+ var offset: u64 = 0;
+
+ if (sse_reg) |r| {
+ if (cg.hasFeature(.avx)) {
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ .v_dqu, .mov }, r, .yword);
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ .v_dqu, .mov }, r, .xword);
+ } else if (cg.hasFeature(.sse2)) {
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._dqu, .mov }, r, .xword);
+ } else if (cg.hasFeature(.sse)) {
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._ps, .movu }, r, .xword);
+ }
+ }
+
+ if (need_gp_reg) {
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._, .mov }, gp_reg, .qword);
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._, .mov }, gp_reg, .dword);
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._, .mov }, gp_reg, .word);
+ try cg.memcpyPart(dst_ptr, src_ptr, len, &offset, .{ ._, .mov }, gp_reg, .byte);
+ }
+
+ assert(offset == len);
+
+ return true;
+}
+fn memcpyPart(
+ cg: *CodeGen,
+ dst_ptr: MCValue,
+ src_ptr: MCValue,
+ len: u64,
+ offset: *u64,
+ tag: Mir.Inst.FixedTag,
+ temp_reg: Register,
+ size: Memory.Size,
+) !void {
+ const bytes_len = @divExact(size.bitSize(cg.target), 8);
+ while (len - offset.* >= bytes_len) {
+ try cg.asmRegisterMemory(
+ tag,
+ temp_reg.toSize(size, cg.target),
+ try src_ptr.deref().mem(cg, .{ .size = size, .disp = @intCast(offset.*) }),
+ );
+ try cg.asmMemoryRegister(
+ tag,
+ try dst_ptr.deref().mem(cg, .{ .size = size, .disp = @intCast(offset.*) }),
+ temp_reg.toSize(size, cg.target),
+ );
+ offset.* += bytes_len;
+ }
}
fn genInlineMemset(
@@ -186834,10 +187457,8 @@ const Temp = struct {
},
.memory, .indirect, .load_frame, .load_nav, .load_uav, .load_lazy_sym => {
var val_ptr = try cg.tempInit(.usize, val_mcv.address());
- var len = try cg.tempInit(.usize, .{ .immediate = val_ty.abiSize(cg.pt.zcu) });
- try val_ptr.memcpy(ptr, &len, cg);
+ try val_ptr.memcpy(ptr, val_ty.abiSize(cg.pt.zcu), cg);
try val_ptr.die(cg);
- try len.die(cg);
},
}
return val;
@@ -186939,10 +187560,8 @@ const Temp = struct {
.lea_frame, .lea_nav, .lea_uav, .lea_lazy_sym => continue :val_to_gpr,
.memory, .indirect, .load_frame, .load_nav, .load_uav, .load_lazy_sym => {
var val_ptr = try cg.tempInit(.usize, val_mcv.address());
- var len = try cg.tempInit(.usize, .{ .immediate = val_ty.abiSize(cg.pt.zcu) });
- try ptr.memcpy(&val_ptr, &len, cg);
+ try ptr.memcpy(&val_ptr, val_ty.abiSize(cg.pt.zcu), cg);
try val_ptr.die(cg);
- try len.die(cg);
},
}
break;
@@ -186981,11 +187600,9 @@ const Temp = struct {
var val_ptr = try cg.tempInit(.usize, val_mcv.address());
var src_ptr =
try cg.tempInit(.usize, src.tracking(cg).short.address().offset(opts.disp));
- var len = try cg.tempInit(.usize, .{ .immediate = val_ty.abiSize(cg.pt.zcu) });
- try val_ptr.memcpy(&src_ptr, &len, cg);
+ try val_ptr.memcpy(&src_ptr, val_ty.abiSize(cg.pt.zcu), cg);
try val_ptr.die(cg);
try src_ptr.die(cg);
- try len.die(cg);
},
}
}
@@ -187076,11 +187693,9 @@ const Temp = struct {
var dst_ptr =
try cg.tempInit(.usize, dst.tracking(cg).short.address().offset(opts.disp));
var val_ptr = try cg.tempInit(.usize, val_mcv.address());
- var len = try cg.tempInit(.usize, .{ .immediate = val_ty.abiSize(cg.pt.zcu) });
- try dst_ptr.memcpy(&val_ptr, &len, cg);
+ try dst_ptr.memcpy(&val_ptr, val_ty.abiSize(cg.pt.zcu), cg);
try dst_ptr.die(cg);
try val_ptr.die(cg);
- try len.die(cg);
},
}
break;
@@ -187182,10 +187797,8 @@ const Temp = struct {
try ptr.toOffset(deferred_disp, cg);
deferred_disp = 0;
var src_ptr = try cg.tempInit(.usize, .{ .lea_frame = .{ .index = frame_index } });
- var len = try cg.tempInit(.usize, .{ .immediate = src_abi_size });
- try ptr.memcpy(&src_ptr, &len, cg);
+ try ptr.memcpy(&src_ptr, src_abi_size, cg);
try src_ptr.die(cg);
- try len.die(cg);
}
part_disp += part_size;
deferred_disp += part_size;
@@ -187224,11 +187837,9 @@ const Temp = struct {
var dst_ptr = try cg.tempInit(.usize, dst.tracking(cg).short.address());
try dst_ptr.toOffset(disp, cg);
var src_ptr = try cg.tempInit(.usize, .{ .lea_frame = .{ .index = frame_index } });
- var len = try cg.tempInit(.usize, .{ .immediate = src_abi_size });
- try dst_ptr.memcpy(&src_ptr, &len, cg);
+ try dst_ptr.memcpy(&src_ptr, src_abi_size, cg);
try dst_ptr.die(cg);
try src_ptr.die(cg);
- try len.die(cg);
}
}
@@ -187273,11 +187884,21 @@ const Temp = struct {
assert(next_class_index == classes.len);
}
- fn memcpy(dst: *Temp, src: *Temp, len: *Temp, cg: *CodeGen) InnerError!void {
- while (true) for ([_]*Temp{ dst, src, len }, [_]Register{ .rdi, .rsi, .rcx }) |temp, reg| {
- if (try temp.toReg(reg, cg)) break;
- } else break;
+ fn memcpy(dst: *Temp, src: *Temp, len: u64, cg: *CodeGen) InnerError!void {
+ if (cg.useConstMemcpyForSize(len)) {
+ while (try dst.toLea(cg) or try src.toLea(cg)) {} // `genConstMemcpy` wants these values to be address operands
+ if (try cg.genConstMemcpy(dst.tracking(cg).short, src.tracking(cg).short, len)) {
+ return;
+ }
+ }
+ var temp = try cg.tempAllocReg(.usize, abi.RegisterClass.gp);
+ while (try dst.toReg(.rdi, cg) or
+ try src.toReg(.rsi, cg) or
+ try temp.toReg(.rcx, cg))
+ {}
+ try cg.asmRegisterImmediate(.{ ._, .mov }, .rcx, .{ .unsigned = len });
try cg.asmOpOnly(.{ .@"rep _sb", .mov });
+ try temp.die(cg);
}
fn memset(dst: *Temp, val: *Temp, len: *Temp, cg: *CodeGen) InnerError!void {
@@ -190139,9 +190760,9 @@ const Temp = struct {
.required_features = .{ .sse, .mmx, null, null },
.src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_mm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_mm, .to_mm, .none } },
+ .{ .src = .{ .to_mut_mmx, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_mmx, .to_mmx, .none } },
},
.extra_temps = .{
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
@@ -190169,9 +190790,9 @@ const Temp = struct {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.extra_temps = .{
.{ .kind = .{ .rc = .sse } },
@@ -190196,9 +190817,9 @@ const Temp = struct {
.required_features = .{ .sse4_1, null, null, null },
.src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_mut_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_sse, .to_sse, .none } },
},
.dst_temps = .{ .{ .cc = .z }, .unused },
.clobbers = .{ .eflags = true },
@@ -190210,9 +190831,9 @@ const Temp = struct {
.required_features = .{ .sse2, .fast_imm16, null, null },
.src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_mut_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_sse, .to_sse, .none } },
},
.extra_temps = .{
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
@@ -190240,9 +190861,9 @@ const Temp = struct {
.required_features = .{ .sse2, null, null, null },
.src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
.patterns = &.{
- .{ .src = .{ .to_mut_xmm, .mem, .none } },
- .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },
+ .{ .src = .{ .to_mut_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_mut_sse, .to_sse, .none } },
},
.extra_temps = .{
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
@@ -190270,9 +190891,9 @@ const Temp = struct {
.required_features = .{ .avx2, null, null, null },
.src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .mem, .none } },
- .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_ymm, .to_ymm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.extra_temps = .{
.{ .kind = .{ .rc = .sse } },
@@ -190297,9 +190918,9 @@ const Temp = struct {
.required_features = .{ .avx, null, null, null },
.src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },
.patterns = &.{
- .{ .src = .{ .to_ymm, .mem, .none } },
- .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },
- .{ .src = .{ .to_ymm, .to_ymm, .none } },
+ .{ .src = .{ .to_sse, .mem, .none } },
+ .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
+ .{ .src = .{ .to_sse, .to_sse, .none } },
},
.extra_temps = .{
.{ .kind = .{ .rc = .sse } },
@@ -192279,6 +192900,7 @@ const Select = struct {
any_scalar_int,
any_scalar_signed_int,
any_scalar_unsigned_int,
+ any_signed_int_or_full_vec,
any_float,
po2_any,
bool,
@@ -192375,6 +192997,11 @@ const Select = struct {
.any_scalar_int => cg.intInfo(ty.scalarType(zcu)) != null,
.any_scalar_signed_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed else false,
.any_scalar_unsigned_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned else false,
+ .any_signed_int_or_full_vec => ty.isVector(zcu) and
+ if (cg.intInfo(ty.childType(zcu))) |int_info| switch (int_info.signedness) {
+ .signed => true,
+ .unsigned => (int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits)) or int_info.bits % 128 == 0,
+ } else false,
.any_float => ty.isRuntimeFloat(),
.po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),
.bool => ty.toIntern() == .bool_type,
@@ -192415,7 +193042,7 @@ const Select = struct {
.signed_int_or_full_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and
if (cg.intInfo(ty.childType(zcu))) |int_info| switch (int_info.signedness) {
.signed => true,
- .unsigned => int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits),
+ .unsigned => (int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits)) or int_info.bits % 128 == 0,
} else false,
.unsigned_int_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and
if (cg.intInfo(ty.childType(zcu))) |int_info| int_info.signedness == .unsigned else false,
@@ -192664,22 +193291,10 @@ const Select = struct {
to_mmx,
mut_mmx,
to_mut_mmx,
- mm,
- to_mm,
- mut_mm,
- to_mut_mm,
sse,
to_sse,
mut_sse,
to_mut_sse,
- xmm,
- to_xmm,
- mut_xmm,
- to_mut_xmm,
- ymm,
- to_ymm,
- mut_ymm,
- to_mut_ymm,
reg_mask: RegMaskSpec,
all_reg_mask: RegMaskSpec,
@@ -192769,17 +193384,6 @@ const Select = struct {
else => false,
},
.to_mmx, .to_mut_mmx => true,
- .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.mmx),
- .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0,
- else => false,
- },
- .mut_mm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.mmx),
- .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0,
- else => false,
- },
- .to_mm, .to_mut_mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8,
.sse => switch (temp.tracking(cg).short) {
.register => |reg| reg.isClass(.sse),
.register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
@@ -192791,28 +193395,6 @@ const Select = struct {
else => false,
},
.to_sse, .to_mut_sse => true,
- .xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.sse),
- .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
- else => false,
- },
- .mut_xmm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.sse),
- .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
- else => false,
- },
- .to_xmm, .to_mut_xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16,
- .ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.sse),
- .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
- else => false,
- },
- .mut_ymm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) {
- .register => |reg| reg.isClass(.sse),
- .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
- else => false,
- },
- .to_ymm, .to_mut_ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32,
.reg_mask => |mask_spec| switch (temp.tracking(cg).short) {
.register_mask => |reg_mask| mask_spec.size.bitSize(cg.target) >=
reg_mask.info.scalar.bitSize(cg.target) * temp.typeOf(cg).vectorLen(cg.pt.zcu) and
@@ -192846,10 +193428,10 @@ const Select = struct {
.to_mut_gphi => try temp.toRegClass(true, .gphi, cg),
.x87, .to_x87 => try temp.toRegClass(false, .x87, cg),
.mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),
- .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),
- .mut_mmx, .to_mut_mmx, .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),
- .sse, .to_sse, .xmm, .to_xmm, .ymm, .to_ymm => try temp.toRegClass(false, .sse, cg),
- .mut_sse, .to_mut_sse, .mut_xmm, .to_mut_xmm, .mut_ymm, .to_mut_ymm => try temp.toRegClass(true, .sse, cg),
+ .mmx, .to_mmx => try temp.toRegClass(false, .mmx, cg),
+ .mut_mmx, .to_mut_mmx => try temp.toRegClass(true, .mmx, cg),
+ .sse, .to_sse => try temp.toRegClass(false, .sse, cg),
+ .mut_sse, .to_mut_sse => try temp.toRegClass(true, .sse, cg),
};
}
};
@@ -193399,7 +193981,7 @@ const Select = struct {
ref: Ref,
scale: Memory.Scale = .@"1",
} = .{ .ref = .none },
- unused: u2 = 0,
+ unused: u1 = 0,
},
imm: i32 = 0,
@@ -193412,7 +193994,7 @@ const Select = struct {
lea,
mem,
};
- const Adjust = packed struct(u11) {
+ const Adjust = packed struct(u12) {
sign: enum(u1) { neg, pos },
lhs: enum(u6) {
none,
@@ -193449,7 +194031,7 @@ const Select = struct {
umax_shr_src1,
repeat,
},
- op: enum(u2) { mul, div, div_8_down, rem_8_mul },
+ op: enum(u3) { mul, div, div_8_down, rem_8_mul, up_2_mul, up_32_mul },
rhs: Memory.Scale,
const none: Adjust = .{ .sign = .pos, .lhs = .none, .op = .mul, .rhs = .@"1" };
@@ -193470,6 +194052,11 @@ const Select = struct {
const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" };
const add_delta_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .div, .rhs = .@"8" };
const add_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
+ const add_unaligned_size_up_2: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .up_2_mul, .rhs = .@"1" };
+ const add_unaligned_size_up_4: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .up_2_mul, .rhs = .@"2" };
+ const add_unaligned_size_up_8: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .up_2_mul, .rhs = .@"4" };
+ const add_unaligned_size_up_16: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .up_2_mul, .rhs = .@"8" };
+ const add_unaligned_size_up_32: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .up_32_mul, .rhs = .@"1" };
const sub_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
const add_unaligned_size_add_elem_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size_add_elem_size, .op = .mul, .rhs = .@"1" };
const add_unaligned_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size_sub_elem_size, .op = .mul, .rhs = .@"1" };
@@ -194482,7 +195069,9 @@ const Select = struct {
},
.div => @shrExact(lhs, rhs),
.div_8_down => lhs >> 3 & @as(SignedImm, -1) << rhs,
- .rem_8_mul => lhs & (@as(SignedImm, 1) << @intCast(@as(u3, 3) + rhs)) - 1,
+ .rem_8_mul => lhs & ((@as(SignedImm, 8) << rhs) - 1),
+ .up_2_mul => ((lhs - 1) & @as(SignedImm, -2) << rhs) + (@as(SignedImm, 2) << rhs),
+ .up_32_mul => ((lhs - 1) & @as(SignedImm, -32) << rhs) + (@as(SignedImm, 32) << rhs),
};
const disp: SignedImm = @bitCast(@as(UnsignedImm, @as(u32, @bitCast(op.imm))));
return switch (op.flags.adjust.sign) {