ytljit 0.0.7 → 0.0.8
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/memory.c +11 -5
- data/ext/ytljit.c +37 -0
- data/lib/ytljit/codespace.rb +6 -1
- data/lib/ytljit/instruction_ia.rb +33 -0
- data/lib/ytljit/util.rb +1 -0
- data/lib/ytljit/vm.rb +272 -80
- data/lib/ytljit/vm_codegen.rb +26 -10
- data/lib/ytljit/vm_cruby_obj.rb +49 -7
- data/lib/ytljit/vm_inline_method.rb +50 -18
- data/lib/ytljit/vm_sendnode.rb +317 -86
- data/lib/ytljit/vm_trans.rb +40 -3
- data/lib/ytljit/vm_type_gen.rb +16 -6
- data/lib/ytljit/vm_typeinf.rb +10 -2
- data/lib/ytljit.rb +3 -3
- data/test/test_assemble2.rb +28 -0
- metadata +3 -3
data/ext/memory.c
CHANGED
@@ -10,8 +10,8 @@ VALUE ytl_cArena;
|
|
10
10
|
void
|
11
11
|
ytl_arena_mark(struct ArenaHeader *arenah)
|
12
12
|
{
|
13
|
-
VALUE *base;
|
14
13
|
VALUE *start;
|
14
|
+
VALUE *end;
|
15
15
|
struct ArenaBody *bodyptr;
|
16
16
|
struct ArenaBody *next_bodyptr;
|
17
17
|
struct ArenaBody *lastbodyptr;
|
@@ -36,8 +36,8 @@ ytl_arena_mark(struct ArenaHeader *arenah)
|
|
36
36
|
continue;
|
37
37
|
}
|
38
38
|
|
39
|
-
|
40
|
-
for (bodyeleptr = start; bodyeleptr
|
39
|
+
end = bodyptr->body + (bodyptr->size / sizeof(VALUE));
|
40
|
+
for (bodyeleptr = start; bodyeleptr <= end; bodyeleptr++) {
|
41
41
|
rb_gc_mark_maybe(*bodyeleptr);
|
42
42
|
}
|
43
43
|
next_bodyptr = bodyptr->next;
|
@@ -158,7 +158,7 @@ ytl_arena_ref(VALUE self, VALUE offset)
|
|
158
158
|
int raw_offset;
|
159
159
|
|
160
160
|
Data_Get_Struct(self, struct ArenaHeader, arenah);
|
161
|
-
raw_offset = FIX2INT(offset);
|
161
|
+
raw_offset = (arenah->body->size / sizeof(VALUE)) - FIX2INT(offset);
|
162
162
|
|
163
163
|
return ULONG2NUM(arenah->body->body[raw_offset]);
|
164
164
|
}
|
@@ -169,11 +169,17 @@ ytl_arena_emit(VALUE self, VALUE offset, VALUE src)
|
|
169
169
|
struct ArenaHeader *arenah;
|
170
170
|
|
171
171
|
int raw_offset;
|
172
|
+
int newsize;
|
173
|
+
VALUE *newlastptr;
|
172
174
|
|
173
175
|
Data_Get_Struct(self, struct ArenaHeader, arenah);
|
174
|
-
raw_offset = NUM2ULONG(offset);
|
176
|
+
raw_offset = (arenah->body->size / sizeof(VALUE)) - NUM2ULONG(offset);
|
175
177
|
|
176
178
|
arenah->body->body[raw_offset] = FIX2INT(src);
|
179
|
+
newlastptr = arenah->body->body + raw_offset;
|
180
|
+
if (newlastptr < arenah->lastptr) {
|
181
|
+
arenah->lastptr = newlastptr;
|
182
|
+
}
|
177
183
|
|
178
184
|
return src;
|
179
185
|
}
|
data/ext/ytljit.c
CHANGED
@@ -424,6 +424,43 @@ body(uintptr_t *regbuf)
|
|
424
424
|
rb_funcall2(ytl_eStepHandler, ytl_v_step_handler_id, NUMREGS + 1, argv);
|
425
425
|
}
|
426
426
|
|
427
|
+
void
|
428
|
+
ytl_backtrace(VALUE rip,
|
429
|
+
VALUE rax, VALUE rcx, VALUE rdx, VALUE rbx,
|
430
|
+
VALUE rbp, VALUE rsp, VALUE rdi, VALUE rsi,
|
431
|
+
VALUE r8, VALUE r9, VALUE r10, VALUE r11,
|
432
|
+
VALUE r12, VALUE r13, VALUE r14, VALUE r15)
|
433
|
+
{
|
434
|
+
VALUE *argv;
|
435
|
+
uintptr_t sp;
|
436
|
+
int i;
|
437
|
+
|
438
|
+
argv = ALLOCA_N(VALUE, NUMREGS + 1);
|
439
|
+
|
440
|
+
argv[0] = ULONG2NUM(rax);
|
441
|
+
argv[1] = ULONG2NUM(rip);
|
442
|
+
argv[2] = ULONG2NUM(rcx);
|
443
|
+
argv[3] = ULONG2NUM(rdx);
|
444
|
+
argv[4] = ULONG2NUM(rbx);
|
445
|
+
argv[5] = ULONG2NUM(rbp);
|
446
|
+
argv[6] = ULONG2NUM(rdi);
|
447
|
+
argv[7] = ULONG2NUM(rsi);
|
448
|
+
argv[8] = ULONG2NUM(r8);
|
449
|
+
argv[9] = ULONG2NUM(r9);
|
450
|
+
argv[10] = ULONG2NUM(r10);
|
451
|
+
argv[11] = ULONG2NUM(r11);
|
452
|
+
argv[12] = ULONG2NUM(r12);
|
453
|
+
argv[13] = ULONG2NUM(r13);
|
454
|
+
argv[14] = ULONG2NUM(r14);
|
455
|
+
argv[15] = ULONG2NUM(r15);
|
456
|
+
sp = (uintptr_t)rsp;
|
457
|
+
sp += NUMREGS * sizeof(uintptr_t); /* reg save area */
|
458
|
+
sp += sizeof(uintptr_t); /* stored pc by call instruction */
|
459
|
+
argv[NUMREGS] = ULONG2NUM(sp);
|
460
|
+
|
461
|
+
rb_funcall2(ytl_eStepHandler, ytl_v_step_handler_id, NUMREGS + 1, argv);
|
462
|
+
}
|
463
|
+
|
427
464
|
static uintptr_t * __attribute__ ((noinline, optimize("omit-frame-pointer")))
|
428
465
|
pushall(void)
|
429
466
|
{
|
data/lib/ytljit/codespace.rb
CHANGED
@@ -76,7 +76,12 @@ module YTLJit
|
|
76
76
|
File.popen(objdump_cmd, "r") {|fp|
|
77
77
|
fp.readlines.each do |lin|
|
78
78
|
if /([0-9a-f]*):(\t[0-9a-f ]+? *\t.*)/ =~ lin then
|
79
|
-
|
79
|
+
src = $2
|
80
|
+
addr = $1
|
81
|
+
$symbol_table.each do |val, sym|
|
82
|
+
src.gsub!(val.to_s(16), "#{sym} (#{val})")
|
83
|
+
end
|
84
|
+
@@disasm_cache[addr] = src
|
80
85
|
end
|
81
86
|
end
|
82
87
|
}
|
@@ -797,6 +797,23 @@ module YTLJit
|
|
797
797
|
return nosupported_addressing_mode(inst, dst, src)
|
798
798
|
end
|
799
799
|
end
|
800
|
+
|
801
|
+
def common_cvt2(dst, src, op0, op1, inst)
|
802
|
+
if (src.is_a?(OpRegXMM) or
|
803
|
+
src.is_a?(OpIndirect)) and
|
804
|
+
(dst.is_a?(OpReg32) or
|
805
|
+
dst.is_a?(OpReg64)) then
|
806
|
+
rexseq, rexfmt = rex(dst, src)
|
807
|
+
modseq, modfmt = modrm(inst, dst, src, dst, src)
|
808
|
+
if op0 then
|
809
|
+
([op0] + rexseq + [0x0F, op1] + modseq).pack("C#{rexfmt}C2#{modfmt}")
|
810
|
+
else
|
811
|
+
(rexseq + [0x0F, op1] + modseq).pack("#{rexfmt}C2#{modfmt}")
|
812
|
+
end
|
813
|
+
else
|
814
|
+
return nosupported_addressing_mode(inst, dst, src)
|
815
|
+
end
|
816
|
+
end
|
800
817
|
end
|
801
818
|
|
802
819
|
class GeneratorIABinary<Generator
|
@@ -1392,6 +1409,22 @@ module YTLJit
|
|
1392
1409
|
common_cvt(dst, src, 0xf3, 0x2a, :cvtsi2ss)
|
1393
1410
|
end
|
1394
1411
|
|
1412
|
+
def cvtsd2si(dst, src)
|
1413
|
+
common_cvt2(dst, src, 0xf2, 0x2d, :cvtsd2si)
|
1414
|
+
end
|
1415
|
+
|
1416
|
+
def cvttsd2si(dst, src)
|
1417
|
+
common_cvt2(dst, src, 0xf2, 0x2c, :cvttsd2si)
|
1418
|
+
end
|
1419
|
+
|
1420
|
+
def cvtss2si(dst, src)
|
1421
|
+
common_cvt2(dst, src, 0xf3, 0x2d, :cvtss2si)
|
1422
|
+
end
|
1423
|
+
|
1424
|
+
def cvttss2si(dst, src)
|
1425
|
+
common_cvt2(dst, src, 0xf3, 0x2c, :cvttss2si)
|
1426
|
+
end
|
1427
|
+
|
1395
1428
|
def int3
|
1396
1429
|
[0xcc].pack("C")
|
1397
1430
|
end
|