]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/new9a/a.y
[dev.cc] cmd/new5a etc, cmd/internal/asm: edit to produce working Go code
[gostls13.git] / src / cmd / new9a / a.y
index b366146156af610e9bf4a52c8325888f94148340..25b3ca689a8fcd947bc7c377f15682a6d2f9ea34 100644 (file)
 // THE SOFTWARE.
 
 %{
-#include <u.h>
-#include <stdio.h>     /* if we don't, bison will, and a.h re-#defines getc */
-#include <libc.h>
-#include "a.h"
-#include "../../runtime/funcdata.h"
+package main
+
+import (
+       "cmd/internal/asm"
+       "cmd/internal/obj"
+       . "cmd/internal/obj/ppc64"
+)
 %}
+
 %union
 {
-       Sym     *sym;
-       vlong   lval;
-       double  dval;
-       char    sval[8];
-       Addr    addr;
+       sym *asm.Sym
+       lval int64
+       dval float64
+       sval string
+       addr obj.Addr
 }
+
 %left  '|'
 %left  '^'
 %left  '&'
@@ -69,27 +73,29 @@ prog:
 line:
        LNAME ':'
        {
-               $1 = labellookup($1);
-               if($1->type == LLAB && $1->value != pc)
-                       yyerror("redeclaration of %s", $1->labelname);
-               $1->type = LLAB;
-               $1->value = pc;
+               $1 = asm.LabelLookup($1);
+               if $1.Type == LLAB && $1.Value != int64(asm.PC) {
+                       yyerror("redeclaration of %s", $1.Labelname)
+               }
+               $1.Type = LLAB;
+               $1.Value = int64(asm.PC);
        }
        line
 |      LNAME '=' expr ';'
        {
-               $1->type = LVAR;
-               $1->value = $3;
+               $1.Type = LVAR;
+               $1.Value = $3;
        }
 |      LVAR '=' expr ';'
        {
-               if($1->value != $3)
-                       yyerror("redeclaration of %s", $1->name);
-               $1->value = $3;
+               if $1.Value != $3 {
+                       yyerror("redeclaration of %s", $1.Name)
+               }
+               $1.Value = $3;
        }
 |      LSCHED ';'
        {
-               nosched = $1;
+               nosched = int($1);
        }
 |      ';'
 |      inst ';'
@@ -101,126 +107,126 @@ inst:
  */
        LMOVW rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW addr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW regaddr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVB rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVB addr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVB regaddr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * load floats
  */
 |      LFMOV addr ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFMOV regaddr ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFMOV fimm ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFMOV freg ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFMOV freg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFMOV freg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * store ints and bytes
  */
 |      LMOVW rreg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW rreg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVB rreg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVB rreg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * store floats
  */
 |      LMOVW freg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW freg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * floating point status
  */
 |      LMOVW fpscr ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW freg ','  fpscr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW freg ',' imm ',' fpscr
        {
-               outgcode($1, &$2, NREG, &$4, &$6);
+               outgcode(int($1), &$2, NREG, &$4, &$6);
        }
 |      LMOVW fpscr ',' creg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW imm ',' fpscrf
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMTFSB imm ',' con
        {
-               outcode($1, &$2, $4, &nullgen);
+               outcode(int($1), &$2, int($4), &nullgen);
        }
 /*
  * field moves (mtcrf)
  */
 |      LMOVW rreg ',' imm ',' lcr
        {
-               outgcode($1, &$2, NREG, &$4, &$6);
+               outgcode(int($1), &$2, NREG, &$4, &$6);
        }
 |      LMOVW rreg ',' creg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW rreg ',' lcr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * integer operations
@@ -230,84 +236,84 @@ inst:
  */
 |      LADDW rreg ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LADDW imm ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LADDW rreg ',' imm ',' rreg
        {
-               outgcode($1, &$2, NREG, &$4, &$6);
+               outgcode(int($1), &$2, NREG, &$4, &$6);
        }
 |      LADDW rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LADDW imm ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LLOGW rreg ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LLOGW rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LSHW rreg ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LSHW rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LSHW imm ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LSHW imm ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LABS rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LABS rreg
        {
-               outcode($1, &$2, NREG, &$2);
+               outcode(int($1), &$2, NREG, &$2);
        }
 /*
  * multiply-accumulate
  */
 |      LMA rreg ',' sreg ',' rreg
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 /*
  * move immediate: macro for cau+or, addi, addis, and other combinations
  */
 |      LMOVW imm ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW ximm ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * condition register operations
  */
 |      LCROP cbit ',' cbit
        {
-               outcode($1, &$2, $4.reg, &$4);
+               outcode(int($1), &$2, int($4.Reg), &$4);
        }
 |      LCROP cbit ',' con ',' cbit
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 /*
  * condition register moves
@@ -315,35 +321,35 @@ inst:
  */
 |      LMOVW creg ',' creg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW psr ',' creg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW lcr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW psr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW xlreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW rreg ',' xlreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW creg ',' psr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVW rreg ',' psr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * branch, branch conditional
@@ -352,170 +358,170 @@ inst:
  */
 |      LBRA rel
        {
-               outcode($1, &nullgen, NREG, &$2);
+               outcode(int($1), &nullgen, NREG, &$2);
        }
 |      LBRA addr
        {
-               outcode($1, &nullgen, NREG, &$2);
+               outcode(int($1), &nullgen, NREG, &$2);
        }
 |      LBRA '(' xlreg ')'
        {
-               outcode($1, &nullgen, NREG, &$3);
+               outcode(int($1), &nullgen, NREG, &$3);
        }
 |      LBRA ',' rel
        {
-               outcode($1, &nullgen, NREG, &$3);
+               outcode(int($1), &nullgen, NREG, &$3);
        }
 |      LBRA ',' addr
        {
-               outcode($1, &nullgen, NREG, &$3);
+               outcode(int($1), &nullgen, NREG, &$3);
        }
 |      LBRA ',' '(' xlreg ')'
        {
-               outcode($1, &nullgen, NREG, &$4);
+               outcode(int($1), &nullgen, NREG, &$4);
        }
 |      LBRA creg ',' rel
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LBRA creg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LBRA creg ',' '(' xlreg ')'
        {
-               outcode($1, &$2, NREG, &$5);
+               outcode(int($1), &$2, NREG, &$5);
        }
 |      LBRA con ',' rel
        {
-               outcode($1, &nullgen, $2, &$4);
+               outcode(int($1), &nullgen, int($2), &$4);
        }
 |      LBRA con ',' addr
        {
-               outcode($1, &nullgen, $2, &$4);
+               outcode(int($1), &nullgen, int($2), &$4);
        }
 |      LBRA con ',' '(' xlreg ')'
        {
-               outcode($1, &nullgen, $2, &$5);
+               outcode(int($1), &nullgen, int($2), &$5);
        }
 |      LBRA con ',' con ',' rel
        {
-               Addr g;
+               var g obj.Addr
                g = nullgen;
-               g.type = D_CONST;
-               g.offset = $2;
-               outcode($1, &g, $4, &$6);
+               g.Type_ = D_CONST;
+               g.Offset = $2;
+               outcode(int($1), &g, int($4), &$6);
        }
 |      LBRA con ',' con ',' addr
        {
-               Addr g;
+               var g obj.Addr
                g = nullgen;
-               g.type = D_CONST;
-               g.offset = $2;
-               outcode($1, &g, $4, &$6);
+               g.Type_ = D_CONST;
+               g.Offset = $2;
+               outcode(int($1), &g, int($4), &$6);
        }
 |      LBRA con ',' con ',' '(' xlreg ')'
        {
-               Addr g;
+               var g obj.Addr
                g = nullgen;
-               g.type = D_CONST;
-               g.offset = $2;
-               outcode($1, &g, $4, &$7);
+               g.Type_ = D_CONST;
+               g.Offset = $2;
+               outcode(int($1), &g, int($4), &$7);
        }
 /*
  * conditional trap
  */
 |      LTRAP rreg ',' sreg
        {
-               outcode($1, &$2, $4, &nullgen);
+               outcode(int($1), &$2, int($4), &nullgen);
        }
 |      LTRAP imm ',' sreg
        {
-               outcode($1, &$2, $4, &nullgen);
+               outcode(int($1), &$2, int($4), &nullgen);
        }
 |      LTRAP rreg comma
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 |      LTRAP comma
        {
-               outcode($1, &nullgen, NREG, &nullgen);
+               outcode(int($1), &nullgen, NREG, &nullgen);
        }
 /*
  * floating point operate
  */
 |      LFCONV freg ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFADD freg ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFADD freg ',' freg ',' freg
        {
-               outcode($1, &$2, $4.reg, &$6);
+               outcode(int($1), &$2, int($4.Reg), &$6);
        }
 |      LFMA freg ',' freg ',' freg ',' freg
        {
-               outgcode($1, &$2, $4.reg, &$6, &$8);
+               outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
        }
 |      LFCMP freg ',' freg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LFCMP freg ',' freg ',' creg
        {
-               outcode($1, &$2, $6.reg, &$4);
+               outcode(int($1), &$2, int($6.Reg), &$4);
        }
 /*
  * CMP
  */
 |      LCMP rreg ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LCMP rreg ',' imm
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LCMP rreg ',' rreg ',' creg
        {
-               outcode($1, &$2, $6.reg, &$4);
+               outcode(int($1), &$2, int($6.Reg), &$4);
        }
 |      LCMP rreg ',' imm ',' creg
        {
-               outcode($1, &$2, $6.reg, &$4);
+               outcode(int($1), &$2, int($6.Reg), &$4);
        }
 /*
  * rotate and mask
  */
 |      LRLWM  imm ',' rreg ',' imm ',' rreg
        {
-               outgcode($1, &$2, $4.reg, &$6, &$8);
+               outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
        }
 |      LRLWM  imm ',' rreg ',' mask ',' rreg
        {
-               outgcode($1, &$2, $4.reg, &$6, &$8);
+               outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
        }
 |      LRLWM  rreg ',' rreg ',' imm ',' rreg
        {
-               outgcode($1, &$2, $4.reg, &$6, &$8);
+               outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
        }
 |      LRLWM  rreg ',' rreg ',' mask ',' rreg
        {
-               outgcode($1, &$2, $4.reg, &$6, &$8);
+               outgcode(int($1), &$2, int($4.Reg), &$6, &$8);
        }
 /*
  * load/store multiple
  */
 |      LMOVMW addr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LMOVMW rreg ',' addr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * various indexed load/store
@@ -523,165 +529,169 @@ inst:
  */
 |      LXLD regaddr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LXLD regaddr ',' imm ',' rreg
        {
-               outgcode($1, &$2, NREG, &$4, &$6);
+               outgcode(int($1), &$2, NREG, &$4, &$6);
        }
 |      LXST rreg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LXST rreg ',' imm ',' regaddr
        {
-               outgcode($1, &$2, NREG, &$4, &$6);
+               outgcode(int($1), &$2, NREG, &$4, &$6);
        }
 |      LXMV regaddr ',' rreg
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LXMV rreg ',' regaddr
        {
-               outcode($1, &$2, NREG, &$4);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LXOP regaddr
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 /*
  * NOP
  */
 |      LNOP comma
        {
-               outcode($1, &nullgen, NREG, &nullgen);
+               outcode(int($1), &nullgen, NREG, &nullgen);
        }
 |      LNOP rreg comma
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 |      LNOP freg comma
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 |      LNOP ',' rreg
        {
-               outcode($1, &nullgen, NREG, &$3);
+               outcode(int($1), &nullgen, NREG, &$3);
        }
 |      LNOP ',' freg
        {
-               outcode($1, &nullgen, NREG, &$3);
+               outcode(int($1), &nullgen, NREG, &$3);
        }
 |      LNOP imm /* SYSCALL $num: load $num to R0 before syscall and restore R0 to 0 afterwards. */
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 /*
  * word
  */
 |      LWORD imm comma
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 |      LWORD ximm comma
        {
-               outcode($1, &$2, NREG, &nullgen);
+               outcode(int($1), &$2, NREG, &nullgen);
        }
 /*
  * PCDATA
  */
 |      LPCDAT imm ',' imm
        {
-               if($2.type != D_CONST || $4.type != D_CONST)
-                       yyerror("arguments to PCDATA must be integer constants");
-               outcode($1, &$2, NREG, &$4);
+               if $2.Type_ != D_CONST || $4.Type_ != D_CONST {
+                       yyerror("arguments to PCDATA must be integer constants")
+               }
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * FUNCDATA
  */
 |      LFUNCDAT imm ',' addr
        {
-               if($2.type != D_CONST)
-                       yyerror("index for FUNCDATA must be integer constant");
-               if($4.type != D_EXTERN && $4.type != D_STATIC && $4.type != D_OREG)
-                       yyerror("value for FUNCDATA must be symbol reference");
-               outcode($1, &$2, NREG, &$4);
+               if $2.Type_ != D_CONST {
+                       yyerror("index for FUNCDATA must be integer constant")
+               }
+               if $4.Type_ != D_EXTERN && $4.Type_ != D_STATIC && $4.Type_ != D_OREG {
+                       yyerror("value for FUNCDATA must be symbol reference")
+               }
+               outcode(int($1), &$2, NREG, &$4);
        }
 /*
  * END
  */
 |      LEND comma
        {
-               outcode($1, &nullgen, NREG, &nullgen);
+               outcode(int($1), &nullgen, NREG, &nullgen);
        }
 /*
  * TEXT/GLOBL
  */
 |      LTEXT name ',' imm
        {
-               settext($2.sym);
-               outcode($1, &$2, NREG, &$4);
+               asm.Settext($2.Sym);
+               outcode(int($1), &$2, NREG, &$4);
        }
 |      LTEXT name ',' con ',' imm
        {
-               settext($2.sym);
-               $6.offset &= 0xffffffffull;
-               $6.offset |= (vlong)ArgsSizeUnknown << 32;
-               outcode($1, &$2, $4, &$6);
+               asm.Settext($2.Sym);
+               $6.Offset &= 0xffffffff;
+               $6.Offset |= -obj.ArgsSizeUnknown << 32;
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LTEXT name ',' con ',' imm '-' con
        {
-               settext($2.sym);
-               $6.offset &= 0xffffffffull;
-               $6.offset |= ($8 & 0xffffffffull) << 32;
-               outcode($1, &$2, $4, &$6);
+               asm.Settext($2.Sym);
+               $6.Offset &= 0xffffffff;
+               $6.Offset |= ($8 & 0xffffffff) << 32;
+               outcode(int($1), &$2, int($4), &$6);
        }
 /*
  * DATA
  */
 |      LDATA name '/' con ',' imm
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LDATA name '/' con ',' ximm
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 |      LDATA name '/' con ',' fimm
        {
-               outcode($1, &$2, $4, &$6);
+               outcode(int($1), &$2, int($4), &$6);
        }
 /*
  * RETURN
  */
 |      LRETRN  comma
        {
-               outcode($1, &nullgen, NREG, &nullgen);
+               outcode(int($1), &nullgen, NREG, &nullgen);
        }
 
 rel:
        con '(' LPC ')'
        {
                $$ = nullgen;
-               $$.type = D_BRANCH;
-               $$.offset = $1 + pc;
+               $$.Type_ = D_BRANCH;
+               $$.Offset = $1 + int64(asm.PC);
        }
 |      LNAME offset
        {
-               $1 = labellookup($1);
+               $1 = asm.LabelLookup($1);
                $$ = nullgen;
-               if(pass == 2 && $1->type != LLAB)
-                       yyerror("undefined label: %s", $1->labelname);
-               $$.type = D_BRANCH;
-               $$.offset = $1->value + $2;
+               if asm.Pass == 2 && $1.Type != LLAB {
+                       yyerror("undefined label: %s", $1.Labelname)
+               }
+               $$.Type_ = D_BRANCH;
+               $$.Offset = $1.Value + $2;
        }
 
 rreg:
        sreg
        {
                $$ = nullgen;
-               $$.type = D_REG;
-               $$.reg = $1;
+               $$.Type_ = D_REG;
+               $$.Reg = int8($1);
        }
 
 xlreg:
@@ -692,45 +702,45 @@ lr:
        LLR
        {
                $$ = nullgen;
-               $$.type = D_SPR;
-               $$.offset = $1;
+               $$.Type_ = D_SPR;
+               $$.Offset = $1;
        }
 
 lcr:
        LCR
        {
                $$ = nullgen;
-               $$.type = D_CREG;
-               $$.reg = NREG;  /* whole register */
+               $$.Type_ = D_CREG;
+               $$.Reg = NREG;  /* whole register */
        }
 
 ctr:
        LCTR
        {
                $$ = nullgen;
-               $$.type = D_SPR;
-               $$.offset = $1;
+               $$.Type_ = D_SPR;
+               $$.Offset = $1;
        }
 
 msr:
        LMSR
        {
                $$ = nullgen;
-               $$.type = D_MSR;
+               $$.Type_ = D_MSR;
        }
 
 psr:
        LSPREG
        {
                $$ = nullgen;
-               $$.type = D_SPR;
-               $$.offset = $1;
+               $$.Type_ = D_SPR;
+               $$.Offset = $1;
        }
 |      LSPR '(' con ')'
        {
                $$ = nullgen;
-               $$.type = $1;
-               $$.offset = $3;
+               $$.Type_ = int16($1);
+               $$.Offset = $3;
        }
 |      msr
 
@@ -738,115 +748,118 @@ fpscr:
        LFPSCR
        {
                $$ = nullgen;
-               $$.type = D_FPSCR;
-               $$.reg = NREG;
+               $$.Type_ = D_FPSCR;
+               $$.Reg = NREG;
        }
 
 fpscrf:
        LFPSCR '(' con ')'
        {
                $$ = nullgen;
-               $$.type = D_FPSCR;
-               $$.reg = $3;
+               $$.Type_ = D_FPSCR;
+               $$.Reg = int8($3);
        }
 
 freg:
        LFREG
        {
                $$ = nullgen;
-               $$.type = D_FREG;
-               $$.reg = $1;
+               $$.Type_ = D_FREG;
+               $$.Reg = int8($1);
        }
 |      LF '(' con ')'
        {
                $$ = nullgen;
-               $$.type = D_FREG;
-               $$.reg = $3;
+               $$.Type_ = D_FREG;
+               $$.Reg = int8($3);
        }
 
 creg:
        LCREG
        {
                $$ = nullgen;
-               $$.type = D_CREG;
-               $$.reg = $1;
+               $$.Type_ = D_CREG;
+               $$.Reg = int8($1);
        }
 |      LCR '(' con ')'
        {
                $$ = nullgen;
-               $$.type = D_CREG;
-               $$.reg = $3;
+               $$.Type_ = D_CREG;
+               $$.Reg = int8($3);
        }
 
 
 cbit:  con
        {
                $$ = nullgen;
-               $$.type = D_REG;
-               $$.reg = $1;
+               $$.Type_ = D_REG;
+               $$.Reg = int8($1);
        }
 
 mask:
        con ',' con
        {
-               int mb, me;
-               uint32 v;
+               var mb, me int
+               var v uint32
 
                $$ = nullgen;
-               $$.type = D_CONST;
-               mb = $1;
-               me = $3;
+               $$.Type_ = D_CONST;
+               mb = int($1);
+               me = int($3);
                if(mb < 0 || mb > 31 || me < 0 || me > 31){
                        yyerror("illegal mask start/end value(s)");
-                       mb = me = 0;
+                       mb = 0
+                       me = 0;
                }
-               if(mb <= me)
-                       v = ((uint32)~0L>>mb) & (~0L<<(31-me));
-               else
-                       v = ~(((uint32)~0L>>(me+1)) & (~0L<<(31-(mb-1))));
-               $$.offset = v;
+               if mb <= me {
+                       v = (^uint32(0)>>uint(mb)) & (^uint32(0)<<uint(31-me))
+               } else {
+                       v = (^uint32(0)>>uint(me+1)) & (^uint32(0)<<uint(31-(mb-1)))
+               }
+               $$.Offset = int64(v);
        }
 
 ximm:
        '$' addr
        {
                $$ = $2;
-               $$.type = D_CONST;
+               $$.Type_ = D_CONST;
        }
 |      '$' LSCONST
        {
                $$ = nullgen;
-               $$.type = D_SCONST;
-               memcpy($$.u.sval, $2, sizeof($$.u.sval));
+               $$.Type_ = D_SCONST;
+               $$.U.Sval = $2
        }
 
 fimm:
        '$' LFCONST
        {
                $$ = nullgen;
-               $$.type = D_FCONST;
-               $$.u.dval = $2;
+               $$.Type_ = D_FCONST;
+               $$.U.Dval = $2;
        }
 |      '$' '-' LFCONST
        {
                $$ = nullgen;
-               $$.type = D_FCONST;
-               $$.u.dval = -$3;
+               $$.Type_ = D_FCONST;
+               $$.U.Dval = -$3;
        }
 
 imm:   '$' con
        {
                $$ = nullgen;
-               $$.type = D_CONST;
-               $$.offset = $2;
+               $$.Type_ = D_CONST;
+               $$.Offset = $2;
        }
 
 sreg:
        LREG
 |      LR '(' con ')'
        {
-               if($$ < 0 || $$ >= NREG)
-                       print("register value out of range\n");
+               if $$ < 0 || $$ >= NREG {
+                       print("register value out of range\n")
+               }
                $$ = $3;
        }
 
@@ -854,17 +867,17 @@ regaddr:
        '(' sreg ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.reg = $2;
-               $$.offset = 0;
+               $$.Type_ = D_OREG;
+               $$.Reg = int8($2);
+               $$.Offset = 0;
        }
 |      '(' sreg '+' sreg ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.reg = $2;
-               $$.scale = $4;
-               $$.offset = 0;
+               $$.Type_ = D_OREG;
+               $$.Reg = int8($2);
+               $$.Scale = int8($4);
+               $$.Offset = 0;
        }
 
 addr:
@@ -872,35 +885,35 @@ addr:
 |      con '(' sreg ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.reg = $3;
-               $$.offset = $1;
+               $$.Type_ = D_OREG;
+               $$.Reg = int8($3);
+               $$.Offset = $1;
        }
 
 name:
        con '(' pointer ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.name = $3;
-               $$.sym = nil;
-               $$.offset = $1;
+               $$.Type_ = D_OREG;
+               $$.Name = int8($3);
+               $$.Sym = nil;
+               $$.Offset = $1;
        }
 |      LNAME offset '(' pointer ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.name = $4;
-               $$.sym = linklookup(ctxt, $1->name, 0);
-               $$.offset = $2;
+               $$.Type_ = D_OREG;
+               $$.Name = int8($4);
+               $$.Sym = obj.Linklookup(asm.Ctxt, $1.Name, 0);
+               $$.Offset = $2;
        }
 |      LNAME '<' '>' offset '(' LSB ')'
        {
                $$ = nullgen;
-               $$.type = D_OREG;
-               $$.name = D_STATIC;
-               $$.sym = linklookup(ctxt, $1->name, 0);
-               $$.offset = $4;
+               $$.Type_ = D_OREG;
+               $$.Name = D_STATIC;
+               $$.Sym = obj.Linklookup(asm.Ctxt, $1.Name, 0);
+               $$.Offset = $4;
        }
 
 comma:
@@ -928,7 +941,7 @@ con:
        LCONST
 |      LVAR
        {
-               $$ = $1->value;
+               $$ = $1.Value;
        }
 |      '-' con
        {
@@ -940,7 +953,7 @@ con:
        }
 |      '~' con
        {
-               $$ = ~$2;
+               $$ = ^$2;
        }
 |      '(' expr ')'
        {
@@ -971,11 +984,11 @@ expr:
        }
 |      expr '<' '<' expr
        {
-               $$ = $1 << $4;
+               $$ = $1 << uint($4);
        }
 |      expr '>' '>' expr
        {
-               $$ = $1 >> $4;
+               $$ = $1 >> uint($4);
        }
 |      expr '&' expr
        {