Module: YTLJit::AssemblerUtilX64

Defined in:
lib/ytljit/instruction_x64.rb

Instance Method Summary collapse

Instance Method Details

#immidiate_call(addr, offset) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/ytljit/instruction_x64.rb', line 44

def immidiate_call(addr, offset)
  if offset.abs > 0x7fff_ffff then
    addrent = @asm.add_value_entry(addr)
    offset = addrent.value - @asm.current_address - 7
    modseq, modfmt = modrm(:call, 2, offset, nil, addr)
    [0x48, 0xff, *modseq, offset].pack("CC#{modfmt}L")
  else
    [0xe8, offset].pack("CL")
  end
end

#rex(dst, src) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ytljit/instruction_x64.rb', line 3

def rex(dst, src)
  rrex = 0
  if dst.is_a?(OpReg64) then
    rrex |= 0b1000
    if dst.reg_no >= 8 then
      rrex |= 0b1
    end
  end
  
  if dst.is_a?(OpIndirect) and dst.reg.is_a?(OpReg64) then
    if dst.reg_no >= 8 then
      rrex |= 0b1000
      rrex |= 0b1
    end
  end
  
  if src.is_a?(OpReg64) then
    rrex |= 0b1000
    if src.reg_no >= 8 then
      rrex |= 0b100
    end
  end

  if src.is_a?(OpIndirect) and src.reg.is_a?(OpReg64) then
    if dst.reg_no >= 8 then
      rrex |= 0b1000
      rrex |= 0b1
    end
  end

  if src.is_a?(OpImmidiate64) then
    rrex |= 0b1000
  end

  if rrex != 0 then
    [[0x40 + rrex], "C"]
  else
    [[], ""]
  end
end