ytljit 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/ytljit.h +2 -2
- data/lib/ytljit/asmext.rb +20 -0
- data/lib/ytljit/asmext_x64.rb +10 -2
- data/lib/ytljit/asmext_x86.rb +1 -1
- data/lib/ytljit/asmutil.rb +7 -1
- data/lib/ytljit/instruction_ia.rb +47 -5
- data/lib/ytljit/util.rb +1 -0
- data/lib/ytljit/vm.rb +405 -82
- data/lib/ytljit/vm_codegen.rb +12 -13
- data/lib/ytljit/vm_inline_method.rb +24 -21
- data/lib/ytljit/vm_sendnode.rb +361 -187
- data/lib/ytljit/vm_trans.rb +57 -10
- data/lib/ytljit/vm_type.rb +27 -18
- data/lib/ytljit/vm_type_gen.rb +0 -2
- data/test/vmtest.rb +5 -1
- metadata +3 -3
data/ext/ytljit.h
CHANGED
@@ -67,7 +67,7 @@ struct rb_iseq_struct {
|
|
67
67
|
VALUE name; /* String: iseq name */
|
68
68
|
VALUE filename; /* file information where this sequence from */
|
69
69
|
VALUE filepath; /* real file path or nil */
|
70
|
-
VALUE *iseq; /* iseq (insn number and
|
70
|
+
VALUE *iseq; /* iseq (insn number and operands) */
|
71
71
|
VALUE *iseq_encoded; /* encoded iseq */
|
72
72
|
unsigned long iseq_size;
|
73
73
|
VALUE mark_ary; /* Array: includes operands which should be GC marked */
|
@@ -91,7 +91,7 @@ struct rb_iseq_struct {
|
|
91
91
|
* argument information
|
92
92
|
*
|
93
93
|
* def m(a1, a2, ..., aM, # mandatory
|
94
|
-
* b1=(...), b2=(...), ..., bN=(...), #
|
94
|
+
* b1=(...), b2=(...), ..., bN=(...), # optional
|
95
95
|
* *c, # rest
|
96
96
|
* d1, d2, ..., dO, # post
|
97
97
|
* &e) # block
|
data/lib/ytljit/asmext.rb
CHANGED
@@ -136,6 +136,26 @@ module YTLJit
|
|
136
136
|
return [rcode, TypedData.new(rtype, dst)]
|
137
137
|
end
|
138
138
|
|
139
|
+
when :push
|
140
|
+
case dst
|
141
|
+
when OpRegXMM
|
142
|
+
rcode = ""
|
143
|
+
rcode += sub(SPR, 8)
|
144
|
+
rcode += mov(INDIRECT_SPR, dst)
|
145
|
+
|
146
|
+
return rcode
|
147
|
+
end
|
148
|
+
|
149
|
+
when :pop
|
150
|
+
case dst
|
151
|
+
when OpRegXMM
|
152
|
+
rcode = ""
|
153
|
+
rcode += mov(dst, INDIRECT_SPR)
|
154
|
+
rcode += add(SPR, 8)
|
155
|
+
|
156
|
+
return rcode
|
157
|
+
end
|
158
|
+
|
139
159
|
when :seta, :setae, :setb, :setbe, :setl, :setle, :setg, :setge,
|
140
160
|
:setna, :setnae, :setnb, :setnbe, :setnc, :setnle,
|
141
161
|
:setno, :seto, :setz, :setnz
|
data/lib/ytljit/asmext_x64.rb
CHANGED
@@ -14,6 +14,9 @@ module YTLJit
|
|
14
14
|
when :c
|
15
15
|
ARGPOS2REG
|
16
16
|
|
17
|
+
when :cfloat
|
18
|
+
ARGPOS2FREG
|
19
|
+
|
17
20
|
when :ytl
|
18
21
|
[]
|
19
22
|
|
@@ -29,6 +32,9 @@ module YTLJit
|
|
29
32
|
def argpos2reg
|
30
33
|
case @abi_kind
|
31
34
|
when :c
|
35
|
+
ARGPOS2REG
|
36
|
+
|
37
|
+
when :cfloat
|
32
38
|
ARGPOS2FREG
|
33
39
|
|
34
40
|
when :ytl
|
@@ -81,13 +87,15 @@ module YTLJit
|
|
81
87
|
|
82
88
|
if @no < argpos2reg.size then
|
83
89
|
argreg = argpos2reg[@no]
|
84
|
-
|
90
|
+
|
91
|
+
=begin
|
85
92
|
# for nested function call. need save previous reg.
|
86
93
|
if asm.retry_mode != :change_op and
|
87
94
|
fainfo.used_arg_tab.last[@no] then
|
88
95
|
asm.update_state(gen.push(argreg))
|
89
96
|
fainfo.push argreg
|
90
97
|
end
|
98
|
+
=end
|
91
99
|
code += asm.update_state(gen.mov(argreg, src))
|
92
100
|
else
|
93
101
|
# spilled reg
|
@@ -165,7 +173,7 @@ module YTLJit
|
|
165
173
|
code += @asm.update_state(mov(RAX, OpImmidiate32.new(argnum)))
|
166
174
|
code += @asm.update_state(call(addr))
|
167
175
|
callpos = @asm.current_address - @asm.output_stream.base_address
|
168
|
-
if @asm.retry_mode
|
176
|
+
if @asm.retry_mode == :change_op then
|
169
177
|
return [code, callpos]
|
170
178
|
end
|
171
179
|
|
data/lib/ytljit/asmext_x86.rb
CHANGED
data/lib/ytljit/asmutil.rb
CHANGED
@@ -92,7 +92,10 @@ module YTLJit
|
|
92
92
|
TMPR = OpEAX.instance
|
93
93
|
TMPR2 = OpEDX.instance
|
94
94
|
TMPR3 = OpECX.instance
|
95
|
+
DBLLOR = OpEAX.instance
|
96
|
+
DBLHIR = OpEDX.instance
|
95
97
|
RETR = OpEAX.instance
|
98
|
+
RETFR = XMM0
|
96
99
|
SPR = OpESP.instance
|
97
100
|
BPR = OpEBP.instance
|
98
101
|
when /x86_64/
|
@@ -101,7 +104,10 @@ module YTLJit
|
|
101
104
|
# TMPR3 = OpRCX.instance
|
102
105
|
TMPR2 = OpR10.instance
|
103
106
|
TMPR3 = OpR11.instance
|
107
|
+
DBLLOR = OpRAX.instance
|
108
|
+
DBLHIR = OpRDX.instance
|
104
109
|
RETR = OpRAX.instance
|
110
|
+
RETFR = XMM0
|
105
111
|
SPR = OpRSP.instance
|
106
112
|
BPR = OpRBP.instance
|
107
113
|
end
|
@@ -114,7 +120,7 @@ module YTLJit
|
|
114
120
|
hash[key] = FunctionArgumentInt.new(key, :c)
|
115
121
|
}
|
116
122
|
FUNC_FLOAT_ARG = Hash.new {|hash, key|
|
117
|
-
hash[key] = FunctionArgumentFloat.new(key, :
|
123
|
+
hash[key] = FunctionArgumentFloat.new(key, :cfloat)
|
118
124
|
}
|
119
125
|
FUNC_ARG_YTL = Hash.new {|hash, key|
|
120
126
|
hash[key] = FunctionArgumentInt.new(key, :ytl)
|
@@ -1193,20 +1193,20 @@ module YTLJit
|
|
1193
1193
|
case dst
|
1194
1194
|
when OpReg8, OpMem8
|
1195
1195
|
if src == nil then
|
1196
|
-
modseq, modfmt = modrm(:imul, 5, dst, dst,
|
1196
|
+
modseq, modfmt = modrm(:imul, 5, dst, dst, src)
|
1197
1197
|
return ([0xF6] + modseq).pack("C#{modfmt}")
|
1198
1198
|
end
|
1199
1199
|
|
1200
1200
|
when OpIndirect, OpMem32
|
1201
|
-
if src
|
1202
|
-
modseq, modfmt = modrm(:imul, 5, dst, dst,
|
1203
|
-
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#
|
1201
|
+
if src == nil then
|
1202
|
+
modseq, modfmt = modrm(:imul, 5, dst, dst, src)
|
1203
|
+
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
|
1204
1204
|
end
|
1205
1205
|
|
1206
1206
|
when OpReg32, OpReg64
|
1207
1207
|
case src
|
1208
1208
|
when nil
|
1209
|
-
modseq, modfmt = modrm(:imul, 5, dst, dst,
|
1209
|
+
modseq, modfmt = modrm(:imul, 5, dst, dst, src)
|
1210
1210
|
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#(modfmt}")
|
1211
1211
|
|
1212
1212
|
when OpReg32, OpMem32, OpIndirect, OpReg64
|
@@ -1250,6 +1250,48 @@ module YTLJit
|
|
1250
1250
|
return nosupported_addressing_mode(:imul, dst, src, src2)
|
1251
1251
|
end
|
1252
1252
|
|
1253
|
+
def idiv(src)
|
1254
|
+
rexseq, rexfmt = rex(src, nil)
|
1255
|
+
case src
|
1256
|
+
when OpReg8, OpMem8
|
1257
|
+
modseq, modfmt = modrm(:idiv, 7, src, src, nil)
|
1258
|
+
return ([0xF6] + modseq).pack("C#{modfmt}")
|
1259
|
+
|
1260
|
+
when OpIndirect, OpMem32
|
1261
|
+
modseq, modfmt = modrm(:idiv, 7, src, src, nil)
|
1262
|
+
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
|
1263
|
+
|
1264
|
+
when OpReg32, OpReg64
|
1265
|
+
modseq, modfmt = modrm(:idiv, 7, src, src, nil)
|
1266
|
+
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
|
1267
|
+
end
|
1268
|
+
|
1269
|
+
return nosupported_addressing_mode(:idiv, src, nil, nil)
|
1270
|
+
end
|
1271
|
+
|
1272
|
+
def neg(src)
|
1273
|
+
rexseq, rexfmt = rex(src, nil)
|
1274
|
+
case src
|
1275
|
+
when OpReg8, OpMem8
|
1276
|
+
modseq, modfmt = modrm(:neg, 3, src, src, nil)
|
1277
|
+
return ([0xF6] + modseq).pack("C#{modfmt}")
|
1278
|
+
|
1279
|
+
when OpIndirect, OpMem32
|
1280
|
+
modseq, modfmt = modrm(:neg, 3, src, src, nil)
|
1281
|
+
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
|
1282
|
+
|
1283
|
+
when OpReg32, OpReg64
|
1284
|
+
modseq, modfmt = modrm(:neg, 3, src, src, nil)
|
1285
|
+
return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
return nosupported_addressing_mode(:neg, src, nil, nil)
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
def cdq
|
1292
|
+
[0x99].pack("C")
|
1293
|
+
end
|
1294
|
+
|
1253
1295
|
def movss(dst, src)
|
1254
1296
|
common_movssd(dst, src, 0xF3, :movss)
|
1255
1297
|
end
|
data/lib/ytljit/util.rb
CHANGED