| ... | ... | @@ -207,6 +207,10 @@ pub const MCValue = union(enum) { |
| 207 | 207 | /// The value is a pointer to a value referenced indirectly via GOT. |
| 208 | 208 | /// Payload is a symbol index. |
| 209 | 209 | lea_got: u32, |
| 210 | /// TODO indirection via actual .got table |
| 211 | /// LOL Jakub, the king of naming... |
| 212 | load_actual_got: u32, |
| 213 | lea_actual_got: u32, |
| 210 | 214 | /// The value is a threadlocal variable. |
| 211 | 215 | /// Payload is a symbol index. |
| 212 | 216 | load_tlv: u32, |
| ... | ... | @@ -295,6 +299,7 @@ pub const MCValue = union(enum) { |
| 295 | 299 | .register_overflow, |
| 296 | 300 | .lea_direct, |
| 297 | 301 | .lea_got, |
| 302 | .lea_actual_got, |
| 298 | 303 | .lea_tlv, |
| 299 | 304 | .lea_frame, |
| 300 | 305 | .reserved_frame, |
| ... | ... | @@ -308,6 +313,7 @@ pub const MCValue = union(enum) { |
| 308 | 313 | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 309 | 314 | .load_got => |sym_index| .{ .lea_got = sym_index }, |
| 310 | 315 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 316 | .load_actual_got => |sym_index| .{ .lea_actual_got = sym_index }, |
| 311 | 317 | .load_frame => |frame_addr| .{ .lea_frame = frame_addr }, |
| 312 | 318 | }; |
| 313 | 319 | } |
| ... | ... | @@ -325,6 +331,7 @@ pub const MCValue = union(enum) { |
| 325 | 331 | .indirect, |
| 326 | 332 | .load_direct, |
| 327 | 333 | .load_got, |
| 334 | .load_actual_got, |
| 328 | 335 | .load_tlv, |
| 329 | 336 | .load_frame, |
| 330 | 337 | .reserved_frame, |
| ... | ... | @@ -335,6 +342,7 @@ pub const MCValue = union(enum) { |
| 335 | 342 | .register_offset => |reg_off| .{ .indirect = reg_off }, |
| 336 | 343 | .lea_direct => |sym_index| .{ .load_direct = sym_index }, |
| 337 | 344 | .lea_got => |sym_index| .{ .load_got = sym_index }, |
| 345 | .lea_actual_got => |sym_index| .{ .load_actual_got = sym_index }, |
| 338 | 346 | .lea_tlv => |sym_index| .{ .load_tlv = sym_index }, |
| 339 | 347 | .lea_frame => |frame_addr| .{ .load_frame = frame_addr }, |
| 340 | 348 | }; |
| ... | ... | @@ -358,6 +366,8 @@ pub const MCValue = union(enum) { |
| 358 | 366 | .lea_direct, |
| 359 | 367 | .load_got, |
| 360 | 368 | .lea_got, |
| 369 | .load_actual_got, |
| 370 | .lea_actual_got, |
| 361 | 371 | .load_tlv, |
| 362 | 372 | .lea_tlv, |
| 363 | 373 | .load_frame, |
| ... | ... | @@ -392,6 +402,8 @@ pub const MCValue = union(enum) { |
| 392 | 402 | .lea_direct, |
| 393 | 403 | .load_got, |
| 394 | 404 | .lea_got, |
| 405 | .load_actual_got, |
| 406 | .lea_actual_got, |
| 395 | 407 | .load_tlv, |
| 396 | 408 | .lea_tlv, |
| 397 | 409 | .lea_frame, |
| ... | ... | @@ -434,6 +446,8 @@ pub const MCValue = union(enum) { |
| 434 | 446 | .lea_direct => |pl| try writer.print("direct:{d}", .{pl}), |
| 435 | 447 | .load_got => |pl| try writer.print("[got:{d}]", .{pl}), |
| 436 | 448 | .lea_got => |pl| try writer.print("got:{d}", .{pl}), |
| 449 | .load_actual_got => |pl| try writer.print("[actual_got:{d}]", .{pl}), |
| 450 | .lea_actual_got => |pl| try writer.print("actual_got:{d}", .{pl}), |
| 437 | 451 | .load_tlv => |pl| try writer.print("[tlv:{d}]", .{pl}), |
| 438 | 452 | .lea_tlv => |pl| try writer.print("tlv:{d}", .{pl}), |
| 439 | 453 | .load_frame => |pl| try writer.print("[{} + 0x{x}]", .{ pl.index, pl.off }), |
| ... | ... | @@ -461,6 +475,8 @@ const InstTracking = struct { |
| 461 | 475 | .lea_direct, |
| 462 | 476 | .load_got, |
| 463 | 477 | .lea_got, |
| 478 | .load_actual_got, |
| 479 | .lea_actual_got, |
| 464 | 480 | .load_tlv, |
| 465 | 481 | .lea_tlv, |
| 466 | 482 | .load_frame, |
| ... | ... | @@ -520,6 +536,8 @@ const InstTracking = struct { |
| 520 | 536 | .lea_direct, |
| 521 | 537 | .load_got, |
| 522 | 538 | .lea_got, |
| 539 | .load_actual_got, |
| 540 | .lea_actual_got, |
| 523 | 541 | .load_tlv, |
| 524 | 542 | .lea_tlv, |
| 525 | 543 | .load_frame, |
| ... | ... | @@ -555,6 +573,8 @@ const InstTracking = struct { |
| 555 | 573 | .lea_direct, |
| 556 | 574 | .load_got, |
| 557 | 575 | .lea_got, |
| 576 | .load_actual_got, |
| 577 | .lea_actual_got, |
| 558 | 578 | .load_tlv, |
| 559 | 579 | .lea_tlv, |
| 560 | 580 | .lea_frame, |
| ... | ... | @@ -4371,6 +4391,7 @@ fn airArrayElemVal(self: *Self, inst: Air.Inst.Index) !void { |
| 4371 | 4391 | .memory, |
| 4372 | 4392 | .load_direct, |
| 4373 | 4393 | .load_got, |
| 4394 | .load_actual_got, |
| 4374 | 4395 | .load_tlv, |
| 4375 | 4396 | => try self.genSetReg(addr_reg, Type.usize, array.address()), |
| 4376 | 4397 | .lea_direct, .lea_tlv => unreachable, |
| ... | ... | @@ -5851,6 +5872,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) InnerErro |
| 5851 | 5872 | .register_offset, |
| 5852 | 5873 | .lea_direct, |
| 5853 | 5874 | .lea_got, |
| 5875 | .lea_actual_got, |
| 5854 | 5876 | .lea_tlv, |
| 5855 | 5877 | .lea_frame, |
| 5856 | 5878 | => try self.genCopy(dst_ty, dst_mcv, ptr_mcv.deref()), |
| ... | ... | @@ -5858,6 +5880,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) InnerErro |
| 5858 | 5880 | .indirect, |
| 5859 | 5881 | .load_direct, |
| 5860 | 5882 | .load_got, |
| 5883 | .load_actual_got, |
| 5861 | 5884 | .load_tlv, |
| 5862 | 5885 | .load_frame, |
| 5863 | 5886 | => { |
| ... | ... | @@ -5996,6 +6019,7 @@ fn store(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) InnerErr |
| 5996 | 6019 | .register_offset, |
| 5997 | 6020 | .lea_direct, |
| 5998 | 6021 | .lea_got, |
| 6022 | .lea_actual_got, |
| 5999 | 6023 | .lea_tlv, |
| 6000 | 6024 | .lea_frame, |
| 6001 | 6025 | => try self.genCopy(src_ty, ptr_mcv.deref(), src_mcv), |
| ... | ... | @@ -6003,6 +6027,7 @@ fn store(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) InnerErr |
| 6003 | 6027 | .indirect, |
| 6004 | 6028 | .load_direct, |
| 6005 | 6029 | .load_got, |
| 6030 | .load_actual_got, |
| 6006 | 6031 | .load_tlv, |
| 6007 | 6032 | .load_frame, |
| 6008 | 6033 | => { |
| ... | ... | @@ -6424,6 +6449,7 @@ fn genUnOpMir(self: *Self, mir_tag: Mir.Inst.FixedTag, dst_ty: Type, dst_mcv: MC |
| 6424 | 6449 | .register_overflow, |
| 6425 | 6450 | .lea_direct, |
| 6426 | 6451 | .lea_got, |
| 6452 | .lea_actual_got, |
| 6427 | 6453 | .lea_tlv, |
| 6428 | 6454 | .lea_frame, |
| 6429 | 6455 | .reserved_frame, |
| ... | ... | @@ -6431,7 +6457,7 @@ fn genUnOpMir(self: *Self, mir_tag: Mir.Inst.FixedTag, dst_ty: Type, dst_mcv: MC |
| 6431 | 6457 | => unreachable, // unmodifiable destination |
| 6432 | 6458 | .register => |dst_reg| try self.asmRegister(mir_tag, registerAlias(dst_reg, abi_size)), |
| 6433 | 6459 | .register_pair => unreachable, // unimplemented |
| 6434 | | .memory, .load_got, .load_direct, .load_tlv => { |
| 6460 | .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => { |
| 6435 | 6461 | const addr_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp); |
| 6436 | 6462 | const addr_reg_lock = self.register_manager.lockRegAssumeUnused(addr_reg); |
| 6437 | 6463 | defer self.register_manager.unlockReg(addr_reg_lock); |
| ... | ... | @@ -7389,6 +7415,8 @@ fn genBinOp( |
| 7389 | 7415 | .lea_direct, |
| 7390 | 7416 | .load_got, |
| 7391 | 7417 | .lea_got, |
| 7418 | .load_actual_got, |
| 7419 | .lea_actual_got, |
| 7392 | 7420 | .load_tlv, |
| 7393 | 7421 | .lea_tlv, |
| 7394 | 7422 | .lea_frame, |
| ... | ... | @@ -7445,6 +7473,8 @@ fn genBinOp( |
| 7445 | 7473 | .lea_direct, |
| 7446 | 7474 | .load_got, |
| 7447 | 7475 | .lea_got, |
| 7476 | .load_actual_got, |
| 7477 | .lea_actual_got, |
| 7448 | 7478 | .load_tlv, |
| 7449 | 7479 | .lea_tlv, |
| 7450 | 7480 | .lea_frame, |
| ... | ... | @@ -8397,6 +8427,7 @@ fn genBinOpMir( |
| 8397 | 8427 | .register_overflow, |
| 8398 | 8428 | .lea_direct, |
| 8399 | 8429 | .lea_got, |
| 8430 | .lea_actual_got, |
| 8400 | 8431 | .lea_tlv, |
| 8401 | 8432 | .lea_frame, |
| 8402 | 8433 | .reserved_frame, |
| ... | ... | @@ -8485,6 +8516,8 @@ fn genBinOpMir( |
| 8485 | 8516 | .lea_direct, |
| 8486 | 8517 | .load_got, |
| 8487 | 8518 | .lea_got, |
| 8519 | .load_actual_got, |
| 8520 | .lea_actual_got, |
| 8488 | 8521 | .load_tlv, |
| 8489 | 8522 | .lea_tlv, |
| 8490 | 8523 | .load_frame, |
| ... | ... | @@ -8517,6 +8550,7 @@ fn genBinOpMir( |
| 8517 | 8550 | .register_offset, |
| 8518 | 8551 | .lea_direct, |
| 8519 | 8552 | .lea_got, |
| 8553 | .lea_actual_got, |
| 8520 | 8554 | .lea_tlv, |
| 8521 | 8555 | .lea_frame, |
| 8522 | 8556 | => { |
| ... | ... | @@ -8532,6 +8566,7 @@ fn genBinOpMir( |
| 8532 | 8566 | .memory, |
| 8533 | 8567 | .load_direct, |
| 8534 | 8568 | .load_got, |
| 8569 | .load_actual_got, |
| 8535 | 8570 | .load_tlv, |
| 8536 | 8571 | => { |
| 8537 | 8572 | const ptr_ty = try mod.singleConstPtrType(ty); |
| ... | ... | @@ -8552,13 +8587,13 @@ fn genBinOpMir( |
| 8552 | 8587 | } |
| 8553 | 8588 | } |
| 8554 | 8589 | }, |
| 8555 | | .memory, .indirect, .load_got, .load_direct, .load_tlv, .load_frame => { |
| 8590 | .memory, .indirect, .load_got, .load_actual_got, .load_direct, .load_tlv, .load_frame => { |
| 8556 | 8591 | const OpInfo = ?struct { addr_reg: Register, addr_lock: RegisterLock }; |
| 8557 | 8592 | const limb_abi_size: u32 = @min(abi_size, 8); |
| 8558 | 8593 | |
| 8559 | 8594 | const dst_info: OpInfo = switch (dst_mcv) { |
| 8560 | 8595 | else => unreachable, |
| 8561 | | .memory, .load_got, .load_direct, .load_tlv => dst: { |
| 8596 | .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => dst: { |
| 8562 | 8597 | const dst_addr_reg = |
| 8563 | 8598 | (try self.register_manager.allocReg(null, abi.RegisterClass.gp)).to64(); |
| 8564 | 8599 | const dst_addr_lock = self.register_manager.lockRegAssumeUnused(dst_addr_reg); |
| ... | ... | @@ -8592,16 +8627,17 @@ fn genBinOpMir( |
| 8592 | 8627 | .indirect, |
| 8593 | 8628 | .lea_direct, |
| 8594 | 8629 | .lea_got, |
| 8630 | .lea_actual_got, |
| 8595 | 8631 | .lea_tlv, |
| 8596 | 8632 | .load_frame, |
| 8597 | 8633 | .lea_frame, |
| 8598 | 8634 | => null, |
| 8599 | | .memory, .load_got, .load_direct, .load_tlv => src: { |
| 8635 | .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => src: { |
| 8600 | 8636 | switch (resolved_src_mcv) { |
| 8601 | 8637 | .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr))) != null and |
| 8602 | 8638 | math.cast(i32, @as(i64, @bitCast(addr)) + abi_size - limb_abi_size) != null) |
| 8603 | 8639 | break :src null, |
| 8604 | | .load_got, .load_direct, .load_tlv => {}, |
| 8640 | .load_got, .load_actual_got, .load_direct, .load_tlv => {}, |
| 8605 | 8641 | else => unreachable, |
| 8606 | 8642 | } |
| 8607 | 8643 | |
| ... | ... | @@ -8644,6 +8680,7 @@ fn genBinOpMir( |
| 8644 | 8680 | switch (dst_mcv) { |
| 8645 | 8681 | .memory, |
| 8646 | 8682 | .load_got, |
| 8683 | .load_actual_got, |
| 8647 | 8684 | .load_direct, |
| 8648 | 8685 | .load_tlv, |
| 8649 | 8686 | => .{ .base = .{ .reg = dst_info.?.addr_reg }, .disp = off }, |
| ... | ... | @@ -8728,6 +8765,8 @@ fn genBinOpMir( |
| 8728 | 8765 | .lea_direct, |
| 8729 | 8766 | .load_got, |
| 8730 | 8767 | .lea_got, |
| 8768 | .load_actual_got, |
| 8769 | .lea_actual_got, |
| 8731 | 8770 | .load_tlv, |
| 8732 | 8771 | .lea_tlv, |
| 8733 | 8772 | .load_frame, |
| ... | ... | @@ -8743,6 +8782,7 @@ fn genBinOpMir( |
| 8743 | 8782 | .register_offset, |
| 8744 | 8783 | .lea_direct, |
| 8745 | 8784 | .lea_got, |
| 8785 | .lea_actual_got, |
| 8746 | 8786 | .lea_tlv, |
| 8747 | 8787 | .lea_frame, |
| 8748 | 8788 | => switch (limb_i) { |
| ... | ... | @@ -8792,6 +8832,7 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M |
| 8792 | 8832 | .register_overflow, |
| 8793 | 8833 | .lea_direct, |
| 8794 | 8834 | .lea_got, |
| 8835 | .lea_actual_got, |
| 8795 | 8836 | .lea_tlv, |
| 8796 | 8837 | .lea_frame, |
| 8797 | 8838 | .reserved_frame, |
| ... | ... | @@ -8840,6 +8881,8 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M |
| 8840 | 8881 | .lea_direct, |
| 8841 | 8882 | .load_got, |
| 8842 | 8883 | .lea_got, |
| 8884 | .load_actual_got, |
| 8885 | .lea_actual_got, |
| 8843 | 8886 | .load_tlv, |
| 8844 | 8887 | .lea_tlv, |
| 8845 | 8888 | .lea_frame, |
| ... | ... | @@ -8878,7 +8921,7 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M |
| 8878 | 8921 | } |
| 8879 | 8922 | }, |
| 8880 | 8923 | .register_pair => unreachable, // unimplemented |
| 8881 | | .memory, .indirect, .load_direct, .load_got, .load_tlv, .load_frame => { |
| 8924 | .memory, .indirect, .load_direct, .load_got, .load_actual_got, .load_tlv, .load_frame => { |
| 8882 | 8925 | const tmp_reg = try self.copyToTmpRegister(dst_ty, dst_mcv); |
| 8883 | 8926 | const tmp_mcv = MCValue{ .register = tmp_reg }; |
| 8884 | 8927 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| ... | ... | @@ -8971,6 +9014,7 @@ fn genVarDbgInfo( |
| 8971 | 9014 | //} }, |
| 8972 | 9015 | .memory => |address| .{ .memory = address }, |
| 8973 | 9016 | .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } }, |
| 9017 | .load_actual_got => |sym_index| .{ .linker_load = .{ .type = .actual_got, .sym_index = sym_index } }, |
| 8974 | 9018 | .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } }, |
| 8975 | 9019 | .immediate => |x| .{ .immediate = x }, |
| 8976 | 9020 | .undef => .undef, |
| ... | ... | @@ -9410,13 +9454,14 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 9410 | 9454 | .indirect, |
| 9411 | 9455 | .lea_direct, |
| 9412 | 9456 | .lea_got, |
| 9457 | .lea_actual_got, |
| 9413 | 9458 | .lea_tlv, |
| 9414 | 9459 | .lea_frame, |
| 9415 | 9460 | .reserved_frame, |
| 9416 | 9461 | .air_ref, |
| 9417 | 9462 | => unreachable, |
| 9418 | 9463 | .register_pair, .load_frame => null, |
| 9419 | | .memory, .load_got, .load_direct, .load_tlv => dst: { |
| 9464 | .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => dst: { |
| 9420 | 9465 | switch (resolved_dst_mcv) { |
| 9421 | 9466 | .memory => |addr| if (math.cast( |
| 9422 | 9467 | i32, |
| ... | ... | @@ -9425,7 +9470,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 9425 | 9470 | i32, |
| 9426 | 9471 | @as(i64, @bitCast(addr)) + abi_size - 8, |
| 9427 | 9472 | ) != null) break :dst null, |
| 9428 | | .load_got, .load_direct, .load_tlv => {}, |
| 9473 | .load_got, .load_actual_got, .load_direct, .load_tlv => {}, |
| 9429 | 9474 | else => unreachable, |
| 9430 | 9475 | } |
| 9431 | 9476 | |
| ... | ... | @@ -9468,13 +9513,14 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 9468 | 9513 | .indirect, |
| 9469 | 9514 | .lea_direct, |
| 9470 | 9515 | .lea_got, |
| 9516 | .lea_actual_got, |
| 9471 | 9517 | .lea_tlv, |
| 9472 | 9518 | .lea_frame, |
| 9473 | 9519 | .reserved_frame, |
| 9474 | 9520 | .air_ref, |
| 9475 | 9521 | => unreachable, |
| 9476 | 9522 | .register_pair, .load_frame => null, |
| 9477 | | .memory, .load_got, .load_direct, .load_tlv => src: { |
| 9523 | .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => src: { |
| 9478 | 9524 | switch (resolved_src_mcv) { |
| 9479 | 9525 | .memory => |addr| if (math.cast( |
| 9480 | 9526 | i32, |
| ... | ... | @@ -9483,7 +9529,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 9483 | 9529 | i32, |
| 9484 | 9530 | @as(i64, @bitCast(addr)) + abi_size - 8, |
| 9485 | 9531 | ) != null) break :src null, |
| 9486 | | .load_got, .load_direct, .load_tlv => {}, |
| 9532 | .load_got, .load_actual_got, .load_direct, .load_tlv => {}, |
| 9487 | 9533 | else => unreachable, |
| 9488 | 9534 | } |
| 9489 | 9535 | |
| ... | ... | @@ -9902,6 +9948,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC |
| 9902 | 9948 | .register_overflow, |
| 9903 | 9949 | .lea_direct, |
| 9904 | 9950 | .lea_got, |
| 9951 | .lea_actual_got, |
| 9905 | 9952 | .lea_tlv, |
| 9906 | 9953 | .lea_frame, |
| 9907 | 9954 | .reserved_frame, |
| ... | ... | @@ -9928,6 +9975,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC |
| 9928 | 9975 | |
| 9929 | 9976 | .memory, |
| 9930 | 9977 | .load_got, |
| 9978 | .load_actual_got, |
| 9931 | 9979 | .load_direct, |
| 9932 | 9980 | .load_tlv, |
| 9933 | 9981 | => { |
| ... | ... | @@ -10485,7 +10533,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { |
| 10485 | 10533 | .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |_| |
| 10486 | 10534 | break :arg input_mcv, |
| 10487 | 10535 | .indirect, .load_frame => break :arg input_mcv, |
| 10488 | | .load_direct, .load_got, .load_tlv => {}, |
| 10536 | .load_direct, .load_got, .load_actual_got, .load_tlv => {}, |
| 10489 | 10537 | else => { |
| 10490 | 10538 | const temp_mcv = try self.allocTempRegOrMem(ty, false); |
| 10491 | 10539 | try self.genCopy(ty, temp_mcv, input_mcv); |
| ... | ... | @@ -11146,6 +11194,7 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError |
| 11146 | 11194 | .register_overflow, |
| 11147 | 11195 | .lea_direct, |
| 11148 | 11196 | .lea_got, |
| 11197 | .lea_actual_got, |
| 11149 | 11198 | .lea_tlv, |
| 11150 | 11199 | .lea_frame, |
| 11151 | 11200 | .reserved_frame, |
| ... | ... | @@ -11197,11 +11246,11 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError |
| 11197 | 11246 | } |
| 11198 | 11247 | }, |
| 11199 | 11248 | .indirect => |reg_off| try self.genSetMem(.{ .reg = reg_off.reg }, reg_off.off, ty, src_mcv), |
| 11200 | | .memory, .load_direct, .load_got, .load_tlv => { |
| 11249 | .memory, .load_direct, .load_got, .load_actual_got, .load_tlv => { |
| 11201 | 11250 | switch (dst_mcv) { |
| 11202 | 11251 | .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |small_addr| |
| 11203 | 11252 | return self.genSetMem(.{ .reg = .ds }, small_addr, ty, src_mcv), |
| 11204 | | .load_direct, .load_got, .load_tlv => {}, |
| 11253 | .load_direct, .load_got, .load_actual_got, .load_tlv => {}, |
| 11205 | 11254 | else => unreachable, |
| 11206 | 11255 | } |
| 11207 | 11256 | |
| ... | ... | @@ -11363,7 +11412,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 11363 | 11412 | else => unreachable, |
| 11364 | 11413 | }, |
| 11365 | 11414 | )), |
| 11366 | | .memory, .load_direct, .load_got, .load_tlv => { |
| 11415 | .memory, .load_direct, .load_got, .load_actual_got, .load_tlv => { |
| 11367 | 11416 | switch (src_mcv) { |
| 11368 | 11417 | .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |small_addr| |
| 11369 | 11418 | return (try self.moveStrategy( |
| ... | ... | @@ -11391,7 +11440,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 11391 | 11440 | }, |
| 11392 | 11441 | .Float, .Vector => {}, |
| 11393 | 11442 | }, |
| 11394 | | .load_got, .load_tlv => {}, |
| 11443 | .load_got, .load_actual_got, .load_tlv => {}, |
| 11395 | 11444 | else => unreachable, |
| 11396 | 11445 | } |
| 11397 | 11446 | |
| ... | ... | @@ -11405,17 +11454,18 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 11405 | 11454 | Memory.sib(Memory.PtrSize.fromSize(abi_size), .{ .base = .{ .reg = addr_reg } }), |
| 11406 | 11455 | ); |
| 11407 | 11456 | }, |
| 11408 | | .lea_direct, .lea_got => |sym_index| { |
| 11457 | .lea_direct, .lea_got, .lea_actual_got => |sym_index| { |
| 11409 | 11458 | const atom_index = try self.owner.getSymbolIndex(self); |
| 11410 | 11459 | _ = try self.addInst(.{ |
| 11411 | 11460 | .tag = switch (src_mcv) { |
| 11412 | 11461 | .lea_direct => .lea, |
| 11413 | | .lea_got => .mov, |
| 11462 | .lea_got, .lea_actual_got => .mov, |
| 11414 | 11463 | else => unreachable, |
| 11415 | 11464 | }, |
| 11416 | 11465 | .ops = switch (src_mcv) { |
| 11417 | 11466 | .lea_direct => .direct_reloc, |
| 11418 | 11467 | .lea_got => .got_reloc, |
| 11468 | .lea_actual_got => .actual_got_reloc, |
| 11419 | 11469 | else => unreachable, |
| 11420 | 11470 | }, |
| 11421 | 11471 | .data = .{ .rx = .{ |
| ... | ... | @@ -11551,6 +11601,8 @@ fn genSetMem(self: *Self, base: Memory.Base, disp: i32, ty: Type, src_mcv: MCVal |
| 11551 | 11601 | .lea_direct, |
| 11552 | 11602 | .load_got, |
| 11553 | 11603 | .lea_got, |
| 11604 | .load_actual_got, |
| 11605 | .lea_actual_got, |
| 11554 | 11606 | .load_tlv, |
| 11555 | 11607 | .lea_tlv, |
| 11556 | 11608 | .load_frame, |
| ... | ... | @@ -13556,6 +13608,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue { |
| 13556 | 13608 | .memory => |addr| .{ .memory = addr }, |
| 13557 | 13609 | .load_direct => |sym_index| .{ .load_direct = sym_index }, |
| 13558 | 13610 | .load_got => |sym_index| .{ .lea_got = sym_index }, |
| 13611 | .load_actual_got => |sym_index| .{ .lea_actual_got = sym_index }, |
| 13559 | 13612 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 13560 | 13613 | }, |
| 13561 | 13614 | .fail => |msg| { |