示例#1
0
                                // GNUSyntax returns the GNU assembler syntax for the instruction, as defined by GNU binutils.
                                // This form typically matches the syntax defined in the ARM Reference Manual.
                                public static @string GNUSyntax(Inst inst)
                                {
                                    bytes.Buffer buf = default;
                                    var          op  = inst.Op.String();

                                    op = saveDot.Replace(op);
                                    op = strings.Replace(op, ".", "", -1L);
                                    op = strings.Replace(op, "_dot_", ".", -1L);
                                    op = strings.ToLower(op);
                                    buf.WriteString(op);
                                    @string sep = " ";

                                    foreach (var(i, arg) in inst.Args)
                                    {
                                        if (arg == null)
                                        {
                                            break;
                                        }

                                        var text = gnuArg(_addr_inst, i, arg);
                                        if (text == "")
                                        {
                                            continue;
                                        }

                                        buf.WriteString(sep);
                                        sep = ", ";
                                        buf.WriteString(text);
                                    }
                                    return(buf.String());
                                }
示例#2
0
        /*
         * Helpers for building cmd/go and cmd/cgo.
         */

        // mkzdefaultcc writes zdefaultcc.go:
        //
        //    package main
        //    const defaultCC = <defaultcc>
        //    const defaultCXX = <defaultcxx>
        //    const defaultPkgConfig = <defaultpkgconfig>
        //
        // It is invoked to write cmd/go/internal/cfg/zdefaultcc.go
        // but we also write cmd/cgo/zdefaultcc.go
        private static void mkzdefaultcc(@string dir, @string file)
        {
            if (strings.Contains(file, filepath.FromSlash("go/internal/cfg")))
            {
                ref bytes.Buffer buf = ref heap(out ptr <bytes.Buffer> _addr_buf);
                fmt.Fprintf(_addr_buf, "// Code generated by go tool dist; DO NOT EDIT.\n");
                fmt.Fprintln(_addr_buf);
                fmt.Fprintf(_addr_buf, "package cfg\n");
                fmt.Fprintln(_addr_buf);
                fmt.Fprintf(_addr_buf, "const DefaultPkgConfig = `%s`\n", defaultpkgconfig);
                buf.WriteString(defaultCCFunc("DefaultCC", defaultcc));
                buf.WriteString(defaultCCFunc("DefaultCXX", defaultcxx));
                writefile(buf.String(), file, writeSkipSame);
                return;
            }
示例#3
0
文件: inst.cs 项目: zjmit/go2cs
                                public static @string String(this Inst i)
                                {
                                    bytes.Buffer buf = default;
                                    buf.WriteString(i.Op.String());
                                    foreach (var(j, arg) in i.Args)
                                    {
                                        if (arg == null)
                                        {
                                            break;
                                        }

                                        if (j == 0L)
                                        {
                                            buf.WriteString(" ");
                                        }
                                        else
                                        {
                                            buf.WriteString(", ");
                                        }

                                        buf.WriteString(arg.String());
                                    }
                                    return(buf.String());
                                }
示例#4
0
文件: gnu.cs 项目: zjmit/go2cs
                                // GNUSyntax returns the GNU assembler syntax for the instruction, as defined by GNU binutils.
                                // This form typically matches the syntax defined in the Power ISA Reference Manual.
                                public static @string GNUSyntax(Inst inst, ulong pc)
                                {
                                    bytes.Buffer buf = default;
                                    // When there are all 0s, identify them as the disassembler
                                    // in binutils would.
                                    if (inst.Enc == 0L)
                                    {
                                        return(".long 0x0");
                                    }
                                    else if (inst.Op == 0L)
                                    {
                                        return("error: unknown instruction");
                                    }

                                    var PC = pc;
                                    // Special handling for some ops
                                    long    startArg = 0L;
                                    @string sep      = " ";

                                    switch (inst.Op.String())
                                    {
                                    case "bc":
                                        var bo = gnuArg(_addr_inst, 0L, inst.Args[0L], PC);
                                        var bi = inst.Args[1L];
                                        switch (bi.type())
                                        {
                                        case CondReg bi:
                                            if (bi >= CR0)
                                            {
                                                if (bi == CR0 && bo == "16")
                                                {
                                                    buf.WriteString("bdnz");
                                                }

                                                buf.WriteString(fmt.Sprintf("bc cr%d", bi - CR0));
                                            }

                                            var cr = bi / 4L;
                                            switch (bo)
                                            {
                                            case "4":
                                                var bit = condBitNeg[(bi - Cond0LT) % 4L];
                                                if (cr == 0L)
                                                {
                                                    buf.WriteString(fmt.Sprintf("b%s", bit));
                                                }
                                                else
                                                {
                                                    buf.WriteString(fmt.Sprintf("b%s cr%d,", bit, cr));
                                                    sep = "";
                                                }

                                                break;

                                            case "12":
                                                bit = condBit[(bi - Cond0LT) % 4L];
                                                if (cr == 0L)
                                                {
                                                    buf.WriteString(fmt.Sprintf("b%s", bit));
                                                }
                                                else
                                                {
                                                    buf.WriteString(fmt.Sprintf("b%s cr%d,", bit, cr));
                                                    sep = "";
                                                }

                                                break;

                                            case "8":
                                                bit = condBit[(bi - Cond0LT) % 4L];
                                                sep = "";
                                                if (cr == 0L)
                                                {
                                                    buf.WriteString(fmt.Sprintf("bdnzt %s,", bit));
                                                }
                                                else
                                                {
                                                    buf.WriteString(fmt.Sprintf("bdnzt cr%d,%s,", cr, bit));
                                                }

                                                break;

                                            case "16":
                                                if (cr == 0L && bi == Cond0LT)
                                                {
                                                    buf.WriteString("bdnz");
                                                }
                                                else
                                                {
                                                    buf.WriteString(fmt.Sprintf("bdnz cr%d,", cr));
                                                    sep = "";
                                                }

                                                break;
                                            }
                                            startArg = 2L;
                                            break;

                                        default:
                                        {
                                            var bi = bi.type();
                                            fmt.Printf("Unexpected bi: %d for bc with bo: %s\n", bi, bo);
                                            break;
                                        }
                                        }
                                        startArg = 2L;
                                        break;

                                    case "mtspr":
                                        var opcode = inst.Op.String();
                                        buf.WriteString(opcode[0L..2L]);