| ... | ... | @@ -3619,11 +3619,15 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 3619 | 3619 | else => return self.fail("TODO implement loading from register into {}", .{dst_mcv}), |
| 3620 | 3620 | } |
| 3621 | 3621 | }, |
| 3622 | | .load_direct, .load_tlv => |sym_index| try self.load(dst_mcv, switch (ptr) { |
| 3623 | | .load_direct => .{ .lea_direct = sym_index }, |
| 3624 | | .load_tlv => .{ .lea_tlv = sym_index }, |
| 3625 | | else => unreachable, |
| 3626 | | }, ptr_ty), |
| 3622 | .load_direct => |sym_index| { |
| 3623 | const addr_reg = try self.copyToTmpRegister(Type.usize, .{ .lea_direct = sym_index }); |
| 3624 | const addr_reg_lock = self.register_manager.lockRegAssumeUnused(addr_reg); |
| 3625 | defer self.register_manager.unlockReg(addr_reg_lock); |
| 3626 | // Load the pointer, which is stored in memory |
| 3627 | try self.asmRegisterMemory(.mov, addr_reg, Memory.sib(.qword, .{ .base = addr_reg })); |
| 3628 | try self.load(dst_mcv, .{ .register = addr_reg }, ptr_ty); |
| 3629 | }, |
| 3630 | .load_tlv => |sym_index| try self.load(dst_mcv, .{ .lea_tlv = sym_index }, ptr_ty), |
| 3627 | 3631 | .memory, .load_got, .lea_direct, .lea_tlv => { |
| 3628 | 3632 | const reg = try self.copyToTmpRegister(ptr_ty, ptr); |
| 3629 | 3633 | try self.load(dst_mcv, .{ .register = reg }, ptr_ty); |
| ... | ... | @@ -3817,15 +3821,15 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 3817 | 3821 | defer self.register_manager.unlockReg(addr_reg_lock); |
| 3818 | 3822 | |
| 3819 | 3823 | switch (ptr) { |
| 3820 | | .memory => |addr| { |
| 3821 | | try self.genSetReg(ptr_ty, addr_reg, .{ .immediate = addr }); |
| 3822 | | // Load the pointer, which is stored in memory |
| 3823 | | try self.asmRegisterMemory(.mov, addr_reg, Memory.sib(.qword, .{ .base = addr_reg })); |
| 3824 | | }, |
| 3824 | .memory => |addr| try self.genSetReg(ptr_ty, addr_reg, .{ .immediate = addr }), |
| 3825 | 3825 | .load_direct => |sym_index| try self.genSetReg(ptr_ty, addr_reg, .{ .lea_direct = sym_index }), |
| 3826 | 3826 | .load_tlv => |sym_index| try self.genSetReg(ptr_ty, addr_reg, .{ .lea_tlv = sym_index }), |
| 3827 | 3827 | else => unreachable, |
| 3828 | 3828 | } |
| 3829 | if (ptr != .load_tlv) { |
| 3830 | // Load the pointer, which is stored in memory |
| 3831 | try self.asmRegisterMemory(.mov, addr_reg, Memory.sib(.qword, .{ .base = addr_reg })); |
| 3832 | } |
| 3829 | 3833 | |
| 3830 | 3834 | const new_ptr = MCValue{ .register = addr_reg }; |
| 3831 | 3835 | try self.store(new_ptr, value, ptr_ty, value_ty); |
| ... | ... | @@ -7223,6 +7227,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl |
| 7223 | 7227 | .memory, |
| 7224 | 7228 | .load_direct, |
| 7225 | 7229 | .load_tlv, |
| 7230 | .lea_direct, |
| 7231 | .lea_tlv, |
| 7226 | 7232 | => if (abi_size <= 8) { |
| 7227 | 7233 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 7228 | 7234 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }, opts); |
| ... | ... | @@ -7235,7 +7241,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl |
| 7235 | 7241 | .memory => |addr| .{ .immediate = addr }, |
| 7236 | 7242 | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7237 | 7243 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7238 | | else => unreachable, |
| 7244 | else => mcv, |
| 7239 | 7245 | }); |
| 7240 | 7246 | try self.genInlineMemcpy( |
| 7241 | 7247 | .{ .ptr_stack_offset = stack_offset }, |
| ... | ... | @@ -7258,8 +7264,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl |
| 7258 | 7264 | ), |
| 7259 | 7265 | .ptr_stack_offset, |
| 7260 | 7266 | .load_got, |
| 7261 | | .lea_direct, |
| 7262 | | .lea_tlv, |
| 7263 | 7267 | => { |
| 7264 | 7268 | const tmp_reg = try self.copyToTmpRegister(ty, mcv); |
| 7265 | 7269 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| ... | ... | @@ -7350,21 +7354,27 @@ fn genInlineMemcpy( |
| 7350 | 7354 | try self.spillRegisters(&.{ .rdi, .rsi, .rcx }); |
| 7351 | 7355 | |
| 7352 | 7356 | switch (dst_ptr) { |
| 7353 | | .memory => |addr| { |
| 7354 | | try self.genSetReg(Type.usize, .rdi, .{ .immediate = addr }); |
| 7355 | | // Load the pointer, which is stored in memory |
| 7356 | | try self.asmRegisterMemory(.mov, .rdi, Memory.sib(.qword, .{ .base = .rdi })); |
| 7357 | .lea_tlv, |
| 7358 | .load_tlv, |
| 7359 | => { |
| 7360 | try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7361 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7362 | else => dst_ptr, |
| 7363 | }); |
| 7357 | 7364 | }, |
| 7365 | .memory, |
| 7358 | 7366 | .load_got, |
| 7359 | 7367 | .lea_direct, |
| 7360 | 7368 | .load_direct, |
| 7361 | | .lea_tlv, |
| 7362 | | .load_tlv, |
| 7363 | | => try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7364 | | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7365 | | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7366 | | else => dst_ptr, |
| 7367 | | }), |
| 7369 | => { |
| 7370 | try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7371 | .memory => |addr| .{ .immediate = addr }, |
| 7372 | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7373 | else => dst_ptr, |
| 7374 | }); |
| 7375 | // Load the pointer, which is stored in memory |
| 7376 | try self.asmRegisterMemory(.mov, .rdi, Memory.sib(.qword, .{ .base = .rdi })); |
| 7377 | }, |
| 7368 | 7378 | .stack_offset, .ptr_stack_offset => |off| { |
| 7369 | 7379 | try self.asmRegisterMemory(switch (dst_ptr) { |
| 7370 | 7380 | .stack_offset => .mov, |
| ... | ... | @@ -7388,21 +7398,27 @@ fn genInlineMemcpy( |
| 7388 | 7398 | } |
| 7389 | 7399 | |
| 7390 | 7400 | switch (src_ptr) { |
| 7391 | | .memory => |addr| { |
| 7392 | | try self.genSetReg(Type.usize, .rsi, .{ .immediate = addr }); |
| 7393 | | // Load the pointer, which is stored in memory |
| 7394 | | try self.asmRegisterMemory(.mov, .rsi, Memory.sib(.qword, .{ .base = .rsi })); |
| 7401 | .lea_tlv, |
| 7402 | .load_tlv, |
| 7403 | => { |
| 7404 | try self.genSetReg(Type.usize, .rsi, switch (src_ptr) { |
| 7405 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7406 | else => dst_ptr, |
| 7407 | }); |
| 7395 | 7408 | }, |
| 7409 | .memory, |
| 7396 | 7410 | .load_got, |
| 7397 | 7411 | .lea_direct, |
| 7398 | 7412 | .load_direct, |
| 7399 | | .lea_tlv, |
| 7400 | | .load_tlv, |
| 7401 | | => try self.genSetReg(Type.usize, .rsi, switch (src_ptr) { |
| 7402 | | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7403 | | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7404 | | else => src_ptr, |
| 7405 | | }), |
| 7413 | => { |
| 7414 | try self.genSetReg(Type.usize, .rsi, switch (src_ptr) { |
| 7415 | .memory => |addr| .{ .immediate = addr }, |
| 7416 | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7417 | else => src_ptr, |
| 7418 | }); |
| 7419 | // Load the pointer, which is stored in memory |
| 7420 | try self.asmRegisterMemory(.mov, .rsi, Memory.sib(.qword, .{ .base = .rsi })); |
| 7421 | }, |
| 7406 | 7422 | .stack_offset, .ptr_stack_offset => |off| { |
| 7407 | 7423 | try self.asmRegisterMemory(switch (src_ptr) { |
| 7408 | 7424 | .stack_offset => .mov, |
| ... | ... | @@ -7449,21 +7465,27 @@ fn genInlineMemset( |
| 7449 | 7465 | try self.spillRegisters(&.{ .rdi, .al, .rcx }); |
| 7450 | 7466 | |
| 7451 | 7467 | switch (dst_ptr) { |
| 7452 | | .memory => |addr| { |
| 7453 | | try self.genSetReg(Type.usize, .rdi, .{ .immediate = addr }); |
| 7454 | | // Load the pointer, which is stored in memory |
| 7455 | | try self.asmRegisterMemory(.mov, .rdi, Memory.sib(.qword, .{ .base = .rdi })); |
| 7468 | .lea_tlv, |
| 7469 | .load_tlv, |
| 7470 | => { |
| 7471 | try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7472 | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7473 | else => dst_ptr, |
| 7474 | }); |
| 7456 | 7475 | }, |
| 7457 | | .load_got, |
| 7476 | .load_got => try self.genSetReg(Type.usize, .rdi, dst_ptr), |
| 7477 | .memory, |
| 7458 | 7478 | .lea_direct, |
| 7459 | 7479 | .load_direct, |
| 7460 | | .lea_tlv, |
| 7461 | | .load_tlv, |
| 7462 | | => try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7463 | | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7464 | | .load_tlv => |sym_index| .{ .lea_tlv = sym_index }, |
| 7465 | | else => dst_ptr, |
| 7466 | | }), |
| 7480 | => { |
| 7481 | try self.genSetReg(Type.usize, .rdi, switch (dst_ptr) { |
| 7482 | .memory => |addr| .{ .immediate = addr }, |
| 7483 | .load_direct => |sym_index| .{ .lea_direct = sym_index }, |
| 7484 | else => dst_ptr, |
| 7485 | }); |
| 7486 | // Load the pointer, which is stored in memory |
| 7487 | try self.asmRegisterMemory(.mov, .rdi, Memory.sib(.qword, .{ .base = .rdi })); |
| 7488 | }, |
| 7467 | 7489 | .stack_offset, .ptr_stack_offset => |off| { |
| 7468 | 7490 | try self.asmRegisterMemory(switch (dst_ptr) { |
| 7469 | 7491 | .stack_offset => .mov, |