mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
x86_64: rewrite scalar @popCount
This commit is contained in:
parent
ebea56d279
commit
7d70d7b215
@ -2418,7 +2418,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
}
|
||||
|
||||
fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
@setEvalBranchQuota(12_700);
|
||||
@setEvalBranchQuota(12_900);
|
||||
const pt = cg.pt;
|
||||
const zcu = pt.zcu;
|
||||
const ip = &zcu.intern_pool;
|
||||
@ -2475,7 +2475,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
|
||||
.bitcast => try cg.airBitCast(inst),
|
||||
|
||||
.popcount => try cg.airPopCount(inst),
|
||||
.bit_reverse => try cg.airBitReverse(inst),
|
||||
.splat => try cg.airSplat(inst),
|
||||
.select => try cg.airSelect(inst),
|
||||
@ -30480,6 +30479,895 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
|
||||
};
|
||||
try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
|
||||
},
|
||||
.popcount => |air_tag| if (use_old) try cg.airPopCount(inst) else fallback: {
|
||||
const ty_op = air_datas[@intFromEnum(inst)].ty_op;
|
||||
if (ty_op.ty.toType().isVector(zcu)) break :fallback try cg.airPopCount(inst);
|
||||
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 = .{ .{ .exact_signed_int = 1 }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mut_mem, .none, .none } },
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .neg, .dst0b, ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .exact_unsigned_int = 1 }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mut_mem, .none, .none } },
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.each = .{ .once = &.{} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0d, .dst0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .word }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0w, .src0w, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .popcnt, .dst0d, .src0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, .false_deps_popcnt, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0d, .src0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .popcnt, .dst0d, .src0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .popcnt, null, null, null },
|
||||
.src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0d, .src0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .popcnt, .dst0q, .src0q, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, .false_deps_popcnt, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .src0q, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .mem, .none, .none } },
|
||||
.{ .src = .{ .to_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .popcnt, .dst0q, .src0q, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .signed_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .src0q, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u8, .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, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0b, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0b, .ui(0x55), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0b, .src0b, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0b, .ui(0x33), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0b, .ui(0x33), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0b, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0b, .ui(0x0f), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u8, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0b, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0b, .ui(0x55), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0b, .src0b, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0b, .ui(0x33), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0b, .ui(0x33), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0b, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0b, .ui(0x0f), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .word }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u16, .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, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0w, .ui(0x5555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0w, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0w, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0w, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0w, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(8), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, null, null, null },
|
||||
.src_constraints = .{ .{ .signed_int = .word }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u16, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0d, .uia(16, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0w, .ui(0x5555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0w, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0w, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0w, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0w, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(8), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .word }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u16, .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, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0d, .ui(0x5555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(8), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .signed_int = .word }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u16, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0d, .uia(16, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0d, .ui(0x5555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x3333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(8), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u32, .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, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0d, .ui(0x55555555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x33333333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x33333333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x0f0f0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x0f0f0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, .i_, .mul, .dst0d, .tmp0d, .ui(0x01010101), ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(32 - 8), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u32, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0d, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0d, .ui(0x55555555), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .src0d, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0d, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x33333333), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x33333333), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0d, .ui(0x0f0f0f0f), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0d, .ui(0x0f0f0f0f), ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0d, .leai(.tmp0, .dst0), ._, ._ },
|
||||
.{ ._, .i_, .mul, .dst0d, .tmp0d, .ui(0x01010101), ._ },
|
||||
.{ ._, ._r, .sh, .dst0d, .ui(32 - 8), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0q, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x55555555, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0q, .src0q, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0q, .tmp0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0q, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x33333333, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0q, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0q, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x0f0f0f0f, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0q, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x01010101, .none, .repeat), ._, ._ },
|
||||
.{ ._, .i_, .mul, .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0q, .ui(64 - 8), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", null, null, null },
|
||||
.src_constraints = .{ .{ .signed_int = .qword }, .any, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .none, .none } },
|
||||
},
|
||||
.extra_temps = .{
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._l, .sh, .src0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .src0q, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x55555555, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .src0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0q, .src0q, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0q, .tmp0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp0q, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x33333333, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0q, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0q, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x0f0f0f0f, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0q, .leai(.dst0, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .uia(0x01010101, .none, .repeat), ._, ._ },
|
||||
.{ ._, .i_, .mul, .dst0q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .dst0q, .ui(64 - 8), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, .false_deps_popcnt, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ .@"0:", ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, .false_deps_popcnt, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .dst0q, .memad(.src0q, .add_size, -16), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .dst0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .dst0q, ._, ._ },
|
||||
.{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .dst0q, .memad(.src0q, .add_size, -16), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .dst0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .dst0q, ._, ._ },
|
||||
.{ .@"0:", ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, .false_deps_popcnt, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .dst0q, .memad(.src0q, .add_size, -8), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .dst0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .dst0q, ._, ._ },
|
||||
.{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ },
|
||||
.{ ._, ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", .popcnt, null, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .dst0q, .memad(.src0q, .add_size, -8), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .dst0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .popcnt, .dst0q, .dst0q, ._, ._ },
|
||||
.{ .@"0:", ._, .popcnt, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .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 } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x55555555, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .tmp2q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp2q, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x33333333, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x0f0f0f0f, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x01010101, .none, .repeat), ._, ._ },
|
||||
.{ ._, .i_, .mul, .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(64 - 8), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", null, null, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ .@"1:", ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x55555555, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .tmp2q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp2q, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x33333333, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x0f0f0f0f, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x01010101, .none, .repeat), ._, ._ },
|
||||
.{ ._, .i_, .mul, .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(64 - 8), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .@"64bit", null, null, null },
|
||||
.src_constraints = .{ .{ .remainder_signed_int = .{ .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 } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.{ .type = .u64, .kind = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .rc = .general_purpose }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
|
||||
.{ ._, ._l, .sh, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
|
||||
.{ .@"1:", ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x55555555, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .tmp2q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp2q, .ui(2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x33333333, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(4), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x0f0f0f0f, .none, .repeat), ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp2q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp1q, .leai(.tmp1, .tmp2), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp3q, .uia(0x01010101, .none, .repeat), ._, ._ },
|
||||
.{ ._, .i_, .mul, .tmp1q, .tmp3q, ._, ._ },
|
||||
.{ ._, ._r, .sh, .tmp1q, .ui(64 - 8), ._, ._ },
|
||||
.{ ._, ._, .lea, .dst0d, .leai(.dst0, .tmp1), ._, ._ },
|
||||
.{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
|
||||
.{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
|
||||
} },
|
||||
} }) catch |err| switch (err) {
|
||||
error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
|
||||
@tagName(air_tag),
|
||||
cg.typeOf(ty_op.operand).fmt(pt),
|
||||
ops[0].tracking(cg),
|
||||
}),
|
||||
else => |e| return e,
|
||||
};
|
||||
try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
|
||||
},
|
||||
.byte_swap => |air_tag| if (use_old) try cg.airByteSwap(inst) else fallback: {
|
||||
const ty_op = air_datas[@intFromEnum(inst)].ty_op;
|
||||
if (ty_op.ty.toType().isVector(zcu)) break :fallback try cg.airByteSwap(inst);
|
||||
@ -100339,6 +101227,7 @@ const Select = struct {
|
||||
smin,
|
||||
smax,
|
||||
umax,
|
||||
repeat,
|
||||
},
|
||||
op: enum(u2) { mul, div, div_8_down, rem_8_mul },
|
||||
rhs: Memory.Scale,
|
||||
@ -100399,6 +101288,7 @@ const Select = struct {
|
||||
const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" };
|
||||
const add_smin: Adjust = .{ .sign = .pos, .lhs = .smin, .op = .mul, .rhs = .@"1" };
|
||||
const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };
|
||||
const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" };
|
||||
};
|
||||
const Ref = enum(u5) {
|
||||
tmp0,
|
||||
@ -101107,6 +101997,10 @@ const Select = struct {
|
||||
.umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
|
||||
-%op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
|
||||
)),
|
||||
.repeat => switch (SignedImm) {
|
||||
else => unreachable,
|
||||
i64 => return @as(i64, op.imm) << 32 | @as(u32, @bitCast(op.imm)),
|
||||
},
|
||||
};
|
||||
const rhs = op.flags.adjust.rhs.toLog2();
|
||||
const op_res = op_res: switch (op.flags.adjust.op) {
|
||||
|
||||
@ -19281,6 +19281,14 @@ test ctz {
|
||||
try test_ctz.testInts();
|
||||
}
|
||||
|
||||
inline fn popCount(comptime Type: type, rhs: Type) @TypeOf(@popCount(rhs)) {
|
||||
return @popCount(rhs);
|
||||
}
|
||||
test popCount {
|
||||
const test_pop_count = unary(popCount, .{});
|
||||
try test_pop_count.testInts();
|
||||
}
|
||||
|
||||
inline fn byteSwap(comptime Type: type, rhs: Type) RoundBitsUp(Type, 8) {
|
||||
return @byteSwap(@as(RoundBitsUp(Type, 8), rhs));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user