Difference between revisions of "Code Generation/Duplication of Floating Point Numbers on the Stack"

From Wiki**3

< Code Generation
Line 27: Line 27:
 
ALIGN
 
ALIGN
 
LABEL _L123
 
LABEL _L123
DOUBLE 3.3e-2
+
SDOUBLE 3.3e-2
  
 
;;-- load literal onto stack
 
;;-- load literal onto stack
 
TEXT
 
TEXT
 
ADDR _L123
 
ADDR _L123
DLOAD
+
LDDOUBLE
  
 
;;-- to perform the first assignment (to "e"), duplicate the value on the stack
 
;;-- to perform the first assignment (to "e"), duplicate the value on the stack
DDUP
+
DUP64
  
 
LOCAL -16  ; write value to "e"
 
LOCAL -16  ; write value to "e"
DSTORE
+
STDOUBLE
  
 
;;-- to perform the second assignment (to "d"), duplicate the value on the stack
 
;;-- to perform the second assignment (to "d"), duplicate the value on the stack
DDUP
+
DUP64
  
 
LOCAL -8  ; write value to "d"
 
LOCAL -8  ; write value to "d"
DSTORE
+
STDOUBLE
  
 
;;-- the assignments are an instruction: trash the value left on the stack
 
;;-- the assignments are an instruction: trash the value left on the stack
Line 51: Line 51:
 
;;-- now to perform the add operation
 
;;-- now to perform the add operation
 
LOCAL -8
 
LOCAL -8
DLOAD   ; load "d"
+
LDDOUBLE   ; load "d"
 
LOCAL -16
 
LOCAL -16
DLOAD ; load "e"
+
LDDOUBLE ; load "e"
  
 
DADD  ; leaves result on the stack
 
DADD  ; leaves result on the stack
Line 63: Line 63:
  
 
INT 0
 
INT 0
POP
+
STFVAL32
 
LEAVE
 
LEAVE
 
RET
 
RET

Revision as of 08:59, 2 May 2018

The following pure-Postfix program illustrates duplication of double-precision floating point numbers on the stack.

The C equivalent would be (roughly):

<c> int main() {

 extern void printd(double);
 double d, e;
 d = e = 3.3e-2;
 printd(d + e);
 return 0;

} </c>

Note that this program's code does not necessarily correspond to any particular code generator output.

Postfix code

<asm>

-- generation of the "_main" function

TEXT ALIGN GLOBAL _main, FUNC LABEL _main ENTER 16  ; d@-8 and e@-16

-- put double literal in RODATA

RODATA ALIGN LABEL _L123 SDOUBLE 3.3e-2

-- load literal onto stack

TEXT ADDR _L123 LDDOUBLE

-- to perform the first assignment (to "e"), duplicate the value on the stack

DUP64

LOCAL -16  ; write value to "e" STDOUBLE

-- to perform the second assignment (to "d"), duplicate the value on the stack

DUP64

LOCAL -8  ; write value to "d" STDOUBLE

-- the assignments are an instruction
trash the value left on the stack

TRASH 8

-- now to perform the add operation

LOCAL -8 LDDOUBLE  ; load "d" LOCAL -16 LDDOUBLE ; load "e"

DADD  ; leaves result on the stack

EXTERN printd CALL printd

TRASH 8  ; argument value no longer needed

INT 0 STFVAL32 LEAVE RET </asm>

Compiling and Running

Assuming that the code above is in file dbl.pf, the following commands would compile and run the program:

pf2asm dbl.pf
yasm -felf dbl.asm
ld -o dbl dbl.o -lrts
./dbl