當前位置: 首頁>>代碼示例>>Golang>>正文


Golang Prog.As方法代碼示例

本文整理匯總了Golang中cmd/internal/obj.Prog.As方法的典型用法代碼示例。如果您正苦於以下問題:Golang Prog.As方法的具體用法?Golang Prog.As怎麽用?Golang Prog.As使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在cmd/internal/obj.Prog的用法示例。


在下文中一共展示了Prog.As方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。

示例1: stacksplitPost

func stacksplitPost(ctxt *obj.Link, p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog) *obj.Prog {

    // MOVD	LR, R5
    p = obj.Appendp(ctxt, p)
    pPre.Pcond = p
    p.As = AMOVD
    p.From.Type = obj.TYPE_REG
    p.From.Reg = REG_LR
    p.To.Type = obj.TYPE_REG
    p.To.Reg = REG_R5
    if pPreempt != nil {
        pPreempt.Pcond = p
    }

    // BL	runtime.morestack(SB)
    p = obj.Appendp(ctxt, p)

    p.As = ABL
    p.To.Type = obj.TYPE_BRANCH
    if ctxt.Cursym.Cfunc {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestackc", 0)
    } else if ctxt.Cursym.Text.From3.Offset&obj.NEEDCTXT == 0 {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack_noctxt", 0)
    } else {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack", 0)
    }

    // BR	start
    p = obj.Appendp(ctxt, p)

    p.As = ABR
    p.To.Type = obj.TYPE_BRANCH
    p.Pcond = ctxt.Cursym.Text.Link
    return p
}
開發者ID:hurkgu,項目名稱:go,代碼行數:35,代碼來源:objz.go

示例2: expandchecks

// Called after regopt and peep have run.
// Expand CHECKNIL pseudo-op into actual nil pointer check.
func expandchecks(firstp *obj.Prog) {
    var p1 *obj.Prog
    var p2 *obj.Prog

    for p := firstp; p != nil; p = p.Link {
        if p.As != obj.ACHECKNIL {
            continue
        }
        if gc.Debug_checknil != 0 && p.Lineno > 1 { // p->lineno==1 in generated wrappers
            gc.Warnl(int(p.Lineno), "generated nil check")
        }

        // check is
        //	CMP arg, $0
        //	JNE 2(PC) (likely)
        //	MOV AX, 0
        p1 = gc.Ctxt.NewProg()

        p2 = gc.Ctxt.NewProg()
        gc.Clearp(p1)
        gc.Clearp(p2)
        p1.Link = p2
        p2.Link = p.Link
        p.Link = p1
        p1.Lineno = p.Lineno
        p2.Lineno = p.Lineno
        p1.Pc = 9999
        p2.Pc = 9999
        p.As = int16(cmpptr)
        p.To.Type = obj.TYPE_CONST
        p.To.Offset = 0
        p1.As = x86.AJNE
        p1.From.Type = obj.TYPE_CONST
        p1.From.Offset = 1 // likely
        p1.To.Type = obj.TYPE_BRANCH
        p1.To.Val = p2.Link

        // crash by write to memory address 0.
        // if possible, since we know arg is 0, use 0(arg),
        // which will be shorter to encode than plain 0.
        p2.As = x86.AMOVL

        p2.From.Type = obj.TYPE_REG
        p2.From.Reg = x86.REG_AX
        if regtyp(&p.From) {
            p2.To.Type = obj.TYPE_MEM
            p2.To.Reg = p.From.Reg
        } else {
            p2.To.Type = obj.TYPE_MEM
            p2.To.Reg = x86.REG_NONE
        }

        p2.To.Offset = 0
    }
}
開發者ID:xslonepiece,項目名稱:goios,代碼行數:57,代碼來源:ggen.go

示例3: expandchecks

// Called after regopt and peep have run.
// Expand CHECKNIL pseudo-op into actual nil pointer check.
func expandchecks(firstp *obj.Prog) {
    var p1 *obj.Prog
    var p2 *obj.Prog

    for p := (*obj.Prog)(firstp); p != nil; p = p.Link {
        if gc.Debug_checknil != 0 && gc.Ctxt.Debugvlog != 0 {
            fmt.Printf("expandchecks: %v\n", p)
        }
        if p.As != obj.ACHECKNIL {
            continue
        }
        if gc.Debug_checknil != 0 && p.Lineno > 1 { // p->lineno==1 in generated wrappers
            gc.Warnl(int(p.Lineno), "generated nil check")
        }
        if p.From.Type != obj.TYPE_REG {
            gc.Fatal("invalid nil check %v\n", p)
        }

        // check is
        //	CMP arg, ZR
        //	BNE 2(PC) [likely]
        //	MOVD ZR, 0(arg)
        p1 = gc.Ctxt.NewProg()

        p2 = gc.Ctxt.NewProg()
        gc.Clearp(p1)
        gc.Clearp(p2)
        p1.Link = p2
        p2.Link = p.Link
        p.Link = p1
        p1.Lineno = p.Lineno
        p2.Lineno = p.Lineno
        p1.Pc = 9999
        p2.Pc = 9999
        p.As = arm64.ACMP
        p.Reg = arm64.REGZERO
        p1.As = arm64.ABNE

        //p1->from.type = TYPE_CONST;
        //p1->from.offset = 1; // likely
        p1.To.Type = obj.TYPE_BRANCH

        p1.To.Val = p2.Link

        // crash by write to memory address 0.
        p2.As = arm64.AMOVD
        p2.From.Type = obj.TYPE_REG
        p2.From.Reg = arm64.REGZERO
        p2.To.Type = obj.TYPE_MEM
        p2.To.Reg = p.From.Reg
        p2.To.Offset = 0
    }
}
開發者ID:tidatida,項目名稱:go,代碼行數:55,代碼來源:ggen.go

示例4: stacksplitPost

func stacksplitPost(ctxt *obj.Link, p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, framesize int32) *obj.Prog {
    // Now we are at the end of the function, but logically
    // we are still in function prologue. We need to fix the
    // SP data and PCDATA.
    spfix := obj.Appendp(ctxt, p)
    spfix.As = obj.ANOP
    spfix.Spadj = -framesize

    pcdata := obj.Appendp(ctxt, spfix)
    pcdata.Lineno = ctxt.Cursym.Text.Lineno
    pcdata.Mode = ctxt.Cursym.Text.Mode
    pcdata.As = obj.APCDATA
    pcdata.From.Type = obj.TYPE_CONST
    pcdata.From.Offset = obj.PCDATA_StackMapIndex
    pcdata.To.Type = obj.TYPE_CONST
    pcdata.To.Offset = -1 // pcdata starts at -1 at function entry

    // MOVD	LR, R5
    p = obj.Appendp(ctxt, pcdata)
    pPre.Pcond = p
    p.As = AMOVD
    p.From.Type = obj.TYPE_REG
    p.From.Reg = REG_LR
    p.To.Type = obj.TYPE_REG
    p.To.Reg = REG_R5
    if pPreempt != nil {
        pPreempt.Pcond = p
    }

    // BL	runtime.morestack(SB)
    p = obj.Appendp(ctxt, p)

    p.As = ABL
    p.To.Type = obj.TYPE_BRANCH
    if ctxt.Cursym.Cfunc {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestackc", 0)
    } else if ctxt.Cursym.Text.From3.Offset&obj.NEEDCTXT == 0 {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack_noctxt", 0)
    } else {
        p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack", 0)
    }

    // BR	start
    p = obj.Appendp(ctxt, p)

    p.As = ABR
    p.To.Type = obj.TYPE_BRANCH
    p.Pcond = ctxt.Cursym.Text.Link
    return p
}
開發者ID:kuangchanglang,項目名稱:go,代碼行數:50,代碼來源:objz.go

示例5: outgcode

func outgcode(a int, g1 *obj.Addr, reg int, g2, g3 *obj.Addr) {
    var p *obj.Prog
    var pl *obj.Plist

    if asm.Pass == 1 {
        goto out
    }

    p = asm.Ctxt.NewProg()
    p.As = int16(a)
    p.Lineno = stmtline
    if nosched != 0 {
        p.Mark |= ppc64.NOSCHED
    }
    p.From = *g1
    p.Reg = int16(reg)
    p.From3 = *g2
    p.To = *g3
    p.Pc = int64(asm.PC)

    if lastpc == nil {
        pl = obj.Linknewplist(asm.Ctxt)
        pl.Firstpc = p
    } else {
        lastpc.Link = p
    }
    lastpc = p

out:
    if a != obj.AGLOBL && a != obj.ADATA {
        asm.PC++
    }
}
開發者ID:klueska,項目名稱:go-akaros,代碼行數:33,代碼來源:lex.go

示例6: outcode

func outcode(a int, g2 *Addr2) {
    var p *obj.Prog
    var pl *obj.Plist

    if asm.Pass == 1 {
        goto out
    }

    p = new(obj.Prog)
    *p = obj.Prog{}
    p.Ctxt = asm.Ctxt
    p.As = int16(a)
    p.Lineno = stmtline
    p.From = g2.from
    p.To = g2.to
    p.Pc = int64(asm.PC)

    if lastpc == nil {
        pl = obj.Linknewplist(asm.Ctxt)
        pl.Firstpc = p
    } else {

        lastpc.Link = p
    }
    lastpc = p

out:
    if a != obj.AGLOBL && a != obj.ADATA {
        asm.PC++
    }
}
開發者ID:Ericean,項目名稱:go,代碼行數:31,代碼來源:lex.go

示例7: Prog

func Prog(as int) *obj.Prog {
    var p *obj.Prog

    if as == obj.ADATA || as == obj.AGLOBL {
        if ddumped != 0 {
            Fatalf("already dumped data")
        }
        if dpc == nil {
            dpc = Ctxt.NewProg()
            dfirst = dpc
        }

        p = dpc
        dpc = Ctxt.NewProg()
        p.Link = dpc
    } else {
        p = Pc
        Pc = Ctxt.NewProg()
        Clearp(Pc)
        p.Link = Pc
    }

    if lineno == 0 {
        if Debug['K'] != 0 {
            Warn("prog: line 0")
        }
    }

    p.As = int16(as)
    p.Lineno = lineno
    return p
}
開發者ID:Ryezhang,項目名稱:go,代碼行數:32,代碼來源:gsubr.go

示例8: rewriteToPcrel

func rewriteToPcrel(ctxt *obj.Link, p *obj.Prog) {
    // RegTo2 is set on the instructions we insert here so they don't get
    // processed twice.
    if p.RegTo2 != 0 {
        return
    }
    if p.As == obj.ATEXT || p.As == obj.AFUNCDATA || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.AJMP {
        return
    }
    // Any Prog (aside from the above special cases) with an Addr with Name ==
    // NAME_EXTERN, NAME_STATIC or NAME_GOTREF has a CALL __x86.get_pc_thunk.cx
    // inserted before it.
    isName := func(a *obj.Addr) bool {
        if a.Sym == nil || (a.Type != obj.TYPE_MEM && a.Type != obj.TYPE_ADDR) || a.Reg != 0 {
            return false
        }
        if a.Sym.Type == obj.STLSBSS {
            return false
        }
        return a.Name == obj.NAME_EXTERN || a.Name == obj.NAME_STATIC || a.Name == obj.NAME_GOTREF
    }

    if isName(&p.From) && p.From.Type == obj.TYPE_ADDR {
        // Handle things like "MOVL $sym, (SP)" or "PUSHL $sym" by rewriting
        // to "MOVL $sym, CX; MOVL CX, (SP)" or "MOVL $sym, CX; PUSHL CX"
        // respectively.
        if p.To.Type != obj.TYPE_REG {
            q := obj.Appendp(ctxt, p)
            q.As = p.As
            q.From.Type = obj.TYPE_REG
            q.From.Reg = REG_CX
            q.To = p.To
            p.As = AMOVL
            p.To.Type = obj.TYPE_REG
            p.To.Reg = REG_CX
            p.To.Sym = nil
            p.To.Name = obj.NAME_NONE
        }
    }

    if !isName(&p.From) && !isName(&p.To) && (p.From3 == nil || !isName(p.From3)) {
        return
    }
    q := obj.Appendp(ctxt, p)
    q.RegTo2 = 1
    r := obj.Appendp(ctxt, q)
    r.RegTo2 = 1
    q.As = obj.ACALL
    q.To.Sym = obj.Linklookup(ctxt, "__x86.get_pc_thunk.cx", 0)
    q.To.Type = obj.TYPE_MEM
    q.To.Name = obj.NAME_EXTERN
    q.To.Sym.Local = true
    r.As = p.As
    r.Scond = p.Scond
    r.From = p.From
    r.From3 = p.From3
    r.Reg = p.Reg
    r.To = p.To
    obj.Nopout(p)
}
開發者ID:duhaibo0404,項目名稱:go-1,代碼行數:60,代碼來源:obj6.go

示例9: load_g_cx

// Append code to p to load g into cx.
// Overwrites p with the first instruction (no first appendp).
// Overwriting p is unusual but it lets use this in both the
// prologue (caller must call appendp first) and in the epilogue.
// Returns last new instruction.
func load_g_cx(ctxt *obj.Link, p *obj.Prog) *obj.Prog {
    p.As = AMOVQ
    if ctxt.Arch.PtrSize == 4 {
        p.As = AMOVL
    }
    p.From.Type = obj.TYPE_MEM
    p.From.Reg = REG_TLS
    p.From.Offset = 0
    p.To.Type = obj.TYPE_REG
    p.To.Reg = REG_CX

    next := p.Link
    progedit(ctxt, p)
    for p.Link != next {
        p = p.Link
    }

    if p.From.Index == REG_TLS {
        p.From.Scale = 2
    }

    return p
}
開發者ID:achanda,項目名稱:go,代碼行數:28,代碼來源:obj6.go

示例10: ARMConditionCodes

// ARMConditionCodes handles the special condition code situation for the ARM.
// It returns a boolean to indicate success; failure means cond was unrecognized.
func ARMConditionCodes(prog *obj.Prog, cond string) bool {
    if cond == "" {
        return true
    }
    bits, ok := ParseARMCondition(cond)
    if !ok {
        return false
    }
    /* hack to make B.NE etc. work: turn it into the corresponding conditional */
    if prog.As == arm.AB {
        prog.As = int16(bcode[(bits^arm.C_SCOND_XOR)&0xf])
        bits = (bits &^ 0xf) | arm.C_SCOND_NONE
    }
    prog.Scond = bits
    return true
}
開發者ID:danny8002,項目名稱:go,代碼行數:18,代碼來源:arm.go

示例11: Prog

func Prog(as obj.As) *obj.Prog {
    var p *obj.Prog

    p = pc
    pc = Ctxt.NewProg()
    Clearp(pc)
    p.Link = pc

    if lineno == 0 && Debug['K'] != 0 {
        Warn("prog: line 0")
    }

    p.As = as
    p.Lineno = lineno
    return p
}
開發者ID:kuangchanglang,項目名稱:go,代碼行數:16,代碼來源:gsubr.go

示例12: outcode

func outcode(a int, g1 *obj.Addr, reg int, g2 *obj.Addr) {
    var p *obj.Prog
    var pl *obj.Plist

    if asm.Pass == 1 {
        goto out
    }

    if g1.Scale != 0 {
        if reg != 0 || g2.Scale != 0 {
            yyerror("bad addressing modes")
        }
        reg = int(g1.Scale)
    } else if g2.Scale != 0 {
        if reg != 0 {
            yyerror("bad addressing modes")
        }
        reg = int(g2.Scale)
    }

    p = asm.Ctxt.NewProg()
    p.As = int16(a)
    p.Lineno = stmtline
    if nosched != 0 {
        p.Mark |= ppc64.NOSCHED
    }
    p.From = *g1
    p.Reg = int16(reg)
    p.To = *g2
    p.Pc = int64(asm.PC)

    if lastpc == nil {
        pl = obj.Linknewplist(asm.Ctxt)
        pl.Firstpc = p
    } else {
        lastpc.Link = p
    }
    lastpc = p

out:
    if a != obj.AGLOBL && a != obj.ADATA {
        asm.PC++
    }
}
開發者ID:klueska,項目名稱:go-akaros,代碼行數:44,代碼來源:lex.go

示例13: expandchecks

// Called after regopt and peep have run.
// Expand CHECKNIL pseudo-op into actual nil pointer check.
func expandchecks(firstp *obj.Prog) {
    var reg int
    var p1 *obj.Prog

    for p := firstp; p != nil; p = p.Link {
        if p.As != obj.ACHECKNIL {
            continue
        }
        if gc.Debug_checknil != 0 && p.Lineno > 1 { // p->lineno==1 in generated wrappers
            gc.Warnl(int(p.Lineno), "generated nil check")
        }
        if p.From.Type != obj.TYPE_REG {
            gc.Fatalf("invalid nil check %v", p)
        }
        reg = int(p.From.Reg)

        // check is
        //	CMP arg, $0
        //	MOV.EQ arg, 0(arg)
        p1 = gc.Ctxt.NewProg()

        gc.Clearp(p1)
        p1.Link = p.Link
        p.Link = p1
        p1.Lineno = p.Lineno
        p1.Pc = 9999
        p1.As = arm.AMOVW
        p1.From.Type = obj.TYPE_REG
        p1.From.Reg = int16(reg)
        p1.To.Type = obj.TYPE_MEM
        p1.To.Reg = int16(reg)
        p1.To.Offset = 0
        p1.Scond = arm.C_SCOND_EQ
        p.As = arm.ACMP
        p.From.Type = obj.TYPE_CONST
        p.From.Reg = 0
        p.From.Offset = 0
        p.Reg = int16(reg)
    }
}
開發者ID:arnold8,項目名稱:go,代碼行數:42,代碼來源:ggen.go

示例14: expandchecks

// Called after regopt and peep have run.
// Expand CHECKNIL pseudo-op into actual nil pointer check.
func expandchecks(firstp *obj.Prog) {
    var p1 *obj.Prog

    for p := (*obj.Prog)(firstp); p != nil; p = p.Link {
        if gc.Debug_checknil != 0 && gc.Ctxt.Debugvlog != 0 {
            fmt.Printf("expandchecks: %v\n", p)
        }
        if p.As != obj.ACHECKNIL {
            continue
        }
        if gc.Debug_checknil != 0 && p.Lineno > 1 { // p->lineno==1 in generated wrappers
            gc.Warnl(int(p.Lineno), "generated nil check")
        }
        if p.From.Type != obj.TYPE_REG {
            gc.Fatalf("invalid nil check %v\n", p)
        }

        // check is
        //	CBNZ arg, 2(PC)
        //	MOVD ZR, 0(arg)
        p1 = gc.Ctxt.NewProg()
        gc.Clearp(p1)
        p1.Link = p.Link
        p.Link = p1
        p1.Lineno = p.Lineno
        p1.Pc = 9999

        p.As = arm64.ACBNZ
        p.To.Type = obj.TYPE_BRANCH
        p.To.Val = p1.Link

        // crash by write to memory address 0.
        p1.As = arm64.AMOVD
        p1.From.Type = obj.TYPE_REG
        p1.From.Reg = arm64.REGZERO
        p1.To.Type = obj.TYPE_MEM
        p1.To.Reg = p.From.Reg
        p1.To.Offset = 0
    }
}
開發者ID:rentongzhang,項目名稱:go,代碼行數:42,代碼來源:ggen.go

示例15: span0

func span0(ctxt *obj.Link, cursym *obj.LSym) {
    p := cursym.Text
    if p == nil || p.Link == nil { // handle external functions and ELF section symbols
        return
    }
    ctxt.Cursym = cursym
    ctxt.Autosize = int32(p.To.Offset + 8)

    if oprange[AOR&obj.AMask].start == nil {
        buildop(ctxt)
    }

    c := int64(0)
    p.Pc = c

    var m int
    var o *Optab
    for p = p.Link; p != nil; p = p.Link {
        ctxt.Curp = p
        p.Pc = c
        o = oplook(ctxt, p)
        m = int(o.size)
        if m == 0 {
            if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA && p.As != obj.AUSEFIELD {
                ctxt.Diag("zero-width instruction\n%v", p)
            }
            continue
        }

        c += int64(m)
    }

    cursym.Size = c

    /*
     * if any procedure is large enough to
     * generate a large SBRA branch, then
     * generate extra passes putting branches
     * around jmps to fix. this is rare.
     */
    bflag := 1

    var otxt int64
    var q *obj.Prog
    for bflag != 0 {
        if ctxt.Debugvlog != 0 {
            fmt.Fprintf(ctxt.Bso, "%5.2f span1\n", obj.Cputime())
        }
        bflag = 0
        c = 0
        for p = cursym.Text.Link; p != nil; p = p.Link {
            p.Pc = c
            o = oplook(ctxt, p)

            // very large conditional branches
            if o.type_ == 6 && p.Pcond != nil {
                otxt = p.Pcond.Pc - c
                if otxt < -(1<<17)+10 || otxt >= (1<<17)-10 {
                    q = ctxt.NewProg()
                    q.Link = p.Link
                    p.Link = q
                    q.As = AJMP
                    q.Lineno = p.Lineno
                    q.To.Type = obj.TYPE_BRANCH
                    q.Pcond = p.Pcond
                    p.Pcond = q
                    q = ctxt.NewProg()
                    q.Link = p.Link
                    p.Link = q
                    q.As = AJMP
                    q.Lineno = p.Lineno
                    q.To.Type = obj.TYPE_BRANCH
                    q.Pcond = q.Link.Link

                    addnop(ctxt, p.Link)
                    addnop(ctxt, p)
                    bflag = 1
                }
            }

            m = int(o.size)
            if m == 0 {
                if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA && p.As != obj.AUSEFIELD {
                    ctxt.Diag("zero-width instruction\n%v", p)
                }
                continue
            }

            c += int64(m)
        }

        cursym.Size = c
    }

    c += -c & (FuncAlign - 1)
    cursym.Size = c

    /*
     * lay out the code, emitting code and data relocations.
     */
//.........這裏部分代碼省略.........
開發者ID:danny8002,項目名稱:go,代碼行數:101,代碼來源:asm0.go


注:本文中的cmd/internal/obj.Prog.As方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。