Module: YTLJit::GeneratorExtendX86Mixin

Includes:
AbsArch
Defined in:
lib/ytljit/asmext_x86.rb

Constant Summary

Constants included from AbsArch

AbsArch::AL, AbsArch::BL, AbsArch::CL, AbsArch::DL, AbsArch::FUNC_ARG, AbsArch::FUNC_ARG_YTL, AbsArch::FUNC_FLOAT_ARG, AbsArch::FUNC_FLOAT_ARG_YTL, AbsArch::INDIRECT_BPR, AbsArch::INDIRECT_RETR, AbsArch::INDIRECT_SPR, AbsArch::INDIRECT_TMPR, AbsArch::INDIRECT_TMPR2, AbsArch::INDIRECT_TMPR3

Constants included from SSE

SSE::XMM0, SSE::XMM1, SSE::XMM2, SSE::XMM3, SSE::XMM4, SSE::XMM5, SSE::XMM6, SSE::XMM7

Instance Method Summary collapse

Instance Method Details

#call_with_arg(addr, argnum, argsize) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/ytljit/asmext_x86.rb', line 104

def call_with_arg(addr, argnum, argsize)
  orgaddress = @asm.current_address
  code = @asm.update_state(call(addr))
  callpos = @asm.current_address - @asm.output_stream.base_address
  if @asm.retry_mode == :change_op then
    return [code, callpos]
  end

  code += @asm.update_state(add(SPR, OpImmidiate8.new(argsize)))
  offset = @funcarg_info.area_allocate_pos.pop
  alloc_argument_area = lambda {
    asm.with_current_address(asm.output_stream.base_address + offset) {
      asm.output_stream[offset] = sub(SPR, argsize)
    }
  }
  asm.after_patch_tab.push alloc_argument_area

  @funcarg_info.update_maxargs(argnum)
  @funcarg_info.used_arg_tab.pop
  @asm.current_address = orgaddress
  
  [code, callpos]
end

#call_with_arg_get_argsize(addr, argnum) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ytljit/asmext_x86.rb', line 91

def call_with_arg_get_argsize(addr, argnum)
  argsize = 0
  argnum.times do |i| 
    if @funcarg_info.used_arg_tab.last[i] then
      argsize += @funcarg_info.used_arg_tab.last[i]
    else
      STDERR.print "Wanrnning arg not initialized -- #{i}\n"
      argsize += 4
    end
  end
  argsize
end

#mov64(dst, src) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ytljit/asmext_x86.rb', line 72

def mov64(dst, src)
  case dst
  when OpIndirect
    case src
      when Integer
      disp = dst.disp
      dst2 = dst.class.new(dst.reg, disp + 4)
      bit32val = 1 << 32
      code = mov(dst2, src / bit32val)
      code += mov(dst, src % bit32val)
      code
    else
      nosupported_addressing_mode(:mov64, dst, src)
    end
  else
    nosupported_addressing_mode(:mov64, dst, src)
  end
end