Code Generation/Example 3

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

The Original Code

Consider the following C function:

int *click(int *x, int dim) {
  int *res, i;
  for (i = dim-2, res = x+dim-1; i >= 0; i--)
    if (x[i] > *res) res = &x[i];
  return res;
}

Postfix Code

The Postfix code for the above function is as follows:

Postfix code
TEXT
ALIGN
GLOBL click, FUNC
LABEL click
ENTER 8  ;-- x@+8 dim@+12 res@-4 i@-8

;; for init

;; i = dim-2
LOCAL 12
LDINT
INT 2
SUB
DUP32
LOCAL -8
STINT
TRASH 4

;; res = x + dim - 1
LOCAL 8
LDINT
LOCAL 12
LDINT
INT 4
MUL
ADD
INT 1
INT 4
MUL
SUB
DUP32
LOCAL -4
STINT
TRASH 4

;; for test
ALIGN
LABEL for
LOCAL -8
LDINT
INT 0
GE
JZ forend

;; for block

;; if test
LOCAL 8
LDINT ; x
LOCAL -8
LDINT; i
INT 4
MUL
ADD ; x+i
LDINT ; x[i] = *(x+i)

LOCAL -4
LDINT ; res
LDINT ; *res

GT
JZ ifend

;; if block
LOCAL 8
LDINT ; x
LOCAL -8
LDINT ; i
INT 4
MUL
ADD ; x+i = &x[i]
DUP32
LOCAL -4
STINT ; res = &x[i]
TRASH 4

ALIGN
LABEL ifend

;; for increment
ALIGN
LABEL forincr
LOCAL -8
LDINT ; i
DUP32
INT 1
SUB
LOCAL -8
STINT
TRASH 4

;; for jump to cycle
JMP for

ALIGN
LABEL forend

;; return
LOCAL -4
LDINT ; res

STFVAL32
LEAVE
RET

Compiling and Running

To compile the Postfix code directly, pf2asm can be used:

pf2asm click.pf
yasm -felf click.asm