PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
// 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 ( "fmt" "io" "sort" "strings" ) // GoSyntax returns the Go assembler syntax for the instruction. // The syntax was originally defined by Plan 9. // The pc is the program counter of the instruction, used for // expanding PC-relative addresses into absolute ones. // The symname function queries the symbol table for the program // being disassembled. Given a target address it returns the name // and base address of the symbol containing the target, if any; // otherwise it returns "", 0. // The reader text should read from the text segment using text addresses // as offsets; it is used to display pc-relative loads as constant loads. func GoSyntax(inst Inst, pc uint64, symname func(uint64) (string, uint64), text io.ReaderAt) string { if symname == nil { symname = func(uint64) (string, uint64) { return "", 0 } } var args []string for _, a := range inst.Args { if a == nil { break } args = append(args, plan9Arg(&inst, pc, symname, a)) } op := inst.Op.String() switch inst.Op { case LDR, LDRB, LDRH, LDRSB, LDRSH, LDRSW: // Check for PC-relative load. if offset, ok := inst.Args[1].(PCRel); ok { addr := pc + uint64(offset) if _, ok := inst.Args[0].(Reg); !ok { break } if s, base := symname(addr); s != "" && addr == base { args[1] = fmt.Sprintf("$%s(SB)", s) } } } // Move addressing mode into opcode suffix. suffix := "" switch inst.Op { case LDR, LDRB, LDRH, LDRSB, LDRSH, LDRSW, STR, STRB, STRH, STUR, STURB, STURH, LD1, ST1: switch mem := inst.Args[1].(type) { case MemImmediate: switch mem.Mode { case AddrOffset: // no suffix case AddrPreIndex: suffix = ".W" case AddrPostIndex, AddrPostReg: suffix = ".P" } } case STP, LDP: switch mem := inst.Args[2].(type) { case MemImmediate: switch mem.Mode { case AddrOffset: // no suffix case AddrPreIndex: suffix = ".W" case AddrPostIndex: suffix = ".P" } } } switch inst.Op { case BL: return "CALL " + args[0] case BLR: r := inst.Args[0].(Reg) regno := uint16(r) & 31 return fmt.Sprintf("CALL (R%d)", regno) case RET: if r, ok := inst.Args[0].(Reg); ok && r == X30 { return "RET" } case B: if cond, ok := inst.Args[0].(Cond); ok { return "B" + cond.String() + " " + args[1] } return "JMP" + " " + args[0] case BR: r := inst.Args[0].(Reg) regno := uint16(r) & 31 return fmt.Sprintf("JMP (R%d)", regno) case MOV: rno := -1 switch a := inst.Args[0].(type) { case Reg: rno = int(a) case RegSP: rno = int(a) case RegisterWithArrangementAndIndex: op = "VMOV" case RegisterWithArrangement: op = "VMOV" } if rno >= 0 && rno <= int(WZR) { op = "MOVW" } else if rno >= int(X0) && rno <= int(XZR) { op = "MOVD" } if _, ok := inst.Args[1].(RegisterWithArrangementAndIndex); ok { op = "VMOV" } case LDR, LDUR: var rno uint16 if r, ok := inst.Args[0].(Reg); ok { rno = uint16(r) } else { rno = uint16(inst.Args[0].(RegSP)) } if rno <= uint16(WZR) { op = "MOVWU" + suffix } else if rno >= uint16(B0) && rno <= uint16(B31) { op = "FMOVB" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(H0) && rno <= uint16(H31) { op = "FMOVH" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(S0) && rno <= uint16(S31) { op = "FMOVS" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = "FMOVD" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(Q0) && rno <= uint16(Q31) { op = "FMOVQ" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else { op = "MOVD" + suffix } case LDRB: op = "MOVBU" + suffix case LDRH: op = "MOVHU" + suffix case LDRSW: op = "MOVW" + suffix case LDRSB: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op = "MOVBW" + suffix } else { op = "MOVB" + suffix } } case LDRSH: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op = "MOVHW" + suffix } else { op = "MOVH" + suffix } } case STR, STUR: var rno uint16 if r, ok := inst.Args[0].(Reg); ok { rno = uint16(r) } else { rno = uint16(inst.Args[0].(RegSP)) } if rno <= uint16(WZR) { op = "MOVW" + suffix } else if rno >= uint16(B0) && rno <= uint16(B31) { op = "FMOVB" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(H0) && rno <= uint16(H31) { op = "FMOVH" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(S0) && rno <= uint16(S31) { op = "FMOVS" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = "FMOVD" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else if rno >= uint16(Q0) && rno <= uint16(Q31) { op = "FMOVQ" + suffix args[0] = fmt.Sprintf("F%d", rno&31) } else { op = "MOVD" + suffix } args[0], args[1] = args[1], args[0] case STRB, STURB: op = "MOVB" + suffix args[0], args[1] = args[1], args[0] case STRH, STURH: op = "MOVH" + suffix args[0], args[1] = args[1], args[0] case TBNZ, TBZ: args[0], args[1], args[2] = args[2], args[0], args[1] case MADD, MSUB, SMADDL, SMSUBL, UMADDL, UMSUBL: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[2], args[3] = args[3], args[2] case STLR: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[0], args[1] = args[1], args[0] case STLRB, STLRH: args[0], args[1] = args[1], args[0] case STLXR, STXR: if r, ok := inst.Args[1].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[1], args[2] = args[2], args[1] case STLXRB, STLXRH, STXRB, STXRH: args[1], args[2] = args[2], args[1] case BFI, BFXIL, SBFIZ, SBFX, UBFIZ, UBFX: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[1], args[2], args[3] = args[3], args[1], args[2] case LDAXP, LDXP: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[0] = fmt.Sprintf("(%s, %s)", args[0], args[1]) args[1] = args[2] return op + " " + args[1] + ", " + args[0] case STP, LDP: args[0] = fmt.Sprintf("(%s, %s)", args[0], args[1]) args[1] = args[2] rno, ok := inst.Args[0].(Reg) if !ok { rno = Reg(inst.Args[0].(RegSP)) } if rno <= WZR { op = op + "W" } else if rno >= S0 && rno <= S31 { op = "F" + op + "S" } else if rno >= D0 && rno <= D31 { op = "F" + op + "D" } else if rno >= Q0 && rno <= Q31 { op = "F" + op + "Q" } op = op + suffix if inst.Op.String() == "STP" { return op + " " + args[0] + ", " + args[1] } else { return op + " " + args[1] + ", " + args[0] } case STLXP, STXP: if r, ok := inst.Args[1].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[1] = fmt.Sprintf("(%s, %s)", args[1], args[2]) args[2] = args[3] return op + " " + args[1] + ", " + args[2] + ", " + args[0] case FCCMP, FCCMPE: args[0], args[1] = args[1], args[0] fallthrough case FCMP, FCMPE: if _, ok := inst.Args[1].(Imm); ok { args[1] = "$(0.0)" } fallthrough case FADD, FSUB, FMUL, FNMUL, FDIV, FMAX, FMIN, FMAXNM, FMINNM, FCSEL, FMADD, FMSUB, FNMADD, FNMSUB: if strings.HasSuffix(op, "MADD") || strings.HasSuffix(op, "MSUB") { args[2], args[3] = args[3], args[2] } if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno >= uint16(S0) && rno <= uint16(S31) { op = fmt.Sprintf("%sS", op) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = fmt.Sprintf("%sD", op) } } case FCVT: for i := 1; i >= 0; i-- { if r, ok := inst.Args[i].(Reg); ok { rno := uint16(r) if rno >= uint16(H0) && rno <= uint16(H31) { op = fmt.Sprintf("%sH", op) } else if rno >= uint16(S0) && rno <= uint16(S31) { op = fmt.Sprintf("%sS", op) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = fmt.Sprintf("%sD", op) } } } case FABS, FNEG, FSQRT, FRINTN, FRINTP, FRINTM, FRINTZ, FRINTA, FRINTX, FRINTI: if r, ok := inst.Args[1].(Reg); ok { rno := uint16(r) if rno >= uint16(S0) && rno <= uint16(S31) { op = fmt.Sprintf("%sS", op) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = fmt.Sprintf("%sD", op) } } case FCVTZS, FCVTZU, SCVTF, UCVTF: if _, ok := inst.Args[2].(Imm); !ok { for i := 1; i >= 0; i-- { if r, ok := inst.Args[i].(Reg); ok { rno := uint16(r) if rno >= uint16(S0) && rno <= uint16(S31) { op = fmt.Sprintf("%sS", op) } else if rno >= uint16(D0) && rno <= uint16(D31) { op = fmt.Sprintf("%sD", op) } else if rno <= uint16(WZR) { op += "W" } } } } case FMOV: for i := 0; i <= 1; i++ { if r, ok := inst.Args[i].(Reg); ok { rno := uint16(r) if rno >= uint16(S0) && rno <= uint16(S31) { op = fmt.Sprintf("%sS", op) break } else if rno >= uint16(D0) && rno <= uint16(D31) { op = fmt.Sprintf("%sD", op) break } } } case SYSL: op1 := int(inst.Args[1].(Imm).Imm) cn := int(inst.Args[2].(Imm_c)) cm := int(inst.Args[3].(Imm_c)) op2 := int(inst.Args[4].(Imm).Imm) sysregno := int32(op1<<16 | cn<<12 | cm<<8 | op2<<5) args[1] = fmt.Sprintf("$%d", sysregno) return op + " " + args[1] + ", " + args[0] case CBNZ, CBZ: if r, ok := inst.Args[0].(Reg); ok { rno := uint16(r) if rno <= uint16(WZR) { op += "W" } } args[0], args[1] = args[1], args[0] case ADR, ADRP: addr := int64(inst.Args[1].(PCRel)) args[1] = fmt.Sprintf("%d(PC)", addr) case MSR: args[0] = inst.Args[0].String() case ST1: op = fmt.Sprintf("V%s", op) + suffix args[0], args[1] = args[1], args[0] case LD1: op = fmt.Sprintf("V%s", op) + suffix case UMOV: op = "VMOV" case NOP: op = "NOOP" default: index := sort.SearchStrings(noSuffixOpSet, op) if !(index < len(noSuffixOpSet) && noSuffixOpSet[index] == op) { rno := -1 switch a := inst.Args[0].(type) { case Reg: rno = int(a) case RegSP: rno = int(a) case RegisterWithArrangement: op = fmt.Sprintf("V%s", op) } if rno >= int(B0) && rno <= int(Q31) && !strings.HasPrefix(op, "F") { op = fmt.Sprintf("V%s", op) } if rno >= 0 && rno <= int(WZR) { // Add "w" to opcode suffix. op += "W" } } op = op + suffix } // conditional instructions, replace args. if _, ok := inst.Args[3].(Cond); ok { if _, ok := inst.Args[2].(Reg); ok { args[1], args[2] = args[2], args[1] } else { args[0], args[2] = args[2], args[0] } } // Reverse args, placing dest last. for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 { args[i], args[j] = args[j], args[i] } if args != nil { op += " " + strings.Join(args, ", ") } return op } // No need add "W" to opcode suffix. // Opcode must be inserted in ascending order. var noSuffixOpSet = strings.Fields(` AESD AESE AESIMC AESMC CRC32B CRC32CB CRC32CH CRC32CW CRC32CX CRC32H CRC32W CRC32X LDARB LDARH LDAXRB LDAXRH LDTRH LDXRB LDXRH SHA1C SHA1H SHA1M SHA1P SHA1SU0 SHA1SU1 SHA256H SHA256H2 SHA256SU0 SHA256SU1 `) // floating point instructions without "F" prefix. var fOpsWithoutFPrefix = map[Op]bool{ LDP: true, STP: true, } func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg Arg) string { switch a := arg.(type) { case Imm: return fmt.Sprintf("$%d", uint32(a.Imm)) case Imm64: return fmt.Sprintf("$%d", int64(a.Imm)) case ImmShift: if a.shift == 0 { return fmt.Sprintf("$%d", a.imm) } return fmt.Sprintf("$(%d<<%d)", a.imm, a.shift) case PCRel: addr := int64(pc) + int64(a) if s, base := symname(uint64(addr)); s != "" && uint64(addr) == base { return fmt.Sprintf("%s(SB)", s) } return fmt.Sprintf("%d(PC)", a/4) case Reg: regenum := uint16(a) regno := uint16(a) & 31 if regenum >= uint16(B0) && regenum <= uint16(Q31) { if strings.HasPrefix(inst.Op.String(), "F") || strings.HasSuffix(inst.Op.String(), "CVTF") || fOpsWithoutFPrefix[inst.Op] { // FP registers are the same ones as SIMD registers // Print Fn for scalar variant to align with assembler (e.g., FCVT, SCVTF, UCVTF, etc.) return fmt.Sprintf("F%d", regno) } else { // Print Vn to align with assembler (e.g., SHA256H) return fmt.Sprintf("V%d", regno) } } return plan9gpr(a) case RegSP: regno := uint16(a) & 31 if regno == 31 { return "RSP" } return fmt.Sprintf("R%d", regno) case RegExtshiftAmount: reg := plan9gpr(a.reg) extshift := "" amount := "" if a.extShift != ExtShift(0) { switch a.extShift { default: extshift = "." + a.extShift.String() case lsl: extshift = "<<" amount = fmt.Sprintf("%d", a.amount) return reg + extshift + amount case lsr: extshift = ">>" amount = fmt.Sprintf("%d", a.amount) return reg + extshift + amount case asr: extshift = "->" amount = fmt.Sprintf("%d", a.amount) return reg + extshift + amount case ror: extshift = "@>" amount = fmt.Sprintf("%d", a.amount) return reg + extshift + amount } if a.amount != 0 { amount = fmt.Sprintf("<<%d", a.amount) } } return reg + extshift + amount case MemImmediate: off := "" base := "" regno := uint16(a.Base) & 31 if regno == 31 { base = "(RSP)" } else { base = fmt.Sprintf("(R%d)", regno) } if a.imm != 0 && a.Mode != AddrPostReg { off = fmt.Sprintf("%d", a.imm) } else if a.Mode == AddrPostReg { postR := fmt.Sprintf("(R%d)", a.imm) return base + postR } return off + base case MemExtend: base := "" index := "" regno := uint16(a.Base) & 31 if regno == 31 { base = "(RSP)" } else { base = fmt.Sprintf("(R%d)", regno) } indexreg := plan9gpr(a.Index) if a.Extend == lsl { // Refer to ARM reference manual, for byte load/store(register), the index // shift amount must be 0, encoded in "S" as 0 if omitted, or as 1 if present. // a.Amount indicates the index shift amount, encoded in "S" field. // a.ShiftMustBeZero is set true indicates the index shift amount must be 0. // When a.ShiftMustBeZero is true, GNU syntax prints "[Xn, Xm lsl #0]" if "S" // equals to 1, or prints "[Xn, Xm]" if "S" equals to 0. if a.Amount != 0 && !a.ShiftMustBeZero { index = fmt.Sprintf("(%s<<%d)", indexreg, a.Amount) } else if a.ShiftMustBeZero && a.Amount == 1 { // When a.ShiftMustBeZero is ture, Go syntax prints "(Rm<<0)" if "a.Amount" // equals to 1. index = fmt.Sprintf("(%s<<0)", indexreg) } else { index = fmt.Sprintf("(%s)", indexreg) } } else { if a.Amount != 0 && !a.ShiftMustBeZero { index = fmt.Sprintf("(%s.%s<<%d)", indexreg, a.Extend.String(), a.Amount) } else { index = fmt.Sprintf("(%s.%s)", indexreg, a.Extend.String()) } } return base + index case Cond: switch arg.String() { case "CS": return "HS" case "CC": return "LO" } case Imm_clrex: return fmt.Sprintf("$%d", uint32(a)) case Imm_dcps: return fmt.Sprintf("$%d", uint32(a)) case Imm_option: return fmt.Sprintf("$%d", uint8(a)) case Imm_hint: return fmt.Sprintf("$%d", uint8(a)) case Imm_fp: var s, pre, numerator, denominator int16 var result float64 if a.s == 0 { s = 1 } else { s = -1 } pre = s * int16(16+a.pre) if a.exp > 0 { numerator = (pre << uint8(a.exp)) denominator = 16 } else { numerator = pre denominator = (16 << uint8(-1*a.exp)) } result = float64(numerator) / float64(denominator) return strings.TrimRight(fmt.Sprintf("$%f", result), "0") case RegisterWithArrangement: result := a.r.String() arrange := a.a.String() c := []rune(arrange) switch len(c) { case 3: c[1], c[2] = c[2], c[1] // .8B -> .B8 case 4: c[1], c[2], c[3] = c[3], c[1], c[2] // 16B -> B16 } arrange = string(c) result += arrange if a.cnt > 0 { result = "[" + result for i := 1; i < int(a.cnt); i++ { cur := V0 + Reg((uint16(a.r)-uint16(V0)+uint16(i))&31) result += ", " + cur.String() + arrange } result += "]" } return result case RegisterWithArrangementAndIndex: result := a.r.String() arrange := a.a.String() result += arrange if a.cnt > 1 { result = "[" + result for i := 1; i < int(a.cnt); i++ { cur := V0 + Reg((uint16(a.r)-uint16(V0)+uint16(i))&31) result += ", " + cur.String() + arrange } result += "]" } return fmt.Sprintf("%s[%d]", result, a.index) case Systemreg: return fmt.Sprintf("$%d", uint32(a.op0&1)<<14|uint32(a.op1&7)<<11|uint32(a.cn&15)<<7|uint32(a.cm&15)<<3|uint32(a.op2)&7) case Imm_prfop: if strings.Contains(a.String(), "#") { return fmt.Sprintf("$%d", a) } case sysOp: result := a.op.String() if a.r != 0 { result += ", " + plan9gpr(a.r) } return result } return strings.ToUpper(arg.String()) } // Convert a general-purpose register to plan9 assembly format. func plan9gpr(r Reg) string { regno := uint16(r) & 31 if regno == 31 { return "ZR" } return fmt.Sprintf("R%d", regno) }