diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index fa92b3d579..190e76b177 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; @@ -59433,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 = &.{ @@ -59445,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 = &.{ @@ -59457,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 = &.{ @@ -59469,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 = &.{ @@ -59481,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 = &.{ @@ -59493,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 = &.{ @@ -64081,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 } }, @@ -64101,6 +64111,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .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 = &.{ @@ -64122,6 +64142,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .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 = &.{ @@ -64143,6 +64173,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_umax), ._, ._ }, } }, + }, .{ + .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 }, @@ -64166,12 +64207,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ }, .{ ._, ._, .xor, .dst0q, .src0q, ._, ._ }, } }, + }, .{ + .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 = &.{ @@ -64182,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 } }, @@ -64202,12 +64255,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .p_, .xor, .dst0q, .lea(.tmp0q), ._, ._ }, } }, + }, .{ + .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 = &.{ @@ -64218,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 } }, @@ -64238,12 +64303,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, + }, .{ + .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 = &.{ @@ -64254,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 } }, @@ -64274,11 +64351,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, + }, .{ + .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 } }, @@ -64298,12 +64399,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, + }, .{ + .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 = &.{ @@ -64314,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 } }, @@ -64334,12 +64447,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, + }, .{ + .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 = &.{ @@ -64350,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 } }, @@ -64370,6 +64495,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, + }, .{ + .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 }, @@ -64401,6 +64557,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .@"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 = .{ .{ .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 }, @@ -64430,6 +64615,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .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 }, @@ -64461,6 +64677,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .@"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 = .{ .{ .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 }, @@ -64490,6 +64735,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .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 }, @@ -64519,6 +64793,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .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 }, @@ -64549,6 +64853,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .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 }, @@ -64577,6 +64909,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .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 = .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 }, @@ -65042,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 = &.{ @@ -65053,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 } }, @@ -65078,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 = &.{ @@ -65089,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 } }, @@ -65114,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 = &.{ @@ -65125,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 } }, @@ -65149,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 } }, @@ -65174,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 = &.{ @@ -65185,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 } }, @@ -65210,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 = &.{ @@ -65221,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 } }, @@ -65241,6 +65602,118 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, + }, .{ + .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 = &.{ @@ -65261,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 = &.{ @@ -65289,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}", .{ @@ -75371,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 = &.{ @@ -75382,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 = &.{ @@ -75393,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 = &.{ @@ -190208,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 } }, @@ -190238,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 } }, @@ -190265,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 }, @@ -190279,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 } }, @@ -190309,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 } }, @@ -190339,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 } }, @@ -190366,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 } }, @@ -192348,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, @@ -192444,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, @@ -192484,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, @@ -192733,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, @@ -192838,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, @@ -192860,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 @@ -192915,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), }; } }; diff --git a/test/behavior/x86_64/build.zig b/test/behavior/x86_64/build.zig index 52aeba6d7d..c437d46f66 100644 --- a/test/behavior/x86_64/build.zig +++ b/test/behavior/x86_64/build.zig @@ -5,6 +5,7 @@ pub fn build(b: *std.Build) void { "test-filter", "Skip tests that do not match any filter", ) orelse &[0][]const u8{}; + const strip = b.option(bool, "strip", "Omit debug information"); const compiler_rt_lib = b.addLibrary(.{ .linkage = .static, @@ -171,6 +172,7 @@ pub fn build(b: *std.Build) void { const test_mod = b.createModule(.{ .root_source_file = b.path(path), .target = target, + .strip = strip, }); const test_exe = b.addTest(.{ .name = std.fs.path.stem(path),