Author: smash
Date: Fri Sep 14 06:38:12 2007
New Revision: 21278
Modified:
trunk/docs/pdds/draft/pdd19_pir.pod
Log:
[pdd]: some small reviews including:
* marked off items to review and proposals from RT
* some directives/ops/... revisited
* some updates from DEPRECATED
* updated 'type'
Modified: trunk/docs/pdds/draft/pdd19_pir.pod
==============================================================================
--- trunk/docs/pdds/draft/pdd19_pir.pod (original)
+++ trunk/docs/pdds/draft/pdd19_pir.pod Fri Sep 14 06:38:12 2007
@@ -20,20 +20,37 @@
Comments start with B<#> and last until the following newline. These
and empty lines are ignored.
+PIR allows POD blocks.
+
=head1 Statements
-A valid imcc program consists of a sequence of I<statements>. A
-I<statement> is terminated by a newline (<NL>).
+A valid PIR program consists of a sequence of I<statements>. A
+I<statement> is terminated by a newline (<NL>). So, each statement has to be
+on its own line.
=head2 General statement format
+Any statement can start with a optional label and is terminated by a
+newline:
+
[label:] [instruction] <NL>
=head2 Labels
-Optional label for the given instruction, can stand on its own line.
-Global labels start with an underscore, local labels shouldn't. A label must
-conform to the syntax of B<identifier> described below.
+PIR code has both local and global labels. Global labels start with an
+underscore, local labels shouldn't. Optional label for the given
+instruction, can stand on its own line. A label must conform to the syntax
+of B<identifier> described below.
+
+The name of a global label has to be unique, since it can be called at any
+point in the program. A local label is accessible only in the compilation
+unit where it's defined. A local label name must be unique within a
+compilation unit, but it can be reused in other compilation units.
+
+Examples:
+
+ branch L1 # local label
+ bsr _L2 # global label
=head1 INSTRUCTIONS
@@ -43,8 +60,11 @@
=item <identifier>
-Start with a letter or underscore, then may contain additionally
-digits and B<::>.
+Identifiers start with a letter or underscore, then may contain additionally
+letters, digits, underscores and B<::>. Identifiers don't have any limit on
+length.
+
+{{ REVIEW: length limit }}
Example:
@@ -55,13 +75,16 @@
=item <type>
-B<int>, B<float>, B<string>, B<pmc> or a valid parrot PMC type like
-B<Array>.
+Can be B<int>, B<float>, B<string> or B<pmc>.
+
+{{ REFERENCE: RT#42769 }}
=item <reg>
-A PASM register In, Sn, Nn, Pn, or a IMCC temporary
-register $In, $Sn, $Nn, $Pn, where B<n> consists of digit(s) only.
+A PASM register In, Sn, Nn, Pn, or a PIR temporary register $In, $Sn, $Nn,
+$Pn, where B<n> consists of digit(s) only. B<n> must be between 1 and 99.
+
+{{ REVIEW: n limit }}
=item <var>
@@ -196,31 +219,42 @@
=item .sub <identifier> [:<flag> ...]
-=item .end
-
Define a I<compilation unit> with the label B<identifier:>. See
L<PIR Calling Conventions|imcc/calling_conventions> for available flags.
+Always paired with C<.end>.
+
+=item .end
+
+End a compilation unit. Always paired with C<.sub>.
=item .emit
+Define a I<compilation unit> containing PASM code. Always paired with
+C<.eom>.
+
=item .eom
-Define a I<compilation unit> containing PASM code.
+End a I<compilation unit> containing PASM code. Always paired with
+C<.emit>.
=item .local <type> <identifier> [:unique_reg]
-=item .sym <type> <identifier> [:unique_reg]
-
Define a local name B<identifier> for this I<compilation unit> and of the
given B<type>. You can define multiple identifiers of the same type by
separating them with commas:
- .sym int i, j
+ .local int i, j
The optional C<:unique_reg> modifier will force the register allocator to
associate the identifier with a unique register for the duration of the
compilation unit.
+=item .sym <type> <identifier> [:unique_reg]
+
+Same as C<.local>.
+
+{{ PROPOSAL: remove .sym, see RT#45405 }}
+
=item .lex <identifier>, <reg>
Declare a lexical variable that is an alias for a PMC register. The
@@ -228,7 +262,7 @@
directive. For example, given this preamble:
.lex "$a", $P0
- $P1 = new Integer
+ $P1 = new 'Integer'
These two opcodes have an identical effect:
@@ -244,15 +278,13 @@
=item .globalconst <type> <identifier> = <const>
-Define a named constant of style I<type> and value I<const> restricted
-to one sub or globally. If I<type> denotes a PMC type, I<const> must be
-a string constant.
+{{ PROPOSAL: to be removed, see RT#45407 }}
=item .namespace <identifier>
Open a new scope block. This "namespace" is not the same as the
.namespace [ <identifier> ] syntax, which is used for storing subroutines
-in a particular namespace in the global symboltable.
+in a particular namespace in the global symbol table.
This directive is useful in cases such as (pseudocode):
local x = 1;
@@ -316,14 +348,13 @@
=item .arg <var> [:<flag> ...]
Between B<.pcc_begin> and B<.pcc_call>, specify an argument to be
-passed. Available flags:
-C<:flat>.
+passed. Available flags: C<:flat>.
=item .result <var> [:<flag> ...]
Between B<.pcc_call> and B<.pcc_end>, specify where one or more return
value(s) should be stored. Available flags:
-C<:slurpy>, C<:optional>, and C<:opt_count>.
+C<:slurpy>, C<:optional>, and C<:opt_flag>.
=back
@@ -331,7 +362,17 @@
=over 4
-=item ([<var> [:<flag> ...], ...]) = <var>([arg [:<flag> ...], ...])
+=item ([<var1> [:<flag1> ...], ...]) = <var2>([<arg1> [:<flag2> ...], ...])
+
+This is short for:
+
+ .pcc_begin
+ .pcc_arg <arg1> <flag2>
+ ...
+ .pcc_call <var2>
+ .result <var1> <flag1>
+ ...
+ .pcc_end
=item <var> = <var>([arg [:<flag> ...], ...])
@@ -375,8 +416,8 @@
and C<FLAT>, which correspond to the calling convention flags
C<:slurpy>, C<:optional>, C<:opt_flag>, and C<:flat>.
-[TODO - once these flag bits are solidified by long-term use, then we
-may choose to copy appropriate bits of the documentation to here.]
+{{ TODO: once these flag bits are solidified by long-term use, then we
+may choose to copy appropriate bits of the documentation to here. }}
=head2 Instructions
@@ -387,13 +428,21 @@
=item goto <identifier>
-B<branch> <identifier>.
+B<branch> to <identifier> (label or subroutine name).
+
+Examples:
+
+ goto END
=item if <var> goto <identifier>
+If <var> evaluates as true, jump to the named identifier. Translate to
+B<if x, identifier>>.
+
=item unless <var> goto <identifier>
-Translate to B<if x, identifier> or B<unless ..>.
+Unless <var> evaluates as true, jump to the named identifier. Translate to
+B<unless x, identifier>.
=item if null <var> goto <identifier>
@@ -413,7 +462,7 @@
=item <var> = <var>
-B<set var, var>
+Assign a value. Translates to B<set var, var>.
=item <var> = <unary> <var>
@@ -461,13 +510,13 @@
A keyed B<set> operation or the assign B<substr> op with a length of
1.
-=item <var> = new <type>
+=item <var> = new '<type>'
-B<new var, .type>
+B<new var, 'type'>
-=item <var> = new <type>, <var>
+=item <var> = new '<type>', <var>
-B<new var, .type, var>
+B<new var, 'type', var>
=item <var> = defined <var>
@@ -479,23 +528,40 @@
=item global "string" = <var>
-B<store_global "string", var>
+{{ DEPRECATED: op store_global was deprecated }}
=item <var> = global "string"
-B<find_global var, "string">
+{{ DEPRECATED: op find_global was deprecated }}
=item <var> = clone <var>
B<clone var, var>
-=item <var> = addr <var>
+=item <var> = addr <identifier>
-B<set_addr var, var>
+Set <var> to the addressof label identified by <identifier>. Translates to
+B<set_addr var, var>.
=item <var> = null
-B<null <var>>
+Set <var> to null. Translates to B<null <var>>.
+
+=item <<, <<=
+
+TODO
+
+=item >>, >>=
+
+TODO
+
+=item >>>,>>>=
+
+TODO
+
+=item addr
+
+Return the address of a label.
=back