tagged release 0.6.4
[parrot.git] / languages / pipp / src / common / builtins.pir
blob8f4411904426e70ac913eb3e276fb181f9d14a3b
1 # $Id$
3 .loadlib 'php_group'
5 .include 'languages/pipp/src/common/php_MACRO.pir'
7 # steal builtins from Perl6
8 .sub 'print'
9     .param pmc list            :slurpy
10     .local pmc iter
12     iter = new 'Iterator', list
13   iter_loop:
14     unless iter goto iter_end
15     $P0 = shift iter
16     print $P0
17     goto iter_loop
19   iter_end:
20     .return (1)
21 .end
23 # steal builtins from Perl6
24 # TODO: put that into php_builtins.pir
25 .sub 'echo'
26     .param pmc list            :slurpy
28     .local pmc iter
29     iter = new 'Iterator', list
30   iter_loop:
31     unless iter goto iter_end
32     $P0 = shift iter
33     print $P0
34     goto iter_loop
36   iter_end:
37     .return (1)
38 .end
40 ## autoincrement
41 .sub 'postfix:++'
42     .param pmc a
43     $P0 = clone a
44     inc a
45     .return ($P0)
46 .end
48 .sub 'postfix:--'
49     .param pmc a
50     $P0 = clone a
51     dec a
52     .return ($P0)
53 .end
55 .sub 'prefix:++'
56     .param pmc a
57     inc a
58     .return (a)
59 .end
61 .sub 'prefix:--'
62     .param pmc a
63     dec a
64     .return (a)
65 .end
68 ## symbolic unary
69 .sub 'prefix:-'
70     .param pmc a
71     $P1 = a.'to_number'()
72     neg $P1
74     .return ($P1)
75 .end
77 .sub 'prefix:+'
78     .param pmc a
79     $P1 = a.'to_number'()
81     .return ($P1)
82 .end
84 .sub 'prefix:~' :multi(PhpString)
85     .param pmc a
86     bnots $P1
87     .return ($P1)
88 .end
90 .sub 'prefix:~' :multi(_)
91     .param int a
92     $I0 = bnot a
93     .RETURN_LONG($I0)
94 .end
96 .sub 'prefix:!'
97     .param pmc a
98     $I0 = isfalse a
99     .RETURN_BOOL($I0)
100 .end
103 ## multiplicative
104 .sub 'infix:*'
105     .param pmc a
106     .param pmc b
107     $P1 = a.'to_number'()
108     $P2 = b.'to_number'()
109     $P0 = mul $P1, $P2
110     .return ($P0)
111 .end
113 .sub 'infix:/'
114     .param pmc a
115     .param pmc b
116     $P1 = a.'to_number'()
117     $P2 = b.'to_number'()
118     $P0 = div $P1, $P2
119     .return ($P0)
120 .end
122 .sub 'infix:%'
123     .param pmc a
124     .param pmc b
125     $P1 = a.'to_number'()
126     $P2 = b.'to_number'()
127     $P0 = mod $P1, $P2
128     .return ($P0)
129 .end
131 .sub 'infix:&' :multi(PhpString,PhpString)
132     .param pmc a
133     .param pmc b
134     $P0 = bands $P1, $P2
135     .return ($P0)
136 .end
138 .sub 'infix:&' :multi(_,_)
139     .param int a
140     .param int b
141     $I0 = band a, b
142     .RETURN_LONG($I0)
143 .end
145 .sub 'infix:>>'
146     .param int a
147     .param int b
148     $I0 = shr a, b
149     .RETURN_LONG($I0)
150 .end
152 .sub 'infix:<<'
153     .param int a
154     .param int b
155     $I0 = shl a, b
156     .RETURN_LONG($I0)
157 .end
160 ## additive
161 .sub 'infix:+'
162     .param pmc a
163     .param pmc b
164     $P1 = a.'to_number'()
165     $P2 = b.'to_number'()
166     $P0 = add $P1, $P2
167     .return ($P0)
168 .end
170 .sub 'infix:-'
171     .param pmc a
172     .param pmc b
173     $P1 = a.'to_number'()
174     $P2 = b.'to_number'()
175     $P0 = sub $P1, $P2
176     .return ($P0)
177 .end
179 .sub 'infix:.'
180     .param pmc a
181     .param pmc b
182     $S1 = a
183     $S2 = b
184     $S0 = concat $S1, $S2
185     .RETURN_STRING($S0)
186 .end
188 .sub 'infix:|' :multi(PhpString,PhpString)
189     .param pmc a
190     .param pmc b
191     $P0 = bors $P1, $P2
192     .return ($P0)
193 .end
195 .sub 'infix:|' :multi(_,_)
196     .param int a
197     .param int b
198     $I0 = bor a, b
199     .RETURN_LONG($I0)
200 .end
202 .sub 'infix:^' :multi(PhpString,PhpString)
203     .param pmc a
204     .param pmc b
205     $P0 = bxors $P1, $P2
206     .return ($P0)
207 .end
209 .sub 'infix:^' :multi(_,_)
210     .param int a
211     .param int b
212     $I0 = bxor a, b
213     .RETURN_LONG($I0)
214 .end
217 ## logical
218 .sub 'infix:AND'
219     .param pmc a
220     .param pmc b
221     $I1 = istrue a
222     $I2 = istrue b
223     $I0 = band $I1, $I2
224     .RETURN_BOOL($I0)
225 .end
227 .sub 'infix:OR'
228     .param pmc a
229     .param pmc b
230     $I1 = istrue a
231     $I2 = istrue b
232     $I0 = bor $I1, $I2
233     .RETURN_BOOL($I0)
234 .end
236 .sub 'infix:XOR'
237     .param pmc a
238     .param pmc b
239     $I1 = istrue a
240     $I2 = istrue b
241     $I0 = bxor $I1, $I2
242     .RETURN_BOOL($I0)
243 .end
246 ## comparison
247 .sub 'infix:<'
248     .param pmc a
249     .param pmc b
250     $I0 = islt a, b
251     .RETURN_BOOL($I0)
252 .end
254 .sub 'infix:<='
255     .param pmc a
256     .param pmc b
257     $I0 = isle a, b
258     .RETURN_BOOL($I0)
259 .end
261 .sub 'infix:=='
262     .param pmc a
263     .param pmc b
264     $I0 = iseq a, b
265     .RETURN_BOOL($I0)
266 .end
268 .sub 'infix:!='
269     .param pmc a
270     .param pmc b
271     $I0 = isne a, b
272     .RETURN_BOOL($I0)
273 .end
275 .sub 'infix:>'
276     .param pmc a
277     .param pmc b
278     $I0 = isgt a, b
279     .RETURN_BOOL($I0)
280 .end
282 .sub 'infix:>='
283     .param pmc a
284     .param pmc b
285     $I0 = isge a, b
286     .RETURN_BOOL($I0)
287 .end
289 .sub 'infix:==='
290     .param pmc a
291     .param pmc b
292     $S1 = typeof a
293     $S2 = typeof b
294     if $S1 == $S2 goto L1
295     .RETURN_FALSE()
296   L1:
297     $I0 = iseq a, b
298     .RETURN_BOOL($I0)
299 .end
301 .sub 'infix:!=='
302     .param pmc a
303     .param pmc b
304     $S1 = typeof a
305     $S2 = typeof b
306     if $S1 != $S2 goto L1
307     .RETURN_TRUE()
308   L1:
309     $I0 = isne a, b
310     .RETURN_BOOL($I0)
311 .end
314 .include 'languages/pipp/src/common/php_standard.pir'
316 # Local Variables:
317 #   mode: pir
318 #   fill-column: 100
319 # End:
320 # vim: expandtab shiftwidth=4 ft=pir: