mirror of
https://github.com/golang/go
synced 2024-10-04 16:21:22 -06:00
2cae0591cd
We now use the %A, %D, %P, and %R routines from liblink across the board. Fixes #7178. Fixes #7055. LGTM=iant R=golang-codereviews, gobot, rsc, dave, iant, remyoudompheng CC=golang-codereviews https://golang.org/cl/49170043
137 lines
2.9 KiB
C
137 lines
2.9 KiB
C
// Copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
#ifndef EXTERN
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
#include "../gc/go.h"
|
|
#include "../8l/8.out.h"
|
|
|
|
#define TEXTFLAG from.scale
|
|
|
|
// foptoas flags
|
|
enum
|
|
{
|
|
Frev = 1<<0,
|
|
Fpop = 1<<1,
|
|
Fpop2 = 1<<2,
|
|
};
|
|
|
|
EXTERN int32 dynloc;
|
|
EXTERN uchar reg[D_NONE];
|
|
EXTERN int32 pcloc; // instruction counter
|
|
EXTERN Strlit emptystring;
|
|
EXTERN Prog zprog;
|
|
EXTERN Node* newproc;
|
|
EXTERN Node* deferproc;
|
|
EXTERN Node* deferreturn;
|
|
EXTERN Node* panicindex;
|
|
EXTERN Node* panicslice;
|
|
EXTERN Node* throwreturn;
|
|
EXTERN int maxstksize;
|
|
extern uint32 unmappedzero;
|
|
|
|
|
|
/*
|
|
* ggen.c
|
|
*/
|
|
void compile(Node*);
|
|
void gen(Node*);
|
|
Node* lookdot(Node*, Node*, int);
|
|
void cgen_as(Node*, Node*);
|
|
void cgen_callmeth(Node*, int);
|
|
void cgen_callinter(Node*, Node*, int);
|
|
void cgen_proc(Node*, int);
|
|
void cgen_callret(Node*, Node*);
|
|
void cgen_div(int, Node*, Node*, Node*);
|
|
void cgen_bmul(int, Node*, Node*, Node*);
|
|
void cgen_hmul(Node*, Node*, Node*);
|
|
void cgen_shift(int, int, Node*, Node*, Node*);
|
|
void cgen_float(Node*, Node*);
|
|
void bgen_float(Node *n, int true, int likely, Prog *to);
|
|
void cgen_dcl(Node*);
|
|
int needconvert(Type*, Type*);
|
|
void genconv(Type*, Type*);
|
|
void allocparams(void);
|
|
void checklabels(void);
|
|
void ginscall(Node*, int);
|
|
|
|
/*
|
|
* cgen.c
|
|
*/
|
|
void agen(Node*, Node*);
|
|
void igen(Node*, Node*, Node*);
|
|
vlong fieldoffset(Type*, Node*);
|
|
void sgen(Node*, Node*, int64);
|
|
void gmove(Node*, Node*);
|
|
Prog* gins(int, Node*, Node*);
|
|
int samaddr(Node*, Node*);
|
|
void naddr(Node*, Addr*, int);
|
|
void cgen_aret(Node*, Node*);
|
|
Node* ncon(uint32);
|
|
void mgen(Node*, Node*, Node*);
|
|
void mfree(Node*);
|
|
int componentgen(Node*, Node*);
|
|
|
|
/*
|
|
* cgen64.c
|
|
*/
|
|
void cmp64(Node*, Node*, int, int, Prog*);
|
|
void cgen64(Node*, Node*);
|
|
|
|
/*
|
|
* gsubr.c
|
|
*/
|
|
void clearp(Prog*);
|
|
Prog* gbranch(int, Type*, int);
|
|
Prog* prog(int);
|
|
void gconv(int, int);
|
|
int conv2pt(Type*);
|
|
vlong convvtox(vlong, int);
|
|
void fnparam(Type*, int, int);
|
|
Prog* gop(int, Node*, Node*, Node*);
|
|
int optoas(int, Type*);
|
|
int foptoas(int, Type*, int);
|
|
void ginit(void);
|
|
void gclean(void);
|
|
void regalloc(Node*, Type*, Node*);
|
|
void regfree(Node*);
|
|
Node* nodarg(Type*, int);
|
|
void nodreg(Node*, Type*, int);
|
|
void nodindreg(Node*, Type*, int);
|
|
void nodconst(Node*, Type*, int64);
|
|
void gconreg(int, vlong, int);
|
|
void buildtxt(void);
|
|
Plist* newplist(void);
|
|
int isfat(Type*);
|
|
void sudoclean(void);
|
|
int sudoaddable(int, Node*, Addr*);
|
|
int dotaddable(Node*, Node*);
|
|
void afunclit(Addr*, Node*);
|
|
void split64(Node*, Node*, Node*);
|
|
void splitclean(void);
|
|
void nswap(Node*, Node*);
|
|
void gtrack(Sym*);
|
|
void gargsize(int32);
|
|
/*
|
|
* cplx.c
|
|
*/
|
|
int complexop(Node*, Node*);
|
|
void complexmove(Node*, Node*);
|
|
void complexgen(Node*, Node*);
|
|
|
|
/*
|
|
* gobj.c
|
|
*/
|
|
void datastring(char*, int, Addr*);
|
|
void datagostring(Strlit*, Addr*);
|
|
|
|
/*
|
|
* list.c
|
|
*/
|
|
void listinit(void);
|
|
|
|
void zaddr(Biobuf*, Addr*, int, int);
|