(→Function "mkvec") |
(→Function "compute") |
||
Line 97: | Line 97: | ||
=== Function "compute" === | === Function "compute" === | ||
+ | |||
+ | In the following, BB# means "basic block #". | ||
+ | |||
<asm> | <asm> | ||
;; start of BB1 | ;; start of BB1 |
Consider the following C code:
<c> static unsigned long a = 10; static double *v; extern void *malloc(unsigned long);
static double *mkvec(unsigned long n) {
if (n < 1) return (double *)0; unsigned long s = sizeof(double); double *v = (double *)malloc(n * s); return v;
}
double *compute() {
v = mkvec(a * 4); for (unsigned long i = 1; i < a; i++) if (v[i] > v[0]) v[i] = 3 * i - 1; return v;
} </c>
Assume that the size of pointers, int, and unsigned long is 32 bits and that the size of double is 64 bits.
The Postfix code for the above code is as follows: (code has not been thoroughly checked: bug reports are welcome)
<asm>
DATA ALIGN LABEL a CONST 10
DATA ; "static" variables are always initialized ALIGN LABEL v CONST 0 ; this is a null pointer </asm>
<asm> EXTERN malloc </asm>
In the following, BB# means "basic block #".
<asm>
TEXT ALIGN LABEL mkvec ENTER 8 ; s@-4 v@-8 LOCV 8 INT 1 LT JZ ifend1
INT 0 POP LEAVE RET
ALIGN LABEL ifend1 INT 8 ; sizeof(double) LOCA -4 LOCV +8 LOCV -4 MUL CALL malloc
TRASH 4 PUSH LOCA -8 LOCV -8 POP LEAVE RET
</asm>
In the following, BB# means "basic block #".
<asm>
TEXT ALIGN GLOBAL compute, FUNC LABEL compute ENTER 4 ; i@-4 ADDRV a INT 4 MUL CALL mkvec
TRASH 4 PUSH DUP ADDRA v TRASH 4 INT 1 LOCA -4
ALIGN LABEL fortest LOCV -4 ADDRV a LT JZ forend
ADDRV v LOCV -4 INT 8 MUL ADD DLOAD ADDRV v INT 0 INT 8 MUL ADD DLOAD DCMP INT 0 GT JZ ifend2
INT 3 LOCV -4 MUL INT 1 SUB I2D DDUP ADDRV v LOCV -4 INT 8 MUL ADD DSTORE TRASH 8
ALIGN LABEL ifend2 ALIGN LABEL forincr LOCV -4 DUP INT 1 ADD LOCA -4 TRASH 4 JMP fortest
ALIGN LABEL forend ADDRV v POP LEAVE RET
</asm>
To compile the Postfix code directly, pf2asm can be used (assuming a 32-bit architecture):