// 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 '&'
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 ';'
*/
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
*/
| 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
*/
| 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
*/
| 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
*/
| 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:
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
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;
}
'(' 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:
| 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:
LCONST
| LVAR
{
- $$ = $1->value;
+ $$ = $1.Value;
}
| '-' con
{
}
| '~' con
{
- $$ = ~$2;
+ $$ = ^$2;
}
| '(' expr ')'
{
}
| expr '<' '<' expr
{
- $$ = $1 << $4;
+ $$ = $1 << uint($4);
}
| expr '>' '>' expr
{
- $$ = $1 >> $4;
+ $$ = $1 >> uint($4);
}
| expr '&' expr
{