Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* Disassemble SPU instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)    Copyright 2006 Free Software Foundation, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)    This file is part of GDB, GAS, and the GNU binutils.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include "nonstdio.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "ansidecl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "spu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include "dis-asm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) /* This file provides a disassembler function which uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)    the disassembler interface defined in dis-asm.h.   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) extern const struct spu_opcode spu_opcodes[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) extern const int spu_num_opcodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define SPU_DISASM_TBL_SIZE (1 << 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) static const struct spu_opcode *spu_disassemble_table[SPU_DISASM_TBL_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) init_spu_disassemble (void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)   int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)   /* If two instructions have the same opcode then we prefer the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)    * one.  In most cases it is just an alternate mnemonic. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)   for (i = 0; i < spu_num_opcodes; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)       int o = spu_opcodes[i].opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)       if (o >= SPU_DISASM_TBL_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	continue; /* abort (); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)       if (spu_disassemble_table[o] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	spu_disassemble_table[o] = &spu_opcodes[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) /* Determine the instruction from the 10 least significant bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) static const struct spu_opcode *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) get_index_for_opcode (unsigned int insn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)   const struct spu_opcode *index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)   unsigned int opcode = insn >> (32-11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)   /* Init the table.  This assumes that element 0/opcode 0 (currently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)    * NOP) is always used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)   if (spu_disassemble_table[0] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)     init_spu_disassemble ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)   if ((index = spu_disassemble_table[opcode & 0x780]) != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)       && index->insn_type == RRR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58)   if ((index = spu_disassemble_table[opcode & 0x7f0]) != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59)       && (index->insn_type == RI18 || index->insn_type == LBT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)   if ((index = spu_disassemble_table[opcode & 0x7f8]) != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)       && index->insn_type == RI10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)   if ((index = spu_disassemble_table[opcode & 0x7fc]) != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)       && (index->insn_type == RI16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)   if ((index = spu_disassemble_table[opcode & 0x7fe]) != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)       && (index->insn_type == RI8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)   if ((index = spu_disassemble_table[opcode & 0x7ff]) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)     return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)   return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) /* Print a Spu instruction.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) print_insn_spu (unsigned long insn, unsigned long memaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)   int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)   int hex_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)   const struct spu_opcode *index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88)   enum spu_insns tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)   index = get_index_for_opcode (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)   if (index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)       printf(".long 0x%lx", insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)   else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)       int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)       int paren = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)       tag = (enum spu_insns)(index - spu_opcodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)       printf("%s", index->mnemonic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)       if (tag == M_BI || tag == M_BISL || tag == M_IRET || tag == M_BISLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	  || tag == M_BIHNZ || tag == M_BIHZ || tag == M_BINZ || tag == M_BIZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)           || tag == M_SYNC || tag == M_HBR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	  int fb = (insn >> (32-18)) & 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	  if (fb & 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	    printf(tag == M_SYNC ? "c" : "p");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	  if (fb & 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	    printf("d");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	  if (fb & 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	    printf("e");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)       if (index->arg[0] != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	printf("\t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)       hex_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)       for (i = 1;  i <= index->arg[0]; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	  int arg = index->arg[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	  if (arg != A_P && !paren && i > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	    printf(",");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	  switch (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	    case A_T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	      printf("$%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 				     DECODE_INSN_RT (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	    case A_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	      printf("$%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 				     DECODE_INSN_RA (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	    case A_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	      printf("$%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 				     DECODE_INSN_RB (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	    case A_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	      printf("$%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 				     DECODE_INSN_RC (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	    case A_S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	      printf("$sp%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 				     DECODE_INSN_RA (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	    case A_H:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	      printf("$ch%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 				     DECODE_INSN_RA (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	    case A_P:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	      paren++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	      printf("(");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	    case A_U7A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	      printf("%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 				     173 - DECODE_INSN_U8 (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	    case A_U7B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	      printf("%lu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 				     155 - DECODE_INSN_U8 (insn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	    case A_S3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	    case A_S6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	    case A_S7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	    case A_S7N:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	    case A_U3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	    case A_U5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	    case A_U6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	    case A_U7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	      hex_value = DECODE_INSN_I7 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	      printf("%d", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	    case A_S11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	      print_address(memaddr + DECODE_INSN_I9a (insn) * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	    case A_S11I:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	      print_address(memaddr + DECODE_INSN_I9b (insn) * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	    case A_S10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	    case A_S10B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	      hex_value = DECODE_INSN_I10 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	      printf("%d", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	    case A_S14:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	      hex_value = DECODE_INSN_I10 (insn) * 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	      printf("%d", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	    case A_S16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	      hex_value = DECODE_INSN_I16 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	      printf("%d", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	    case A_X16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	      hex_value = DECODE_INSN_U16 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	      printf("%u", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	    case A_R18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	      value = DECODE_INSN_I16 (insn) * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	      if (value == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		printf("%d", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	      else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		  hex_value = memaddr + value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		  print_address(hex_value & 0x3ffff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	    case A_S18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	      value = DECODE_INSN_U16 (insn) * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	      if (value == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		printf("%d", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	      else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		print_address(value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	    case A_U18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	      value = DECODE_INSN_U18 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	      if (value == 0 || 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		  hex_value = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		  printf("%u", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	      else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		print_address(value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	    case A_U14:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	      hex_value = DECODE_INSN_U14 (insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	      printf("%u", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	      break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	  if (arg != A_P && paren)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	      printf(")");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	      paren--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)       if (hex_value > 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	printf("\t# %x", hex_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)   return 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }