| ... | ... | @@ -2418,7 +2418,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 2418 | 2418 | } |
| 2419 | 2419 | |
| 2420 | 2420 | fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 2421 | | @setEvalBranchQuota(12_500); |
| 2421 | @setEvalBranchQuota(12_600); |
| 2422 | 2422 | const pt = cg.pt; |
| 2423 | 2423 | const zcu = pt.zcu; |
| 2424 | 2424 | const ip = &zcu.intern_pool; |
| ... | ... | @@ -2477,7 +2477,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 2477 | 2477 | |
| 2478 | 2478 | .ctz => try cg.airCtz(inst), |
| 2479 | 2479 | .popcount => try cg.airPopCount(inst), |
| 2480 | | .byte_swap => try cg.airByteSwap(inst), |
| 2481 | 2480 | .bit_reverse => try cg.airBitReverse(inst), |
| 2482 | 2481 | .splat => try cg.airSplat(inst), |
| 2483 | 2482 | .select => try cg.airSelect(inst), |
| ... | ... | @@ -30086,6 +30085,656 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 30086 | 30085 | }; |
| 30087 | 30086 | try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); |
| 30088 | 30087 | }, |
| 30088 | .byte_swap => |air_tag| if (use_old) try cg.airByteSwap(inst) else fallback: { |
| 30089 | const ty_op = air_datas[@intFromEnum(inst)].ty_op; |
| 30090 | if (ty_op.ty.toType().isVector(zcu)) break :fallback try cg.airByteSwap(inst); |
| 30091 | var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); |
| 30092 | var res: [1]Temp = undefined; |
| 30093 | cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ |
| 30094 | .src_constraints = .{ .{ .exact_int = 8 }, .any, .any }, |
| 30095 | .patterns = &.{ |
| 30096 | .{ .src = .{ .mut_mem, .none, .none } }, |
| 30097 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30098 | }, |
| 30099 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30100 | .each = .{ .once = &.{} }, |
| 30101 | }, .{ |
| 30102 | .required_features = .{ .movbe, null, null, null }, |
| 30103 | .src_constraints = .{ .{ .exact_int = 16 }, .any, .any }, |
| 30104 | .patterns = &.{ |
| 30105 | .{ .src = .{ .mem, .none, .none } }, |
| 30106 | }, |
| 30107 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30108 | .clobbers = .{ .eflags = true }, |
| 30109 | .each = .{ .once = &.{ |
| 30110 | .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, |
| 30111 | .{ ._, ._, .movbe, .dst0w, .src0w, ._, ._ }, |
| 30112 | } }, |
| 30113 | }, .{ |
| 30114 | .src_constraints = .{ .{ .exact_int = 16 }, .any, .any }, |
| 30115 | .patterns = &.{ |
| 30116 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30117 | }, |
| 30118 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30119 | .clobbers = .{ .eflags = true }, |
| 30120 | .each = .{ .once = &.{ |
| 30121 | .{ ._, ._r, .ro, .dst0w, .ui(8), ._, ._ }, |
| 30122 | } }, |
| 30123 | }, .{ |
| 30124 | .required_features = .{ .movbe, null, null, null }, |
| 30125 | .src_constraints = .{ .{ .exact_int = 32 }, .any, .any }, |
| 30126 | .patterns = &.{ |
| 30127 | .{ .src = .{ .mem, .none, .none } }, |
| 30128 | }, |
| 30129 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30130 | .each = .{ .once = &.{ |
| 30131 | .{ ._, ._, .movbe, .dst0d, .src0d, ._, ._ }, |
| 30132 | } }, |
| 30133 | }, .{ |
| 30134 | .src_constraints = .{ .{ .exact_int = 32 }, .any, .any }, |
| 30135 | .patterns = &.{ |
| 30136 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30137 | }, |
| 30138 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30139 | .each = .{ .once = &.{ |
| 30140 | .{ ._, ._, .bswap, .dst0d, ._, ._, ._ }, |
| 30141 | } }, |
| 30142 | }, .{ |
| 30143 | .required_features = .{ .movbe, null, null, null }, |
| 30144 | .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, |
| 30145 | .patterns = &.{ |
| 30146 | .{ .src = .{ .mem, .none, .none } }, |
| 30147 | }, |
| 30148 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30149 | .clobbers = .{ .eflags = true }, |
| 30150 | .each = .{ .once = &.{ |
| 30151 | .{ ._, ._, .movbe, .dst0d, .src0d, ._, ._ }, |
| 30152 | .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, |
| 30153 | } }, |
| 30154 | }, .{ |
| 30155 | .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, |
| 30156 | .patterns = &.{ |
| 30157 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30158 | }, |
| 30159 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30160 | .clobbers = .{ .eflags = true }, |
| 30161 | .each = .{ .once = &.{ |
| 30162 | .{ ._, ._, .bswap, .dst0d, ._, ._, ._ }, |
| 30163 | .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, |
| 30164 | } }, |
| 30165 | }, .{ |
| 30166 | .required_features = .{ .movbe, null, null, null }, |
| 30167 | .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, |
| 30168 | .patterns = &.{ |
| 30169 | .{ .src = .{ .mem, .none, .none } }, |
| 30170 | }, |
| 30171 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30172 | .clobbers = .{ .eflags = true }, |
| 30173 | .each = .{ .once = &.{ |
| 30174 | .{ ._, ._, .movbe, .dst0d, .src0d, ._, ._ }, |
| 30175 | .{ ._, ._r, .sh, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, |
| 30176 | } }, |
| 30177 | }, .{ |
| 30178 | .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, |
| 30179 | .patterns = &.{ |
| 30180 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30181 | }, |
| 30182 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30183 | .clobbers = .{ .eflags = true }, |
| 30184 | .each = .{ .once = &.{ |
| 30185 | .{ ._, ._, .bswap, .dst0d, ._, ._, ._ }, |
| 30186 | .{ ._, ._r, .sh, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, |
| 30187 | } }, |
| 30188 | }, .{ |
| 30189 | .required_features = .{ .movbe, null, null, null }, |
| 30190 | .src_constraints = .{ .{ .exact_int = 64 }, .any, .any }, |
| 30191 | .patterns = &.{ |
| 30192 | .{ .src = .{ .mem, .none, .none } }, |
| 30193 | }, |
| 30194 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30195 | .each = .{ .once = &.{ |
| 30196 | .{ ._, ._, .movbe, .dst0q, .src0q, ._, ._ }, |
| 30197 | } }, |
| 30198 | }, .{ |
| 30199 | .src_constraints = .{ .{ .exact_int = 64 }, .any, .any }, |
| 30200 | .patterns = &.{ |
| 30201 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30202 | }, |
| 30203 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30204 | .each = .{ .once = &.{ |
| 30205 | .{ ._, ._, .bswap, .dst0q, ._, ._, ._ }, |
| 30206 | } }, |
| 30207 | }, .{ |
| 30208 | .required_features = .{ .movbe, null, null, null }, |
| 30209 | .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, |
| 30210 | .patterns = &.{ |
| 30211 | .{ .src = .{ .mem, .none, .none } }, |
| 30212 | }, |
| 30213 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30214 | .clobbers = .{ .eflags = true }, |
| 30215 | .each = .{ .once = &.{ |
| 30216 | .{ ._, ._, .movbe, .dst0q, .src0q, ._, ._ }, |
| 30217 | .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, |
| 30218 | } }, |
| 30219 | }, .{ |
| 30220 | .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, |
| 30221 | .patterns = &.{ |
| 30222 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30223 | }, |
| 30224 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30225 | .clobbers = .{ .eflags = true }, |
| 30226 | .each = .{ .once = &.{ |
| 30227 | .{ ._, ._, .bswap, .dst0q, ._, ._, ._ }, |
| 30228 | .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, |
| 30229 | } }, |
| 30230 | }, .{ |
| 30231 | .required_features = .{ .movbe, null, null, null }, |
| 30232 | .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, |
| 30233 | .patterns = &.{ |
| 30234 | .{ .src = .{ .mem, .none, .none } }, |
| 30235 | }, |
| 30236 | .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, |
| 30237 | .clobbers = .{ .eflags = true }, |
| 30238 | .each = .{ .once = &.{ |
| 30239 | .{ ._, ._, .movbe, .dst0q, .src0q, ._, ._ }, |
| 30240 | .{ ._, ._r, .sh, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, |
| 30241 | } }, |
| 30242 | }, .{ |
| 30243 | .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, |
| 30244 | .patterns = &.{ |
| 30245 | .{ .src = .{ .to_mut_gpr, .none, .none } }, |
| 30246 | }, |
| 30247 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| 30248 | .clobbers = .{ .eflags = true }, |
| 30249 | .each = .{ .once = &.{ |
| 30250 | .{ ._, ._, .bswap, .dst0q, ._, ._, ._ }, |
| 30251 | .{ ._, ._r, .sh, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, |
| 30252 | } }, |
| 30253 | }, .{ |
| 30254 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30255 | .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30256 | .patterns = &.{ |
| 30257 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30258 | }, |
| 30259 | .extra_temps = .{ |
| 30260 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30261 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30262 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30263 | .unused, |
| 30264 | .unused, |
| 30265 | .unused, |
| 30266 | .unused, |
| 30267 | .unused, |
| 30268 | .unused, |
| 30269 | .unused, |
| 30270 | .unused, |
| 30271 | }, |
| 30272 | .dst_temps = .{ .mem, .unused }, |
| 30273 | .clobbers = .{ .eflags = true }, |
| 30274 | .each = .{ .once = &.{ |
| 30275 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30276 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30277 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30278 | .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30279 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30280 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30281 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30282 | } }, |
| 30283 | }, .{ |
| 30284 | .required_features = .{ .@"64bit", null, null, null }, |
| 30285 | .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30286 | .patterns = &.{ |
| 30287 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30288 | }, |
| 30289 | .extra_temps = .{ |
| 30290 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30291 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30292 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30293 | .unused, |
| 30294 | .unused, |
| 30295 | .unused, |
| 30296 | .unused, |
| 30297 | .unused, |
| 30298 | .unused, |
| 30299 | .unused, |
| 30300 | .unused, |
| 30301 | }, |
| 30302 | .dst_temps = .{ .mem, .unused }, |
| 30303 | .clobbers = .{ .eflags = true }, |
| 30304 | .each = .{ .once = &.{ |
| 30305 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30306 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30307 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30308 | .{ ._, ._, .bswap, .tmp2q, ._, ._, ._ }, |
| 30309 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30310 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30311 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30312 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30313 | } }, |
| 30314 | }, .{ |
| 30315 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30316 | .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30317 | .patterns = &.{ |
| 30318 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30319 | }, |
| 30320 | .extra_temps = .{ |
| 30321 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30322 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30323 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30324 | .unused, |
| 30325 | .unused, |
| 30326 | .unused, |
| 30327 | .unused, |
| 30328 | .unused, |
| 30329 | .unused, |
| 30330 | .unused, |
| 30331 | .unused, |
| 30332 | }, |
| 30333 | .dst_temps = .{ .mem, .unused }, |
| 30334 | .clobbers = .{ .eflags = true }, |
| 30335 | .each = .{ .once = &.{ |
| 30336 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30337 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30338 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30339 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30340 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30341 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30342 | .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30343 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30344 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30345 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30346 | } }, |
| 30347 | }, .{ |
| 30348 | .required_features = .{ .@"64bit", null, null, null }, |
| 30349 | .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30350 | .patterns = &.{ |
| 30351 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30352 | }, |
| 30353 | .extra_temps = .{ |
| 30354 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30355 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30356 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30357 | .unused, |
| 30358 | .unused, |
| 30359 | .unused, |
| 30360 | .unused, |
| 30361 | .unused, |
| 30362 | .unused, |
| 30363 | .unused, |
| 30364 | .unused, |
| 30365 | }, |
| 30366 | .dst_temps = .{ .mem, .unused }, |
| 30367 | .clobbers = .{ .eflags = true }, |
| 30368 | .each = .{ .once = &.{ |
| 30369 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30370 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30371 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30372 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30373 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30374 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30375 | .{ ._, ._, .bswap, .tmp2q, ._, ._, ._ }, |
| 30376 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30377 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30378 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30379 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30380 | } }, |
| 30381 | }, .{ |
| 30382 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30383 | .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30384 | .patterns = &.{ |
| 30385 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30386 | }, |
| 30387 | .extra_temps = .{ |
| 30388 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30389 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30390 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30391 | .unused, |
| 30392 | .unused, |
| 30393 | .unused, |
| 30394 | .unused, |
| 30395 | .unused, |
| 30396 | .unused, |
| 30397 | .unused, |
| 30398 | .unused, |
| 30399 | }, |
| 30400 | .dst_temps = .{ .mem, .unused }, |
| 30401 | .clobbers = .{ .eflags = true }, |
| 30402 | .each = .{ .once = &.{ |
| 30403 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30404 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30405 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, |
| 30406 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30407 | .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30408 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30409 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30410 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30411 | } }, |
| 30412 | }, .{ |
| 30413 | .required_features = .{ .@"64bit", null, null, null }, |
| 30414 | .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30415 | .patterns = &.{ |
| 30416 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30417 | }, |
| 30418 | .extra_temps = .{ |
| 30419 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30420 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30421 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30422 | .unused, |
| 30423 | .unused, |
| 30424 | .unused, |
| 30425 | .unused, |
| 30426 | .unused, |
| 30427 | .unused, |
| 30428 | .unused, |
| 30429 | .unused, |
| 30430 | }, |
| 30431 | .dst_temps = .{ .mem, .unused }, |
| 30432 | .clobbers = .{ .eflags = true }, |
| 30433 | .each = .{ .once = &.{ |
| 30434 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30435 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30436 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, |
| 30437 | .{ .@"0:", ._, .mov, .tmp2q, .lea(.tmp1q), ._, ._ }, |
| 30438 | .{ ._, ._, .bswap, .tmp2q, ._, ._, ._ }, |
| 30439 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ }, |
| 30440 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30441 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30442 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30443 | } }, |
| 30444 | }, .{ |
| 30445 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30446 | .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30447 | .patterns = &.{ |
| 30448 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30449 | }, |
| 30450 | .extra_temps = .{ |
| 30451 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30452 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30453 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30454 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30455 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30456 | .unused, |
| 30457 | .unused, |
| 30458 | .unused, |
| 30459 | .unused, |
| 30460 | .unused, |
| 30461 | .unused, |
| 30462 | }, |
| 30463 | .dst_temps = .{ .mem, .unused }, |
| 30464 | .clobbers = .{ .eflags = true }, |
| 30465 | .each = .{ .once = &.{ |
| 30466 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30467 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30468 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30469 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30470 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30471 | .{ .@"0:", ._, .movbe, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30472 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30473 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30474 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30475 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30476 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30477 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30478 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30479 | } }, |
| 30480 | }, .{ |
| 30481 | .required_features = .{ .@"64bit", null, null, null }, |
| 30482 | .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30483 | .patterns = &.{ |
| 30484 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30485 | }, |
| 30486 | .extra_temps = .{ |
| 30487 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30488 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30489 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30490 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30491 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30492 | .unused, |
| 30493 | .unused, |
| 30494 | .unused, |
| 30495 | .unused, |
| 30496 | .unused, |
| 30497 | .unused, |
| 30498 | }, |
| 30499 | .dst_temps = .{ .mem, .unused }, |
| 30500 | .clobbers = .{ .eflags = true }, |
| 30501 | .each = .{ .once = &.{ |
| 30502 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30503 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30504 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30505 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30506 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30507 | .{ .@"0:", ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30508 | .{ ._, ._, .bswap, .tmp3q, ._, ._, ._ }, |
| 30509 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30510 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30511 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30512 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30513 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30514 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30515 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30516 | } }, |
| 30517 | }, .{ |
| 30518 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30519 | .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30520 | .patterns = &.{ |
| 30521 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30522 | }, |
| 30523 | .extra_temps = .{ |
| 30524 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30525 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30526 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30527 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30528 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30529 | .unused, |
| 30530 | .unused, |
| 30531 | .unused, |
| 30532 | .unused, |
| 30533 | .unused, |
| 30534 | .unused, |
| 30535 | }, |
| 30536 | .dst_temps = .{ .mem, .unused }, |
| 30537 | .clobbers = .{ .eflags = true }, |
| 30538 | .each = .{ .once = &.{ |
| 30539 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30540 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30541 | .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, |
| 30542 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30543 | .{ .@"0:", ._, .movbe, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30544 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30545 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30546 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30547 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30548 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30549 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30550 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30551 | } }, |
| 30552 | }, .{ |
| 30553 | .required_features = .{ .@"64bit", null, null, null }, |
| 30554 | .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, |
| 30555 | .patterns = &.{ |
| 30556 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30557 | }, |
| 30558 | .extra_temps = .{ |
| 30559 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30560 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30561 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30562 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30563 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30564 | .unused, |
| 30565 | .unused, |
| 30566 | .unused, |
| 30567 | .unused, |
| 30568 | .unused, |
| 30569 | .unused, |
| 30570 | }, |
| 30571 | .dst_temps = .{ .mem, .unused }, |
| 30572 | .clobbers = .{ .eflags = true }, |
| 30573 | .each = .{ .once = &.{ |
| 30574 | .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ }, |
| 30575 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30576 | .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, |
| 30577 | .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, |
| 30578 | .{ .@"0:", ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30579 | .{ ._, ._, .bswap, .tmp3q, ._, ._, ._ }, |
| 30580 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30581 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30582 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30583 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30584 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30585 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30586 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30587 | } }, |
| 30588 | }, .{ |
| 30589 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30590 | .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30591 | .patterns = &.{ |
| 30592 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30593 | }, |
| 30594 | .extra_temps = .{ |
| 30595 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30596 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30597 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30598 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30599 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30600 | .unused, |
| 30601 | .unused, |
| 30602 | .unused, |
| 30603 | .unused, |
| 30604 | .unused, |
| 30605 | .unused, |
| 30606 | }, |
| 30607 | .dst_temps = .{ .mem, .unused }, |
| 30608 | .clobbers = .{ .eflags = true }, |
| 30609 | .each = .{ .once = &.{ |
| 30610 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30611 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30612 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30613 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30614 | .{ .@"0:", ._, .movbe, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30615 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30616 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30617 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30618 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30619 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30620 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30621 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30622 | } }, |
| 30623 | }, .{ |
| 30624 | .required_features = .{ .@"64bit", null, null, null }, |
| 30625 | .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30626 | .patterns = &.{ |
| 30627 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30628 | }, |
| 30629 | .extra_temps = .{ |
| 30630 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30631 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30632 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30633 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30634 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30635 | .unused, |
| 30636 | .unused, |
| 30637 | .unused, |
| 30638 | .unused, |
| 30639 | .unused, |
| 30640 | .unused, |
| 30641 | }, |
| 30642 | .dst_temps = .{ .mem, .unused }, |
| 30643 | .clobbers = .{ .eflags = true }, |
| 30644 | .each = .{ .once = &.{ |
| 30645 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30646 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30647 | .{ ._, ._, .movsx, .tmp2q, .mem(.src0b), ._, ._ }, |
| 30648 | .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, |
| 30649 | .{ .@"0:", ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30650 | .{ ._, ._, .bswap, .tmp3q, ._, ._, ._ }, |
| 30651 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30652 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30653 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30654 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30655 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30656 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30657 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30658 | } }, |
| 30659 | }, .{ |
| 30660 | .required_features = .{ .@"64bit", .movbe, null, null }, |
| 30661 | .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30662 | .patterns = &.{ |
| 30663 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30664 | }, |
| 30665 | .extra_temps = .{ |
| 30666 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30667 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30668 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30669 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30670 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30671 | .unused, |
| 30672 | .unused, |
| 30673 | .unused, |
| 30674 | .unused, |
| 30675 | .unused, |
| 30676 | .unused, |
| 30677 | }, |
| 30678 | .dst_temps = .{ .mem, .unused }, |
| 30679 | .clobbers = .{ .eflags = true }, |
| 30680 | .each = .{ .once = &.{ |
| 30681 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30682 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30683 | .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, |
| 30684 | .{ .@"0:", ._, .movbe, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30685 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30686 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30687 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30688 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30689 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30690 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30691 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30692 | } }, |
| 30693 | }, .{ |
| 30694 | .required_features = .{ .@"64bit", null, null, null }, |
| 30695 | .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, |
| 30696 | .patterns = &.{ |
| 30697 | .{ .src = .{ .to_mem, .none, .none } }, |
| 30698 | }, |
| 30699 | .extra_temps = .{ |
| 30700 | .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, |
| 30701 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 30702 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30703 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30704 | .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, |
| 30705 | .unused, |
| 30706 | .unused, |
| 30707 | .unused, |
| 30708 | .unused, |
| 30709 | .unused, |
| 30710 | .unused, |
| 30711 | }, |
| 30712 | .dst_temps = .{ .mem, .unused }, |
| 30713 | .clobbers = .{ .eflags = true }, |
| 30714 | .each = .{ .once = &.{ |
| 30715 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| 30716 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| 30717 | .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, |
| 30718 | .{ .@"0:", ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, |
| 30719 | .{ ._, ._, .bswap, .tmp3q, ._, ._, ._ }, |
| 30720 | .{ ._, ._, .mov, .tmp4q, .tmp3q, ._, ._ }, |
| 30721 | .{ ._, ._rd, .sh, .tmp3q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ }, |
| 30722 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| 30723 | .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp3q, ._, ._ }, |
| 30724 | .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, |
| 30725 | .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| 30726 | .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, |
| 30727 | } }, |
| 30728 | } }) catch |err| switch (err) { |
| 30729 | error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ |
| 30730 | @tagName(air_tag), |
| 30731 | ty_op.ty.toType().fmt(pt), |
| 30732 | ops[0].tracking(cg), |
| 30733 | }), |
| 30734 | else => |e| return e, |
| 30735 | }; |
| 30736 | try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); |
| 30737 | }, |
| 30089 | 30738 | |
| 30090 | 30739 | .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: { |
| 30091 | 30740 | const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; |