… | |
… | |
48 | my $code = "\x48\xbe" . pack "Q", $curbase; # mov imm64, %rsi |
48 | my $code = "\x48\xbe" . pack "Q", $curbase; # mov imm64, %rsi |
49 | |
49 | |
50 | my $curslot = 0; |
50 | my $curslot = 0; |
51 | |
51 | |
52 | for (@vars) { |
52 | for (@vars) { |
53 | my ($addr, $slot, $size) = @$_; |
53 | my ($addr, $asize, $slot, $ssize) = @$_; |
54 | |
54 | |
55 | my $slotofs = $slot - $curslot; |
55 | my $slotofs = $slot - $curslot; |
56 | |
56 | |
57 | # the sort ensures that this condition and adjustment suffices |
57 | # the sort ensures that this condition and adjustment suffices |
58 | if ($slotofs > 127) { |
58 | if ($slotofs > 127) { |
… | |
… | |
61 | $curslot += $adj; |
61 | $curslot += $adj; |
62 | $slotofs -= $adj; |
62 | $slotofs -= $adj; |
63 | } |
63 | } |
64 | |
64 | |
65 | if ($save) { |
65 | if ($save) { |
66 | $code .= $mov_ind->($size, $modrm_rsi, 0, $addr - $curbase); |
66 | $code .= $mov_ind->($asize, $modrm_rsi, 0, $addr - $curbase); |
67 | $code .= $mov_ind->($size, $modrm_rdi, 1, $slotofs); |
67 | $code .= $mov_ind->($ssize, $modrm_rdi, 1, $slotofs); |
68 | } else { |
68 | } else { |
69 | $code .= $mov_ind->($size, $modrm_rdi, 0, $slotofs); |
69 | $code .= $mov_ind->($ssize, $modrm_rdi, 0, $slotofs); |
70 | $code .= $mov_ind->($size, $modrm_rsi, 1, $addr - $curbase); |
70 | $code .= $mov_ind->($asize, $modrm_rsi, 1, $addr - $curbase); |
71 | } |
71 | } |
72 | } |
72 | } |
73 | |
73 | |
74 | $code .= "\xc3"; # retq |
74 | $code .= "\xc3"; # retq |
75 | |
75 | |
… | |
… | |
81 | |
81 | |
82 | # sort all variables into 256 byte blocks, biased by -128 |
82 | # sort all variables into 256 byte blocks, biased by -128 |
83 | # so gencopy can += 256 occasionally. within those blocks, |
83 | # so gencopy can += 256 occasionally. within those blocks, |
84 | # sort by address so we can play further tricks. |
84 | # sort by address so we can play further tricks. |
85 | @vars = sort { |
85 | @vars = sort { |
86 | (($a->[1] + 128) & ~255) <=> (($b->[1] + 128) & ~255) |
86 | (($a->[2] + 128) & ~255) <=> (($b->[2] + 128) & ~255) |
87 | or $a->[0] <=> $b->[0] |
87 | or $a->[0] <=> $b->[0] |
88 | } @vars; |
88 | } @vars; |
89 | |
89 | |
90 | # we *could* combine adjacent vars, but this is not very common |
90 | # we *could* combine adjacent vars, but this is not very common |
91 | |
91 | |