// 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()); }
/* * 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; }
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()); }
// 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]);