Compare Revisions

Nanojit

Change Revisions

Revision 53875:

Revision 53875 by msullivan on

Revision 53876:

Revision 53876 by berkerpeksag on

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

Revision 53875
Revision 53876
n34    <p>n34    <div class="note">
35      (Remove the <code>-DDEBUG</code> if you have not compiled S35      <strong>Note:</strong> Remove the <code>-DDEBUG</code> if y
>piderMonkey with <code>--enable-debug</code>, and use whatever yo>ou have not compiled SpiderMonkey with <code>--enable-debug</code
>u called the sample source file in place of <em><code>jittest.cpp>>, and use whatever you called the sample source file in place of
></code></em>.)> <em><code>jittest.cpp</code></em>.
36    </p>36    </div>
n114 n
n120      <br>n
n123    <blockquote style="font-family: courier new;">n121    <pre class="brush: cpp">
124      <span style="font-size: 85%;">// Write a few LIR instructio122// Write a few LIR instructions to the buffer: add the first para
>ns to the buffer: add the first parameter<br>>meter
125      // to the constant 2.<br>123// to the constant 2.
124 
126      out.ins0(LIR_start);<br>125out.ins0(LIR_start);
126 
127      LIns *two = out.insImm(2);<br>127LIns *two = out.insImm(2);
128 
128      <span>LIns *firstParam = out.insParam(0, 0);</span><br>129LIns *firstParam = out.insParam(0, 0);
130 
129      LIns *result = out.ins2(LIR_add, firstParam, two);<br>131LIns *result = out.ins2(LIR_add, firstParam, two);
132 
130      out.ins1(LIR_ret, result);</span>133out.ins1(LIR_ret, result);
131    </blockquote>134</pre>
n135    <blockquote style="font-family: courier new;">n138    <pre class="brush: cpp">
136      <span style="font-size: 85%;">// Compile the fragment.<br>139// Compile the fragment.
137      compile(assm, f, *alloc verbose_only(, fragmento-&gt;labels140 
>));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n 
>bsp;&nbsp;<br> 
138      if (assm-&gt;error() != None) {&nbsp;&nbsp;&nbsp;&nbsp;&nbs141compile(assm, f, *alloc verbose_only(, fragmento-&gt;labels));   
>p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb>         
>sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n 
>bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& 
>nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> 
139      &nbsp;&nbsp;&nbsp; fprintf(stderr, "error compiling fragmen142 
>t\n");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp 
>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs 
>p;&nbsp;<br> 
140      &nbsp;&nbsp;&nbsp; return 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&143if (assm-&gt;error() != None) {
>nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp 
>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs 
>p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> 
141      }<br>144    fprintf(stderr, "error compiling fragment\n");
145 
146    return 1;
147}
148 
142      printf("Compilation successful.\n");<br>149printf("Compilation successful.\n");
143      <br>150 
144      // Call the compiled function.<br>151// Call the compiled function.
152 
145      typedef JS_FASTCALL int32_t (*AddTwoFn)(int32_t);<br>153typedef JS_FASTCALL int32_t (*AddTwoFn)(int32_t);
154 
146      AddTwoFn fn = reinterpret_cast&lt;addtwofn&gt;(f-&gt;code()155AddTwoFn fn = reinterpret_cast&lt;addtwofn&gt;(f-&gt;code());
>);<br> 
156 
147      printf("2 + 5 = %d\n", fn(5));<br>157printf("2 + 5 = %d\n", fn(5));
148      return 0;&lt;/addtwofn&gt;</span><span style="font-family: 158 
>Verdana;"><br></span> 
149    </blockquote>159return 0;&lt;/addtwofn&gt;
160</pre>
n155    <p style="text-align: left;"></p>n166    <pre class="brush: cpp">
156    <blockquote>1672+5=7
157      2+5=7168</pre>
158    </blockquote>
159    <p style="text-align: left;">
160      <span><span>Now, what I need to do is generate output for t
>his:</span></span> 
161    </p>
162    <blockquote>
163      <p style="text-align: left;">169    <p style="text-align: left;">
164        <span style="font-family: Courier New;">start<br>170      Now, what I need to do is generate output for this:
165        two = int 2<br>
166        twoPlusTwo = add two, two<br>
167        ret twoPlusTwo</span>
168      </p>171    </p>
169    </blockquote>172    <pre class="brush: cpp">
170    <p style="text-align: left;">173start
171      <span style="font-family: Verdana;"><span style="font-size:174two = int 2
> small;">This adds two and two in the most hardcoded way possible 
>. The conversion from LIR to a program like one shown above is th 
>e task of the parser.</span></span><span style="font-size: 100%;" 
>><br></span> 
175 
176twoPlusTwo = add two, two
177 
178ret twoPlusTwo
179</pre>
180    <p>
181      This adds two and two in the most hardcoded way possible. T
 >he conversion from LIR to a program like one shown above is the t
 >ask of the parser.
n176    <p style="text-align: left;">n186    <p>
n182    <p style="text-align: left;">n192    <p>
183      Guards are required in a cross platform dynamic language li193      Guards are required in a cross platform dynamic language li
>ke Javascript. Certain assumptions are made when a particular JIT>ke JavaScript. Certain assumptions are made when a particular JIT
> code is generated.> code is generated.
194    </p>
184    </p>195    <p>
185    <p style="text-align: left;">
t190    </p>t
191    <p style="text-align: left;">
192      &nbsp;

Back to History