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