ytljit 0.0.5 → 0.0.6

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.
@@ -47,11 +47,16 @@ module YTLJit
47
47
 
48
48
  @@current_node = nil
49
49
  @@special_node_tab = {}
50
+ @@macro_tab = {}
50
51
 
51
52
  def self.node
52
53
  @@current_node
53
54
  end
54
55
 
56
+ def self.get_macro_tab
57
+ @@macro_tab
58
+ end
59
+
55
60
  def self.add_special_send_node(name)
56
61
  oldcls = @@special_node_tab[name]
57
62
  if oldcls == nil or self < oldcls then
@@ -63,6 +68,15 @@ module YTLJit
63
68
  end
64
69
 
65
70
  def self.make_send_node(parent, func, arguments, op_flag, seqno)
71
+ if mproc = @@macro_tab[func.name] then
72
+ args = []
73
+ arguments[3..-1].each do |ele|
74
+ args.push eval(ele.to_ruby(ToRubyContext.new).ret_code.last)
75
+ end
76
+ res = mproc.call(*args)
77
+ return res
78
+ end
79
+
66
80
  spcl = @@special_node_tab[func.name]
67
81
  newobj = nil
68
82
  if spcl then
@@ -84,7 +98,6 @@ module YTLJit
84
98
  @arguments = arguments
85
99
  @opt_flag = op_flag
86
100
  @seq_no = seqno
87
- @var_return_address = nil
88
101
  @next_node = @@current_node
89
102
  @@current_node = self
90
103
 
@@ -101,7 +114,6 @@ module YTLJit
101
114
  attr_accessor :func
102
115
  attr_accessor :arguments
103
116
  attr :opt_flag
104
- attr :var_return_address
105
117
  attr :next_node
106
118
  attr :class_top
107
119
  attr :frame_info
@@ -271,7 +283,7 @@ module YTLJit
271
283
  context = super(context)
272
284
 
273
285
  context.start_using_reg(TMPR2)
274
- context.start_using_reg(TMPR3)
286
+ context.start_using_reg(PTMPR)
275
287
  callconv = @func.calling_convention(context)
276
288
 
277
289
  case callconv
@@ -281,8 +293,14 @@ module YTLJit
281
293
  when :c_fixarg
282
294
  context = compile_c_fixarg(context)
283
295
 
296
+ when :c_fixarg_raw
297
+ context = compile_c_fixarg_raw(context)
298
+
284
299
  when :ytl
285
300
  context = compile_ytl(context)
301
+
302
+ else
303
+ raise "Unsupported calling conversion #{callconv}"
286
304
  end
287
305
 
288
306
  decide_type_once(context.to_signature)
@@ -293,7 +311,7 @@ module YTLJit
293
311
  context.ret_reg = RETR
294
312
  end
295
313
  context.ret_node = self
296
- context.end_using_reg(TMPR3)
314
+ context.end_using_reg(PTMPR)
297
315
  context.end_using_reg(TMPR2)
298
316
 
299
317
  context = @body.compile(context)
@@ -382,12 +400,11 @@ module YTLJit
382
400
  # type inference of @new method execute when "send" instruction.
383
401
  context = @arguments[3].collect_candidate_type(context)
384
402
  @arguments[3].decide_type_once(context.to_signature)
385
- rrtype = class << @arguments[3].type.ruby_type; self; end
403
+ rrtype = ClassClassWrapper.instance(@arguments[3].type.ruby_type)
386
404
  clsnode = ClassTopNode.get_class_top_node(rrtype)
387
405
  clsnode.get_method_tab[@new_method.name] = @new_method
388
406
 
389
407
  @body.collect_candidate_type(context)
390
- context
391
408
  end
392
409
 
393
410
  def compile(context)
@@ -397,9 +414,16 @@ module YTLJit
397
414
  context = @new_method.compile(context)
398
415
  context.set_code_space(ocs)
399
416
 
417
+ context.ret_reg = 4 # nil
418
+ context.ret_node = self
419
+
400
420
  context
401
421
  end
402
422
  end
423
+
424
+ class SendEvalNode<SendNode
425
+ add_special_send_node :eval
426
+ end
403
427
 
404
428
  class SendAllocateNode<SendNode
405
429
  add_special_send_node :allocate
@@ -434,7 +458,7 @@ module YTLJit
434
458
 
435
459
  def compile(context)
436
460
  context.start_using_reg(TMPR2)
437
- context.start_using_reg(TMPR3)
461
+ context.start_using_reg(PTMPR)
438
462
  callconv = @func.calling_convention(context)
439
463
 
440
464
  case callconv
@@ -446,11 +470,19 @@ module YTLJit
446
470
 
447
471
  when :ytl
448
472
  context = compile_ytl(context)
473
+
474
+ else
475
+ raise "Unsupported calling conversion #{callconv}"
476
+ end
477
+
478
+ asm = context.assembler
479
+ asm.with_retry do
480
+ asm.mov(RETR, PTMPR)
449
481
  end
450
482
 
451
- context.ret_reg = RETR
483
+ context.ret_reg = RETR
452
484
  context.ret_node = self
453
- context.end_using_reg(TMPR3)
485
+ context.end_using_reg(PTMPR)
454
486
  context.end_using_reg(TMPR2)
455
487
 
456
488
  context = @body.compile(context)
@@ -475,6 +507,13 @@ module YTLJit
475
507
  initfunc.set_reciever(init)
476
508
  alloc.parent = init
477
509
  @initmethod = init
510
+ @allocmethod = alloc
511
+ end
512
+
513
+ def debug_info=(val)
514
+ @initmethod.debug_info = val
515
+ @allocmethod.debug_info = val
516
+ @debug_info = val
478
517
  end
479
518
 
480
519
  def traverse_childlen
@@ -494,19 +533,32 @@ module YTLJit
494
533
  when ConstantRefNode
495
534
  context = @initmethod.collect_candidate_type(context)
496
535
  clstop = slfnode.value_node
536
+ tt = nil
537
+ sig = context.to_signature
497
538
  case clstop
498
539
  when ClassTopNode
499
540
  tt = RubyType::BaseType.from_ruby_class(clstop.klass_object)
500
- add_type(context.to_signature, tt)
541
+ add_type(sig, tt)
501
542
 
502
543
  when LiteralNode
503
544
  tt = RubyType::BaseType.from_ruby_class(clstop.value)
504
- add_type(context.to_signature, tt)
545
+ add_type(sig, tt)
505
546
 
506
547
  else
507
548
  raise "Unkown node type in constant #{slfnode.value_node.class}"
508
549
  end
509
550
 
551
+ # set element type
552
+ if tt.ruby_type == Range then
553
+ tt.args = @arguments[3..-1]
554
+ add_element_node(sig, @arguments[3], [0], context)
555
+ end
556
+
557
+ if tt.ruby_type == Array then
558
+ @arguments[3..-1].each_with_index do |anode, idx|
559
+ add_element_node(sig, anode, [idx - 3], context)
560
+ end
561
+ end
510
562
  else
511
563
  raise "Unkonwn node type #{@arguments[2].class} "
512
564
  end
@@ -519,7 +571,37 @@ module YTLJit
519
571
  rtype = @arguments[2].type
520
572
  rrtype = rtype.ruby_type
521
573
  if rrtype.is_a?(Class) then
522
- context = @initmethod.compile(context)
574
+ if !@is_escape and rrtype.to_s == '#<Class:Range>' then
575
+ context = gen_alloca(context, 3)
576
+ asm = context.assembler
577
+ breg = context.ret_reg
578
+
579
+ off = 0
580
+ [3, 4, 5].each do |no|
581
+ context = @arguments[no].compile(context)
582
+ dst = OpIndirect.new(breg, off)
583
+ asm.with_retry do
584
+ if context.ret_reg.is_a?(OpRegistor) then
585
+ asm.mov(dst, context.ret_reg)
586
+ else
587
+ asm.mov(TMPR, context.ret_reg)
588
+ asm.mov(dst, TMPR)
589
+ end
590
+ end
591
+ off = off + AsmType::MACHINE_WORD.size
592
+ end
593
+
594
+ context.ret_reg = breg
595
+ context.ret_node = self
596
+ context
597
+
598
+ elsif @initmethod.func.calling_convention(context) then
599
+ context = @initmethod.compile(context)
600
+
601
+ else
602
+ # initialize method not defined
603
+ context = @allocmethod.compile(context)
604
+ end
523
605
  @body.compile(context)
524
606
  else
525
607
  super
@@ -536,8 +618,6 @@ module YTLJit
536
618
  case [slf.ruby_type]
537
619
  when [Fixnum], [Float], [String], [Array]
538
620
  cursig = context.to_signature
539
- same_type(@arguments[3], @arguments[2], cursig, cursig, context)
540
- same_type(@arguments[2], @arguments[3], cursig, cursig, context)
541
621
  same_type(self, @arguments[2], cursig, cursig, context)
542
622
  same_type(@arguments[2], self, cursig, cursig, context)
543
623
  end
@@ -577,8 +657,6 @@ module YTLJit
577
657
  case [slf.ruby_type]
578
658
  when [Fixnum], [Float], [Array]
579
659
  cursig = context.to_signature
580
- same_type(@arguments[3], @arguments[2], cursig, cursig, context)
581
- same_type(@arguments[2], @arguments[3], cursig, cursig, context)
582
660
  same_type(self, @arguments[2], cursig, cursig, context)
583
661
  same_type(@arguments[2], self, cursig, cursig, context)
584
662
  end
@@ -600,6 +678,7 @@ module YTLJit
600
678
  elsif rrtype == Float then
601
679
  context = gen_arithmetic_operation(context, :subsd, XMM4, XMM0)
602
680
  else
681
+ p debug_info
603
682
  raise "Unkown method #{rtype.ruby_type}##{@func.name}"
604
683
  end
605
684
 
@@ -616,8 +695,6 @@ module YTLJit
616
695
  cursig = context.to_signature
617
696
  case [slf.ruby_type]
618
697
  when [Fixnum], [Float]
619
- same_type(@arguments[3], @arguments[2], cursig, cursig, context)
620
- same_type(@arguments[2], @arguments[3], cursig, cursig, context)
621
698
  same_type(self, @arguments[2], cursig, cursig, context)
622
699
  same_type(@arguments[2], self, cursig, cursig, context)
623
700
 
@@ -651,6 +728,14 @@ module YTLJit
651
728
  asm.imul(INDIRECT_SPR)
652
729
  asm.add(SPR, AsmType::MACHINE_WORD.size)
653
730
  end
731
+ elsif context.ret_reg.is_a?(OpImmidiateMachineWord) then
732
+ asm.with_retry do
733
+ asm.mov(TMPR, context.ret_reg)
734
+ asm.push(TMPR)
735
+ asm.mov(DBLLOR, TMPR2)
736
+ asm.imul(INDIRECT_SPR)
737
+ asm.add(SPR, AsmType::MACHINE_WORD.size)
738
+ end
654
739
  else
655
740
  asm.with_retry do
656
741
  asm.mov(DBLLOR, TMPR2)
@@ -679,8 +764,6 @@ module YTLJit
679
764
  case [slf.ruby_type]
680
765
  when [Fixnum], [Float]
681
766
  cursig = context.to_signature
682
- same_type(@arguments[3], @arguments[2], cursig, cursig, context)
683
- same_type(@arguments[2], @arguments[3], cursig, cursig, context)
684
767
  same_type(self, @arguments[2], cursig, cursig, context)
685
768
  same_type(@arguments[2], self, cursig, cursig, context)
686
769
  end
@@ -709,6 +792,13 @@ module YTLJit
709
792
  asm.cdq
710
793
  asm.idiv(INDIRECT_SPR)
711
794
  asm.add(SPR, AsmType::MACHINE_WORD.size)
795
+ elsif context.ret_reg.is_a?(OpImmidiateMachineWord) then
796
+ asm.mov(TMPR, context.ret_reg)
797
+ asm.push(TMPR)
798
+ asm.mov(DBLLOR, TMPR2)
799
+ asm.cdq
800
+ asm.idiv(INDIRECT_SPR)
801
+ asm.add(SPR, AsmType::MACHINE_WORD.size)
712
802
  else
713
803
  asm.mov(DBLLOR, TMPR2)
714
804
  asm.cdq
@@ -823,28 +913,32 @@ module YTLJit
823
913
  include SendUtil
824
914
  add_special_send_node :[]
825
915
  def collect_candidate_type_regident(context, slf)
916
+ sig = context.to_signature
826
917
  case [slf.ruby_type]
827
918
  when [Array]
828
919
  fixtype = RubyType::BaseType.from_ruby_class(Fixnum)
829
- sig = context.to_signature
830
920
  @arguments[3].add_type(sig, fixtype)
831
- @arguments[2].add_element_node(sig, self, context)
921
+ cidx = @arguments[3].get_constant_value
922
+ @arguments[2].add_element_node(sig, self, cidx, context)
832
923
  decide_type_once(sig)
833
924
  @arguments[2].type = nil
834
925
  @arguments[2].decide_type_once(sig)
835
926
  epare = @arguments[2].element_node_list[0]
927
+ @arguments[2].element_node_list.each do |ele|
928
+ if ele[2] == cidx and ele[1] != self then
929
+ epare = ele
930
+ break
931
+ end
932
+ end
836
933
  esig = epare[0]
837
934
  enode = epare[1]
838
935
  if enode != self then
839
936
  same_type(self, enode, sig, esig, context)
840
- same_type(enode, self, esig, sig, context)
841
937
  end
842
938
 
843
939
  when [Hash]
844
- @arguments[2].add_element_node(context.to_signature, self, context)
845
-
846
- else
847
- raise "Unkown type #{slf.ruby_type} in :[]"
940
+ cidx = @arguments[3].get_constant_value
941
+ @arguments[2].add_element_node(sig, self, cidx, context)
848
942
  end
849
943
 
850
944
  context
@@ -855,13 +949,14 @@ module YTLJit
855
949
  include SendUtil
856
950
  add_special_send_node :[]=
857
951
  def collect_candidate_type_regident(context, slf)
952
+ sig = context.to_signature
858
953
  case [slf.ruby_type]
859
954
  when [Array]
860
955
  fixtype = RubyType::BaseType.from_ruby_class(Fixnum)
861
- sig = context.to_signature
862
956
  val = @arguments[4]
863
957
  @arguments[3].add_type(sig, fixtype)
864
- @arguments[2].add_element_node(sig, val, context)
958
+ cidx = @arguments[3].get_constant_value
959
+ @arguments[2].add_element_node(sig, val, cidx, context)
865
960
  decide_type_once(sig)
866
961
  @arguments[2].type = nil
867
962
  @arguments[2].decide_type_once(sig)
@@ -874,7 +969,8 @@ module YTLJit
874
969
  end
875
970
 
876
971
  when [Hash]
877
- @arguments[2].add_element_node(context.to_signature, self, context)
972
+ cidx = @arguments[3].get_constant_value
973
+ @arguments[2].add_element_node(sig, self, cidx, context)
878
974
  end
879
975
 
880
976
  context
@@ -886,7 +982,6 @@ module YTLJit
886
982
  def collect_candidate_type_regident(context, slf)
887
983
  sig = context.to_signature
888
984
  floattype = RubyType::BaseType.from_ruby_class(Float)
889
- floattype = floattype.to_box
890
985
  add_type(sig, floattype)
891
986
  context
892
987
  end
@@ -897,7 +992,6 @@ module YTLJit
897
992
  def collect_candidate_type_regident(context, slf)
898
993
  sig = context.to_signature
899
994
  fixnumtype = RubyType::BaseType.from_ruby_class(Fixnum)
900
- fixnumtype = fixnumtype.to_box
901
995
  add_type(sig, fixnumtype)
902
996
  context
903
997
  end
@@ -910,6 +1004,39 @@ module YTLJit
910
1004
  same_type(self, @arguments[2], sig, sig, context)
911
1005
  context
912
1006
  end
1007
+
1008
+ def compile(context)
1009
+ @arguments[2].decide_type_once(context.to_signature)
1010
+ rtype = @arguments[2].type
1011
+ rrtype = rtype.ruby_type
1012
+ if rtype.is_a?(RubyType::DefaultType0) or
1013
+ @class_top.search_method_with_super(@func.name, rrtype)[0] then
1014
+ return super(context)
1015
+ end
1016
+
1017
+ context = gen_eval_self(context)
1018
+ context = rtype.gen_unboxing(context)
1019
+ asm = context.assembler
1020
+ if rrtype == Fixnum then
1021
+ asm.with_retry do
1022
+ asm.mov(RETR, context.ret_reg)
1023
+ asm.neg(RETR)
1024
+ end
1025
+ context.ret_reg = RETR
1026
+ elsif rrtype == Float then
1027
+ context.start_using_reg(XMM4)
1028
+ asm.with_retry do
1029
+ asm.mov(XMM4, context.ret_reg)
1030
+ asm.subsd(XMM0, XMM0)
1031
+ asm.subsd(XMM0, XMM4)
1032
+ end
1033
+ context.ret_reg = XMM0
1034
+ context.end_using_reg(XMM4)
1035
+ end
1036
+ context.ret_node = self
1037
+
1038
+ @body.compile(context)
1039
+ end
913
1040
  end
914
1041
 
915
1042
  class SendRandNode<SendNode
@@ -922,6 +1049,91 @@ module YTLJit
922
1049
  end
923
1050
  end
924
1051
 
1052
+ class SendRangeAccessNode<SendNode
1053
+ include AbsArch
1054
+
1055
+ def collect_candidate_type_regident(context, slf)
1056
+ cursig = context.to_signature
1057
+ if slf.ruby_type == Range then
1058
+ epare = @arguments[2].element_node_list[0]
1059
+ esig = epare[0]
1060
+ enode = epare[1]
1061
+ tt = enode.decide_type_once(esig)
1062
+ add_type(cursig, tt)
1063
+ else
1064
+ super
1065
+ end
1066
+
1067
+ context
1068
+ end
1069
+
1070
+ def compile(context)
1071
+ rtype = @arguments[2].decide_type_once(context.to_signature)
1072
+ rrtype = rtype.ruby_type
1073
+ if rrtype == Range and !rtype.boxed then
1074
+ context = @arguments[2].compile(context)
1075
+ slotoff = OpIndirect.new(TMPR, arg_offset)
1076
+ asm = context.assembler
1077
+ asm.with_retry do
1078
+ asm.mov(TMPR, context.ret_reg)
1079
+ asm.mov(RETR, slotoff)
1080
+ end
1081
+
1082
+ context.ret_reg = RETR
1083
+ context.ret_node = self
1084
+
1085
+ context
1086
+ else
1087
+ super(context)
1088
+ end
1089
+ end
1090
+ end
1091
+
1092
+ class SendFirstNode<SendRangeAccessNode
1093
+ add_special_send_node :first
1094
+ def arg_offset
1095
+ 0
1096
+ end
1097
+ end
1098
+
1099
+ class SendLastNode<SendRangeAccessNode
1100
+ add_special_send_node :last
1101
+ def arg_offset
1102
+ AsmType::MACHINE_WORD.size
1103
+ end
1104
+ end
1105
+
1106
+ class SendExcludeEndNode<SendRangeAccessNode
1107
+ add_special_send_node :exclude_end?
1108
+ def collect_candidate_type_regident(context, slf)
1109
+ cursig = context.to_signature
1110
+ if slf.ruby_type == Range then
1111
+ tt = RubyType::BaseType.from_ruby_class(TrueClass)
1112
+ add_type(cursig, tt)
1113
+ tt = RubyType::BaseType.from_ruby_class(FalseClass)
1114
+ add_type(cursig, tt)
1115
+ else
1116
+ super
1117
+ end
1118
+
1119
+ context
1120
+ end
1121
+
1122
+ def arg_offset
1123
+ AsmType::MACHINE_WORD.size * 2
1124
+ end
1125
+ end
1126
+
1127
+ class SendSizeNode<SendNode
1128
+ add_special_send_node :size
1129
+ def collect_candidate_type_regident(context, slf)
1130
+ cursig = context.to_signature
1131
+ tt = RubyType::BaseType.from_ruby_class(Fixnum)
1132
+ add_type(cursig, tt)
1133
+ context
1134
+ end
1135
+ end
1136
+
925
1137
  class SendSameArgTypeNode<SendNode
926
1138
  def collect_candidate_type_regident(context, slf)
927
1139
  sig = context.to_signature
@@ -945,16 +1157,22 @@ module YTLJit
945
1157
 
946
1158
  def compile_call_func(context, fname)
947
1159
  fadd = OpMemAddress.new(address_of(fname))
948
- context.start_using_reg(FUNC_ARG[0])
1160
+ context.start_arg_reg(FUNC_FLOAT_ARG)
1161
+ context.start_arg_reg
949
1162
  asm = context.assembler
950
1163
  asm.with_retry do
951
1164
  asm.mov(FUNC_FLOAT_ARG[0], context.ret_reg)
1165
+ end
1166
+ context.set_reg_content(FUNC_FLOAT_ARG[0].dst_opecode,
1167
+ context.ret_node)
1168
+ asm.with_retry do
952
1169
  asm.call_with_arg(fadd, 1)
953
1170
  asm.sub(SPR, 8)
954
1171
  asm.fstpl(INDIRECT_SPR)
955
1172
  asm.pop(XMM0)
956
1173
  end
957
- context.end_using_reg(FUNC_ARG[0])
1174
+ context.end_arg_reg
1175
+ context.end_arg_reg(FUNC_FLOAT_ARG)
958
1176
  context
959
1177
  end
960
1178
 
@@ -976,7 +1194,7 @@ module YTLJit
976
1194
  end
977
1195
  end
978
1196
 
979
- class SendSqrtNode < SendMathFuncNode
1197
+ class SendSqrtNode<SendMathFuncNode
980
1198
  add_special_send_node :sqrt
981
1199
  def compile_main(context)
982
1200
  context = compile_call_func(context, "sqrt")
@@ -986,7 +1204,7 @@ module YTLJit
986
1204
  end
987
1205
  end
988
1206
 
989
- class SendSinNode < SendMathFuncNode
1207
+ class SendSinNode<SendMathFuncNode
990
1208
  add_special_send_node :sin
991
1209
  def compile_main(context)
992
1210
  context = compile_call_func(context, "sin")
@@ -996,7 +1214,7 @@ module YTLJit
996
1214
  end
997
1215
  end
998
1216
 
999
- class SendCosNode < SendMathFuncNode
1217
+ class SendCosNode<SendMathFuncNode
1000
1218
  add_special_send_node :cos
1001
1219
  def compile_main(context)
1002
1220
  context = compile_call_func(context, "cos")
@@ -1006,7 +1224,7 @@ module YTLJit
1006
1224
  end
1007
1225
  end
1008
1226
 
1009
- class SendTanNode < SendMathFuncNode
1227
+ class SendTanNode<SendMathFuncNode
1010
1228
  add_special_send_node :tan
1011
1229
  def compile_main(context)
1012
1230
  context = compile_call_func(context, "tan")
@@ -1015,6 +1233,42 @@ module YTLJit
1015
1233
  context
1016
1234
  end
1017
1235
  end
1236
+
1237
+ class RawSendNode<SendNode
1238
+ def collect_candidate_type(context)
1239
+ @arguments.each do |arg|
1240
+ context = arg.collect_candidate_type(context)
1241
+ end
1242
+
1243
+ context = collect_candidate_type_body(context)
1244
+
1245
+ @body.collect_candidate_type(context)
1246
+ end
1247
+ end
1248
+
1249
+ class RetStringSendNode<RawSendNode
1250
+ def collect_candidate_type_body(context)
1251
+ sig = context.to_signature
1252
+ tt = RubyType::BaseType.from_ruby_class(String)
1253
+ add_type(sig, tt)
1254
+
1255
+ context
1256
+ end
1257
+ end
1258
+
1259
+ class RetArraySendNode<RawSendNode
1260
+ def collect_candidate_type_body(context)
1261
+ sig = context.to_signature
1262
+ tt = RubyType::BaseType.from_ruby_class(Array)
1263
+ add_type(sig, tt)
1264
+
1265
+ @arguments[1..-1].each_with_index do |anode, idx|
1266
+ add_element_node(sig, anode, [idx], context)
1267
+ end
1268
+
1269
+ context
1270
+ end
1271
+ end
1018
1272
  end
1019
1273
  end
1020
1274
  end