Compare Revisions

Nanojit

Revision 53870:

Revision 53870 by paritosh1010 on

Revision 53871:

Revision 53871 by msullivan on

Title:
Nanojit
Nanojit
Slug:
Nanojit
Nanojit
Tags:
SpiderMonkey, "Developing Mozilla"
SpiderMonkey, "Developing Mozilla"
Content:

Revision 53870
Revision 53871
n32g++ -DDEBUG -g3 -include mozilla-config.h -I dist/include/js  -I n32g++ -DDEBUG -g3 -Wno-invalid-offsetof -include js-confdefs.h -I d
>../nanojit -o jittest ../jittest.cpp libjs_static.a>ist/include/ -I.. -I ../nanojit -o jittest ../jittest.cpp libjs_s
 >tatic.a
nn47static avmplus::GC gc = avmplus::GC();
48static avmplus::AvmCore core = avmplus::AvmCore();
49 
n49    // Set up the basic Nanojit objects.n52        LogControl lc;
50    avmplus::GC *gc = new avmplus::GC;
51    if (!gc)
52        return 1;
53    avmplus::AvmCore core;
n55    core.config.verbose = 1; // Show disassembly of generated tran54        lc.lcbits = LC_ReadLIR | LC_Assembly;
>ces. 
55#else
56        lc.lcbits = 0;
nn58        
59        // Set up the basic Nanojit objects.
57    Fragmento *fragmento = new (gc) Fragmento(&core, CACHE_SI60        Fragmento *fragmento = new (&gc) Fragmento(&core,
>ZE_LOG2);> &lc, CACHE_SIZE_LOG2);
58    LirBuffer *buf = new (gc) LirBuffer(fragmento, NULL);61        LirBuffer *buf = new (&gc) LirBuffer(fragmento);
n60    // Create a Fragment to hold some native code.n63        #ifdef DEBUG
61    Fragment *f = new (gc) Fragment(NULL);64        fragmento->labels = new (&gc) LabelMap(&core);
62    f->lirbuf = buf;65        buf->names = new (&gc) LirNameMap(&gc, fragmen
 >to->labels);
63    f->root = f;66        #endif
n65    // Create a LIR writer, with verbose output if DEBUG.n68        // Create a Fragment to hold some native code.
66    LirBufWriter writer0(buf);69        Fragment *f = fragmento->getAnchor((void *)0xdeadbeef)
 >;
67#ifdef DEBUG70        f->lirbuf = buf;
68    fragmento->labels = new (gc) LabelMap(&core, NULL);71        f->root = f;
69    buf->names = new (gc) LirNameMap(gc, NULL, fragmento->l
>abels); 
70    VerboseWriter writer(gc, &writer0, buf->names);
71#else
72    LirBufWriter& writer = writer0;
73#endif
n75    // Write a few LIR instructions to the buffer: add the first n73        // Create a LIR writer
>parameter 
76    // to the constant 2.74        LirBufWriter out(buf);
77    writer.ins0(LIR_start);
78    LIns *two = writer.insImm(2);
79    LIns *firstParam = writer.insParam(0, 0);
80    LIns *result = writer.ins2(LIR_add, firstParam, two);
81    writer.ins1(LIR_ret, result);
n83    // Emit a LIR_loop instruction.  It won't be reached, but then76        // Write a few LIR instructions to the buffer: add the fi
>re's>rst parameter
84    // an assertion in Nanojit that trips if a fragment doesn't e77        // to the constant 2.
>nd with 
85    // a guard (a bug in Nanojit). 78        out.ins0(LIR_start);
86    LIns *rec_ins = writer0.skip(sizeof(GuardRecord) + sizeof(Sid79        LIns *two = out.insImm(2);
>eExit)); 
87    GuardRecord *guard = (GuardRecord *) rec_ins->payload();80        LIns *firstParam = out.insParam(0, 0);
88    memset(guard, 0, sizeof(*guard));81        LIns *result = out.ins2(LIR_add, firstParam, two);
89    SideExit *exit = (SideExit *)(guard + 1);82        out.ins1(LIR_ret, result);
90    guard->exit = exit;
91    guard->exit->target = f;
92    f->lastIns = writer.insGuard(LIR_loop, writer.insImm(1), r
>ec_ins); 
n94    // Compile the fragment.n84        // Emit a LIR_loop instruction.  It won't be reached, but
 > there's
95    compile(fragmento->assm(), f);85        // an assertion in Nanojit that trips if a fragment doesn
 >'t end with
96    if (fragmento->assm()->error() != None) {86        // a guard (a bug in Nanojit).
97        fprintf(stderr, "error compiling fragment\n");87        LIns *rec_ins = out.insSkip(sizeof(GuardRecord) + sizeof(
 >SideExit));
98        return 1;88        GuardRecord *guard = (GuardRecord *) rec_ins->payload(
 >);
99    }89        memset(guard, 0, sizeof(*guard));
100    printf("Compilation successful.\n");90        SideExit *exit = (SideExit *)(guard + 1);
91        guard->exit = exit;
92        guard->exit->target = f;
93        f->lastIns = out.insGuard(LIR_loop, out.insImm(1), rec
 >_ins);
nn95        // Compile the fragment.
96        compile(fragmento->assm(), f);
97        if (fragmento->assm()->error() != None) {
98                fprintf(stderr, "error compiling fragment\n");
99                return 1;
100        }
101        printf("Compilation successful.\n");
102 
102    // Call the compiled function.103        // Call the compiled function.
103    typedef JS_FASTCALL int32_t (*AddTwoFn)(int32_t);104        typedef JS_FASTCALL int32_t (*AddTwoFn)(int32_t);
104    AddTwoFn fn = reinterpret_cast<AddTwoFn>(f->code());105        AddTwoFn fn = reinterpret_cast<AddTwoFn>(f->code
 >());
105    printf("2 + 5 = %d\n", fn(5));106        printf("2 + 5 = %d\n", fn(5));
106    return 0;107        return 0;
nn109 
n120      writer.ins0(LIR_start);<br>n122      out.ins0(LIR_start);<br>
121      LIns *two = writer.insImm(2);<br>123      LIns *two = out.insImm(2);<br>
122      <span>LIns *firstParam = writer.insParam(0, 0);</span><br>124      <span>LIns *firstParam = out.insParam(0, 0);</span><br>
123      LIns *result = writer.ins2(LIR_add, firstParam, two);<br>125      LIns *result = out.ins2(LIR_add, firstParam, two);<br>
124      writer.ins1(LIR_ret, result);</span>126      out.ins1(LIR_ret, result);</span>
t194    <p style="text-align: left;">t
195      &nbsp;
196    </p>

Back to History