ytljit 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/ext/code_alloc.c CHANGED
@@ -4,6 +4,7 @@
4
4
  #include <sys/mman.h>
5
5
  #include <stdlib.h>
6
6
  #include "ruby.h"
7
+ #include "ytljit.h"
7
8
 
8
9
 
9
10
  /* CodeSpaceArena is memory area for allocate codespace
@@ -34,11 +35,10 @@ typedef struct {
34
35
  uint64_t bitmap[1];
35
36
  } CodeSpaceArena;
36
37
 
37
- #define ARENA_SIZE 16 * 1024
38
38
 
39
39
  /* 2 * 64 means header and gatekeeper */
40
40
  #define BITMAP_SIZE(ALOCSIZ) \
41
- (((ARENA_SIZE) * 8 - 2 * 64) / ((ALOCSIZ) * 8 + 1))
41
+ (((CODE_SPACE_SIZE) * 8 - 2 * 64) / ((ALOCSIZ) * 8 + 1))
42
42
 
43
43
  /* Last "+ 1" means gatekeeper */
44
44
  #define HEADER_SIZE(ALOCSIZ) \
@@ -64,31 +64,40 @@ static CodeSpaceArena *arena_search_tab[ALOCSIZLOG_MAX];
64
64
 
65
65
  static size_t page_size;
66
66
 
67
- CodeSpaceArena *
68
- alloc_arena(size_t aloclogsiz, CodeSpaceArena *prev_csa)
67
+ static CodeSpaceArena *
68
+ raw_alloc_arena(size_t size)
69
69
  {
70
- uint64_t rbitmap;
71
70
  CodeSpaceArena *arena;
72
71
  void *newmem;
73
- int allocsiz;
74
- int bitmap_size;
75
- int allff_size;
76
- int rest_size;
77
-
72
+
78
73
  #if !defined(__CYGWIN__)
79
- if (posix_memalign(&newmem, ARENA_SIZE, ARENA_SIZE)) {
74
+ if (posix_memalign(&newmem, CODE_SPACE_SIZE, size)) {
80
75
  rb_raise(rb_eNoMemError, "Can't allocate code space area");
81
76
  }
82
- if(mprotect(newmem, ARENA_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC)) {
77
+ if(mprotect(newmem, CODE_SPACE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC)) {
83
78
  rb_raise(rb_eNoMemError, "mprotect failed");
84
79
  }
85
80
  arena = (CodeSpaceArena *)newmem;
86
81
  #else
87
- if (!(arena = memalign(ARENA_SIZE, ARENA_SIZE))) {
82
+ if (!(arena = memalign(CODE_SPACE_SIZE, size))) {
88
83
  rb_raise(rb_eNoMemError, "Can't allocate code space area");
89
84
  }
90
85
  #endif
86
+
87
+ return arena;
88
+ }
89
+
90
+ static CodeSpaceArena *
91
+ alloc_arena(size_t aloclogsiz, CodeSpaceArena *prev_csa)
92
+ {
93
+ uint64_t rbitmap;
94
+ CodeSpaceArena *arena;
95
+ int allocsiz;
96
+ int bitmap_size;
97
+ int allff_size;
98
+ int rest_size;
91
99
 
100
+ arena = raw_alloc_arena(CODE_SPACE_SIZE);
92
101
  arena->next_and_size = ((uintptr_t)prev_csa) | aloclogsiz;
93
102
 
94
103
  /* fill bitmap: 1 means free */
@@ -202,8 +211,15 @@ csalloc(int size)
202
211
  void *res;
203
212
 
204
213
  logsize = bytes_to_bucket(size);
205
- res = search_free_chunk(arena_search_tab[logsize]);
206
- // fprintf(stderr, "%x \n", res);
214
+ if (logsize < 10) {
215
+ /* Small code space (less than 8192 bytes) */
216
+ res = search_free_chunk(arena_search_tab[logsize]);
217
+ }
218
+ else {
219
+ res = raw_alloc_arena(16 << logsize);
220
+ ((struct CodeSpace *)res)->next_and_size = 0xf;
221
+ }
222
+
207
223
  return res;
208
224
  }
209
225
 
@@ -219,8 +235,14 @@ csfree(void *chunk)
219
235
  int logsize;
220
236
  int alocsize;
221
237
 
222
- arena = (CodeSpaceArena *)(((uintptr_t)chunk) & (~(ARENA_SIZE - 1)));
238
+ arena = (CodeSpaceArena *)(((uintptr_t)chunk) & (~(CODE_SPACE_SIZE - 1)));
223
239
  logsize = arena->next_and_size & 0xf;
240
+ if (logsize == 0xf) {
241
+ /* Large area */
242
+ free(arena);
243
+ return;
244
+ }
245
+
224
246
  alocsize = 16 << logsize;
225
247
 
226
248
  alocoff = csarena_allocarea_tab[logsize];
@@ -262,7 +284,7 @@ init_csarena()
262
284
  #endif
263
285
 
264
286
  /* Check page_size is valid */
265
- if ((ARENA_SIZE / page_size) * page_size != ARENA_SIZE) {
287
+ if ((CODE_SPACE_SIZE / page_size) * page_size != CODE_SPACE_SIZE) {
266
288
  rb_raise(rb_eNoMemError, "Not support this architecture");
267
289
  }
268
290
 
data/ext/memory.c CHANGED
@@ -7,40 +7,173 @@
7
7
  VALUE ytl_mRuntime;
8
8
  VALUE ytl_cArena;
9
9
 
10
+ void
11
+ ytl_arena_mark(struct ArenaHeader *arenah)
12
+ {
13
+ VALUE *base;
14
+ VALUE *start;
15
+ struct ArenaBody *bodyptr;
16
+ struct ArenaBody *next_bodyptr;
17
+ struct ArenaBody *lastbodyptr;
18
+ VALUE *bodyeleptr;
19
+ int appear;
20
+
21
+ lastbodyptr = (struct ArenaBody *)(((uintptr_t)arenah->lastptr) & (~(ARENA_SIZE - 1)));
22
+ appear = 0;
23
+
24
+ for (bodyptr = arenah->body; bodyptr; bodyptr = next_bodyptr) {
25
+ if (bodyptr == lastbodyptr) {
26
+ start = arenah->lastptr;
27
+ appear = 1;
28
+ }
29
+ else if (appear) {
30
+ start = bodyptr->body;
31
+ }
32
+ else {
33
+ next_bodyptr = bodyptr->next;
34
+ arenah->body = next_bodyptr;
35
+ free(bodyptr);
36
+ continue;
37
+ }
38
+
39
+ base = bodyptr->body + (bodyptr->size / sizeof(VALUE));
40
+ for (bodyeleptr = start; bodyeleptr < base; bodyeleptr++) {
41
+ rb_gc_mark_maybe(*bodyeleptr);
42
+ }
43
+ next_bodyptr = bodyptr->next;
44
+ }
45
+ }
46
+
47
+ void
48
+ ytl_arena_free(struct ArenaHeader *arenah)
49
+ {
50
+ VALUE *base;
51
+ VALUE *start;
52
+ struct ArenaBody *curptr;
53
+ struct ArenaBody *curptr_next;
54
+
55
+ for (curptr = arenah->body; curptr; curptr = curptr_next) {
56
+ curptr_next = curptr->next;
57
+ free(curptr);
58
+ }
59
+
60
+ free(arenah);
61
+ }
62
+
63
+ #define DO_RETRY \
64
+ do { \
65
+ if (retry_mode) { \
66
+ rb_raise(rb_eNoMemError, "Can't allocate arena area"); \
67
+ } \
68
+ else { \
69
+ retry_mode = 1; \
70
+ rb_gc(); \
71
+ goto retry; \
72
+ } \
73
+ } while(0)
74
+
75
+
76
+ struct ArenaBody *
77
+ ytl_arena_allocate_body()
78
+ {
79
+ void *newmem;
80
+ struct ArenaBody *abody;
81
+ int retry_mode = 0;
82
+
83
+ retry:
84
+
85
+ #if !defined(__CYGWIN__)
86
+ if (posix_memalign(&newmem, ARENA_SIZE, ARENA_SIZE)) {
87
+ DO_RETRY;
88
+ }
89
+ abody = (struct ArenaBody *)newmem;
90
+ #else
91
+ if (!(abody = memalign(ARENA_SIZE, ARENA_SIZE))) {
92
+ DO_RETRY;
93
+ }
94
+ #endif
95
+
96
+ abody->size = ARENA_SIZE - sizeof(struct ArenaBody);
97
+ abody->next = 0;
98
+ return abody;
99
+ }
100
+
10
101
  VALUE
11
102
  ytl_arena_allocate(VALUE klass)
12
103
  {
13
- struct Arena *arena;
104
+ struct ArenaHeader *arenah;
105
+ struct ArenaBody *arenab;
14
106
 
15
- arena = malloc(ARENA_SIZE);
16
- arena->size = ARENA_SIZE - sizeof(struct Arena);
107
+ arenah = malloc(sizeof(struct ArenaHeader));
108
+ arenah->body = ytl_arena_allocate_body();
109
+ arenab = arenah->body;
110
+ arenab->header = arenah;
111
+ arenah->lastptr = arenab->body + (arenab->size / sizeof(VALUE));
17
112
 
18
- return Data_Wrap_Struct(klass, NULL, free, (void *)arena);
113
+ return Data_Wrap_Struct(klass, ytl_arena_mark, ytl_arena_free,
114
+ (void *)arenah);
115
+ }
116
+
117
+ char *
118
+ ytl_arena_alloca(char *stptr, int size)
119
+ {
120
+ uintptr_t lsp;
121
+ struct ArenaHeader *arenah;
122
+ struct ArenaBody *oldbody;
123
+ struct ArenaBody *bodyptr;
124
+ struct ArenaBody *next_bodyptr;
125
+
126
+ lsp = (uintptr_t)stptr;
127
+ oldbody = (struct ArenaBody *)(lsp & (~(ARENA_SIZE -1)));
128
+ arenah = oldbody->header;
129
+ size = size * 8;
130
+
131
+ for (bodyptr = arenah->body; bodyptr != oldbody; bodyptr = next_bodyptr) {
132
+ next_bodyptr = bodyptr->next;
133
+ arenah->body = next_bodyptr;
134
+ free(bodyptr);
135
+ }
136
+
137
+ if ((lsp & (ARENA_SIZE - 1)) < ((lsp - size - 64) & (ARENA_SIZE - 1))) {
138
+ struct ArenaBody *arenab;
139
+
140
+ arenah->lastptr = (void *)stptr;
141
+ arenab = arenah->body = ytl_arena_allocate_body();
142
+ if (arenab != oldbody) {
143
+ arenab->next = oldbody;
144
+ }
145
+ arenab->header = arenah;
146
+ arenah->lastptr = arenab->body + (arenab->size / sizeof(VALUE));
147
+ stptr = (char *)arenah->lastptr;
148
+ }
149
+ stptr -= size;
150
+
151
+ return stptr;
19
152
  }
20
153
 
21
154
  VALUE
22
155
  ytl_arena_ref(VALUE self, VALUE offset)
23
156
  {
24
- struct Arena *raw_arena;
157
+ struct ArenaHeader *arenah;
25
158
  int raw_offset;
26
159
 
27
- raw_arena = (struct Arena *)DATA_PTR(self);
160
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
28
161
  raw_offset = FIX2INT(offset);
29
162
 
30
- return ULONG2NUM(raw_arena->body[raw_offset]);
163
+ return ULONG2NUM(arenah->body->body[raw_offset]);
31
164
  }
32
165
 
33
166
  VALUE
34
167
  ytl_arena_emit(VALUE self, VALUE offset, VALUE src)
35
168
  {
36
- struct Arena *raw_arena;
169
+ struct ArenaHeader *arenah;
37
170
 
38
171
  int raw_offset;
39
172
 
40
- raw_arena = (struct Arena *)DATA_PTR(self);
173
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
41
174
  raw_offset = NUM2ULONG(offset);
42
175
 
43
- raw_arena->body[raw_offset] = FIX2INT(src);
176
+ arenah->body->body[raw_offset] = FIX2INT(src);
44
177
 
45
178
  return src;
46
179
  }
@@ -48,35 +181,50 @@ ytl_arena_emit(VALUE self, VALUE offset, VALUE src)
48
181
  VALUE
49
182
  ytl_arena_size(VALUE self)
50
183
  {
51
- struct Arena *raw_arena;
184
+ struct ArenaHeader *arenah;
185
+ struct ArenaBody *arenab;
52
186
 
53
- int raw_offset;
187
+ int totsize;
54
188
 
55
- raw_arena = (struct Arena *)DATA_PTR(self);
189
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
190
+ totsize = 0;
191
+ for (arenab = arenah->body; arenab; arenab = arenab->next) {
192
+ totsize += arenab->size;
193
+ }
56
194
 
57
- return INT2FIX(raw_arena->size);
195
+ return INT2FIX(totsize);
58
196
  }
59
197
 
60
198
  VALUE
61
199
  ytl_arena_address(VALUE self)
62
200
  {
63
- struct Arena *raw_arena;
201
+ struct ArenaHeader *arenah;
64
202
 
65
- raw_arena = (struct Arena *)DATA_PTR(self);
203
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
66
204
 
67
- return ULONG2NUM((uintptr_t)raw_arena->body);
205
+ return ULONG2NUM((uintptr_t)arenah->body->body);
68
206
  }
69
207
 
208
+ VALUE
209
+ ytl_arena_raw_address(VALUE self)
210
+ {
211
+ struct ArenaHeader *arenah;
212
+
213
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
214
+
215
+ return ULONG2NUM((uintptr_t)arenah);
216
+ }
70
217
 
71
218
  VALUE
72
219
  ytl_arena_to_s(VALUE self)
73
220
  {
74
- struct Arena *raw_arena;
221
+ struct ArenaHeader *arenah;
75
222
 
76
- raw_arena = (struct Arena *)DATA_PTR(self);
223
+ Data_Get_Struct(self, struct ArenaHeader, arenah);
77
224
 
78
- return rb_sprintf("#<Arena %p size=%d body=%p>",
225
+ return rb_sprintf("#<Arena %p size=%d body=%p last=%p>",
79
226
  (void *)self,
80
- raw_arena->size,
81
- (void *)raw_arena->body);
227
+ ytl_arena_size(self) / 2,
228
+ (void *)arenah->body->body,
229
+ (void *)arenah->lastptr);
82
230
  }
data/ext/ytljit.c CHANGED
@@ -262,7 +262,7 @@ ytl_code_space_emit(VALUE self, VALUE offset, VALUE src)
262
262
  void *new_cs = csalloc(newsize);
263
263
 
264
264
  //*(struct CodeSpace *)new_cs = *(struct CodeSpace *)raw_cs;
265
- memcpy(new_cs, raw_cs, newsize / 2);
265
+ //memcpy(new_cs, raw_cs, newsize / 2);
266
266
  csfree(raw_cs);
267
267
  raw_cs = new_cs;
268
268
  raw_cs->size = newsize - sizeof(struct CodeSpace);
@@ -524,6 +524,60 @@ ytl_step_handler()
524
524
  #endif
525
525
  }
526
526
 
527
+ VALUE
528
+ ytl_ivar_get_boxing(VALUE slf, int off)
529
+ {
530
+ VALUE *ivptr;
531
+ VALUE rval;
532
+
533
+ ivptr = ROBJECT_IVPTR(slf);
534
+ rval = ivptr[off];
535
+ if (rval != Qundef) {
536
+ return rval;
537
+ }
538
+ else {
539
+ return Qnil;
540
+ }
541
+ }
542
+
543
+ VALUE
544
+ ytl_ivar_set_boxing(VALUE slf, int off, VALUE val)
545
+ {
546
+ int len;
547
+ int i;
548
+
549
+ /* Copy from variable.c in ruby1.9 */
550
+ len = ROBJECT_NUMIV(slf);
551
+ if (len <= off) {
552
+ VALUE *ptr = ROBJECT_IVPTR(slf);
553
+ if (off < ROBJECT_EMBED_LEN_MAX) {
554
+ RBASIC(slf)->flags |= ROBJECT_EMBED;
555
+ ptr = ROBJECT(slf)->as.ary;
556
+ for (i = 0; i < ROBJECT_EMBED_LEN_MAX; i++) {
557
+ ptr[i] = Qundef;
558
+ }
559
+ }
560
+ else {
561
+ VALUE *newptr;
562
+ long newsize = (off+1) + (off+1)/4; /* (index+1)*1.25 */
563
+ if (RBASIC(slf)->flags & ROBJECT_EMBED) {
564
+ newptr = ALLOC_N(VALUE, newsize);
565
+ MEMCPY(newptr, ptr, VALUE, len);
566
+ RBASIC(slf)->flags &= ~ROBJECT_EMBED;
567
+ ROBJECT(slf)->as.heap.ivptr = newptr;
568
+ }
569
+ else {
570
+ REALLOC_N(ROBJECT(slf)->as.heap.ivptr, VALUE, newsize);
571
+ newptr = ROBJECT(slf)->as.heap.ivptr;
572
+ }
573
+ for (; len < newsize; len++)
574
+ newptr[len] = Qundef;
575
+ ROBJECT(slf)->as.heap.numiv = newsize;
576
+ }
577
+ }
578
+ ROBJECT_IVPTR(slf)[off] = val;
579
+ }
580
+
527
581
  void
528
582
  Init_ytljit_ext()
529
583
  {
@@ -575,7 +629,8 @@ Init_ytljit_ext()
575
629
  rb_define_method(ytl_cArena, "[]=", ytl_arena_emit, 2);
576
630
  rb_define_method(ytl_cArena, "[]", ytl_arena_ref, 1);
577
631
  rb_define_method(ytl_cArena, "size", ytl_arena_size, 0);
578
- rb_define_method(ytl_cArena, "address", ytl_arena_address, 0);
632
+ rb_define_method(ytl_cArena, "body_address", ytl_arena_address, 0);
633
+ rb_define_method(ytl_cArena, "raw_address", ytl_arena_raw_address, 0);
579
634
  rb_define_method(ytl_cArena, "to_s", ytl_arena_to_s, 0);
580
635
 
581
636
  /* Open Handles */
data/ext/ytljit.h CHANGED
@@ -2,7 +2,8 @@
2
2
  #define INIT_CODE_SPACE_SIZE 64
3
3
  #define VALUE_SPACE_SIZE (8 * 1024)
4
4
 
5
- #define ARENA_SIZE 256 * 1024 /* 256 Kbytes */
5
+ #define CODE_SPACE_SIZE (16 * 1024) /* 16 Kbytes */
6
+ #define ARENA_SIZE (256 * 1024) /* 256 Kbytes */
6
7
 
7
8
  #define OPEN_CHECK(COND) \
8
9
  do { \
@@ -12,13 +13,21 @@ do { \
12
13
  } while(0)
13
14
 
14
15
  struct CodeSpace {
16
+ uintptr_t next_and_size;
15
17
  size_t size;
16
18
  size_t used;
17
19
  char body[1];
18
20
  };
19
21
 
20
- struct Arena {
22
+ struct ArenaHeader {
23
+ VALUE *lastptr;
24
+ struct ArenaBody *body;
25
+ };
26
+
27
+ struct ArenaBody {
21
28
  size_t size;
29
+ struct ArenaBody *next;
30
+ struct ArenaHeader *header;
22
31
  VALUE body[1];
23
32
  };
24
33
 
@@ -27,13 +36,17 @@ VALUE ytl_code_space_allocate(VALUE);
27
36
  VALUE ytl_code_value_allocate(VALUE);
28
37
 
29
38
  VALUE ytl_arena_allocate(VALUE);
39
+ char *ytl_arena_alloca(char *, int);
30
40
  VALUE ytl_arena_emit(VALUE, VALUE, VALUE);
31
41
  VALUE ytl_arena_ref(VALUE, VALUE);
32
42
  VALUE ytl_arena_size(VALUE);
43
+ VALUE ytl_arena_raw_address(VALUE);
33
44
  VALUE ytl_arena_address(VALUE);
34
45
  VALUE ytl_arena_to_s(VALUE);
35
46
 
36
47
  void ytl_step_handler(void);
48
+ VALUE ytl_ivar_get_boxing(VALUE, int);
49
+ VALUE ytl_ivar_set_boxing(VALUE, int, VALUE);
37
50
 
38
51
  void init_csarena();
39
52
  void *csalloc(int);
data/lib/ytljit/asm.rb CHANGED
@@ -182,12 +182,33 @@ module YTLJit
182
182
  unless off = @@value_table_cache[val] then
183
183
  off = @@value_table_entity.current_pos
184
184
  @@value_table_entity.emit([val.value].pack("Q"))
185
+ stfunc = lambda {
186
+ oldpos = @@value_table_entity.current_pos
187
+ @@value_table_entity.current_pos = off
188
+ @@value_table_entity.emit([val.value].pack("Q"))
189
+ @@value_table_entity.current_pos = oldpos
190
+ }
191
+ val.add_refer(stfunc)
185
192
  @@value_table_cache[val] = off
186
193
  end
187
194
 
188
195
  @@value_table_entity.var_base_address(off)
189
196
  end
190
197
 
198
+ def add_value_entry_no_cache(val)
199
+ off = @@value_table_entity.current_pos
200
+ @@value_table_entity.emit([val.value].pack("Q"))
201
+ stfunc = lambda {
202
+ oldpos = @@value_table_entity.current_pos
203
+ @@value_table_entity.current_pos = off
204
+ @@value_table_entity.emit([val.value].pack("Q"))
205
+ @@value_table_entity.current_pos = oldpos
206
+ }
207
+ val.add_refer(stfunc)
208
+
209
+ @@value_table_entity.var_base_address(off)
210
+ end
211
+
191
212
  def add_var_value_retry_func(mn, args)
192
213
  if args.any? {|e| e.is_a?(OpVarValueMixin) } and
193
214
  @retry_mode == false then
@@ -171,7 +171,7 @@ module YTLJit
171
171
  orgaddress = @asm.current_address
172
172
  code = ""
173
173
  # code += @asm.update_state(mov(RAX, OpImmidiate32.new(argnum)))
174
- code += @asm.update_state(mov(RAX, OpImmidiate32.new(0)))
174
+ # code += @asm.update_state(mov(RAX, OpImmidiate32.new(0)))
175
175
  code += @asm.update_state(call(addr))
176
176
  callpos = @asm.current_address - @asm.output_stream.base_address
177
177
  if @asm.retry_mode == :change_op then
@@ -170,6 +170,7 @@ module YTLJit
170
170
  )
171
171
 
172
172
  Arena = AsmType::Struct.new(
173
+ AsmType::MACHINE_WORD, :used,
173
174
  AsmType::MACHINE_WORD, :size,
174
175
  AsmType::Array.new(AsmType::INT8, 0), :body
175
176
  )
@@ -36,9 +36,11 @@ module YTLJit
36
36
  end
37
37
 
38
38
  module OpVarValueMixin
39
+ @@instances = []
39
40
  def initialize(var)
40
41
  @var = var
41
42
  @refer = []
43
+ @@instances.push self
42
44
  end
43
45
 
44
46
  def refer
@@ -56,6 +58,10 @@ module YTLJit
56
58
  def to_immidiate(klass = OpVarImmidiateAddress)
57
59
  klass.new(@var)
58
60
  end
61
+
62
+ def self.instances
63
+ @@instances
64
+ end
59
65
  end
60
66
 
61
67
  class OpVarImmidiate32<OpImmidiate32
@@ -780,6 +780,23 @@ module YTLJit
780
780
  return nosupported_addressing_mode(inst, dst, src)
781
781
  end
782
782
  end
783
+
784
+ def common_cvt(dst, src, op0, op1, inst)
785
+ if dst.is_a?(OpRegXMM) and
786
+ (src.is_a?(OpIndirect) or
787
+ src.is_a?(OpReg32) or
788
+ src.is_a?(OpReg64)) then
789
+ rexseq, rexfmt = rex(dst, src)
790
+ modseq, modfmt = modrm(inst, dst, src, dst, src)
791
+ if op0 then
792
+ ([op0] + rexseq + [0x0F, op1] + modseq).pack("C#{rexfmt}C2#{modfmt}")
793
+ else
794
+ (rexseq + [0x0F, op1] + modseq).pack("#{rexfmt}C2#{modfmt}")
795
+ end
796
+ else
797
+ return nosupported_addressing_mode(inst, dst, src)
798
+ end
799
+ end
783
800
  end
784
801
 
785
802
  class GeneratorIABinary<Generator
@@ -1138,7 +1155,7 @@ module YTLJit
1138
1155
  case addr2
1139
1156
  when Integer
1140
1157
  offset = addr2 - @asm.current_address - 2
1141
- if offset > -128 and offset < 127 then
1158
+ if offset > -128 and offset < 127 and false then
1142
1159
  [0xeb, offset].pack("C2")
1143
1160
  else
1144
1161
  offset = addr2 - @asm.current_address - 5
@@ -1223,7 +1240,7 @@ module YTLJit
1223
1240
  case src
1224
1241
  when nil
1225
1242
  modseq, modfmt = modrm(:imul, 5, dst, dst, src)
1226
- return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#(modfmt}")
1243
+ return (rexseq + [0xF7] + modseq).pack("#{rexfmt}C#{modfmt}")
1227
1244
 
1228
1245
  when OpReg32, OpMem32, OpIndirect, OpReg64
1229
1246
  modseq, modfmt = modrm(:imul, dst, src, dst, src, src2)
@@ -1367,8 +1384,20 @@ module YTLJit
1367
1384
  common_arithxmm(dst, src, 0x66, 0x2F, :comisd)
1368
1385
  end
1369
1386
 
1387
+ def cvtsi2sd(dst, src)
1388
+ common_cvt(dst, src, 0xf2, 0x2a, :cvtsi2sd)
1389
+ end
1390
+
1391
+ def cvtsi2ss(dst, src)
1392
+ common_cvt(dst, src, 0xf3, 0x2a, :cvtsi2ss)
1393
+ end
1394
+
1370
1395
  def int3
1371
1396
  [0xcc].pack("C")
1372
1397
  end
1398
+
1399
+ def ud2
1400
+ [0x0f, 0x0b].pack("CC")
1401
+ end
1373
1402
  end
1374
1403
  end
data/lib/ytljit/util.rb CHANGED
@@ -55,9 +55,6 @@ module YTLJit
55
55
  @@instance_tab = {}
56
56
 
57
57
  def self.instance(clsobj)
58
- if clsobj.is_a?(ClassClassWrapper)
59
- clsobj = clsobj.value
60
- end
61
58
  ins = @@instance_tab[clsobj]
62
59
  if ins == nil then
63
60
  ins = ClassClassWrapper.new(clsobj)
@@ -67,6 +64,10 @@ module YTLJit
67
64
  ins
68
65
  end
69
66
 
67
+ def self.instance_tab
68
+ @@instance_tab
69
+ end
70
+
70
71
  def initialize(clsobj)
71
72
  @klass_object = clsobj
72
73
  @value = nil
@@ -98,7 +99,7 @@ module YTLJit
98
99
  end
99
100
 
100
101
  def marshal_load(obj)
101
- @klass_object = obj
102
+ @klass_object = obj[0]
102
103
  @value = nil
103
104
  end
104
105