// Copyright 2017 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. package arm64asm import ( "strings" ) // 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. func GNUSyntax(inst Inst) string { switch inst.Op { case RET: if r, ok := inst.Args[0].(Reg); ok && r == X30 { return "ret" } case B: if _, ok := inst.Args[0].(Cond); ok { return strings.ToLower("b." + inst.Args[0].String() + " " + inst.Args[1].String()) } case SYSL: result := strings.ToLower(inst.String()) return strings.Replace(result, "c", "C", -1) case DCPS1, DCPS2, DCPS3, CLREX: return strings.ToLower(strings.TrimSpace(inst.String())) case ISB: if strings.Contains(inst.String(), "SY") { result := strings.TrimSuffix(inst.String(), " SY") return strings.ToLower(result) } } return strings.ToLower(inst.String()) }