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
|