Lines Matching +full:value +full:- +full:start
1 // SPDX-License-Identifier: GPL-2.0
43 #define OPERAND_PCREL 0x100 /* Operand printed as pc-relative symbol */
44 #define OPERAND_SIGNED 0x200 /* Operand printed as signed value */
92 I8_8, /* 8 bit signed value starting at 8 */
93 I8_32, /* 8 bit signed value starting at 32 */
94 I16_16, /* 16 bit signed value starting at 16 */
95 I16_32, /* 16 bit signed value starting at 32 */
96 I32_16, /* 32 bit signed value starting at 16 */
110 U4_8, /* 4 bit unsigned value starting at 8 */
111 U4_12, /* 4 bit unsigned value starting at 12 */
112 U4_16, /* 4 bit unsigned value starting at 16 */
113 U4_20, /* 4 bit unsigned value starting at 20 */
114 U4_24, /* 4 bit unsigned value starting at 24 */
115 U4_28, /* 4 bit unsigned value starting at 28 */
116 U4_32, /* 4 bit unsigned value starting at 32 */
117 U4_36, /* 4 bit unsigned value starting at 36 */
118 U8_8, /* 8 bit unsigned value starting at 8 */
119 U8_16, /* 8 bit unsigned value starting at 16 */
120 U8_24, /* 8 bit unsigned value starting at 24 */
121 U8_28, /* 8 bit unsigned value starting at 28 */
122 U8_32, /* 8 bit unsigned value starting at 32 */
123 U12_16, /* 12 bit unsigned value starting at 16 */
124 U16_16, /* 16 bit unsigned value starting at 16 */
125 U16_32, /* 16 bit unsigned value starting at 32 */
126 U32_16, /* 32 bit unsigned value starting at 16 */
344 /* Extracts an operand value from an instruction. */
353 cp = code + operand->shift / 8; in extract_operand()
354 bits = (operand->shift & 7) + operand->bits; in extract_operand()
359 bits -= 8; in extract_operand()
361 val >>= -bits; in extract_operand()
362 val &= ((1U << (operand->bits - 1)) << 1) - 1; in extract_operand()
365 if (operand->bits == 20 && operand->shift == 20) in extract_operand()
369 if (operand->flags & OPERAND_VR) { in extract_operand()
370 if (operand->shift == 8) in extract_operand()
372 else if (operand->shift == 12) in extract_operand()
374 else if (operand->shift == 16) in extract_operand()
376 else if (operand->shift == 32) in extract_operand()
380 /* Sign extend value if the operand is signed or pc relative. */ in extract_operand()
381 if ((operand->flags & (OPERAND_SIGNED | OPERAND_PCREL)) && in extract_operand()
382 (val & (1U << (operand->bits - 1)))) in extract_operand()
383 val |= (-1U << (operand->bits - 1)) << 1; in extract_operand()
385 /* Double value if the operand is pc relative. */ in extract_operand()
386 if (operand->flags & OPERAND_PCREL) in extract_operand()
390 if (operand->flags & OPERAND_LENGTH) in extract_operand()
405 * unknown instructions as well as 1-byte opcode instructions. in find_insn()
409 if (entry->opcode == code[0]) in find_insn()
413 opfrag = *(code + entry->byte) & entry->mask; in find_insn()
415 insn = &opcode[entry->offset]; in find_insn()
416 for (i = 0; i < entry->count; i++) { in find_insn()
417 if (insn->opfrag == opfrag) in find_insn()
429 unsigned int value; in print_insn() local
437 if (insn->zero == 0) in print_insn()
439 long_insn_name[insn->offset]); in print_insn()
441 ptr += sprintf(ptr, "%.5s\t", insn->name); in print_insn()
444 for (ops = formats[insn->format], i = 0; in print_insn()
447 value = extract_operand(code, operand); in print_insn()
448 if ((operand->flags & OPERAND_INDEX) && value == 0) in print_insn()
450 if ((operand->flags & OPERAND_BASE) && in print_insn()
451 value == 0 && separator == '(') { in print_insn()
457 if (operand->flags & OPERAND_GPR) in print_insn()
458 ptr += sprintf(ptr, "%%r%i", value); in print_insn()
459 else if (operand->flags & OPERAND_FPR) in print_insn()
460 ptr += sprintf(ptr, "%%f%i", value); in print_insn()
461 else if (operand->flags & OPERAND_AR) in print_insn()
462 ptr += sprintf(ptr, "%%a%i", value); in print_insn()
463 else if (operand->flags & OPERAND_CR) in print_insn()
464 ptr += sprintf(ptr, "%%c%i", value); in print_insn()
465 else if (operand->flags & OPERAND_VR) in print_insn()
466 ptr += sprintf(ptr, "%%v%i", value); in print_insn()
467 else if (operand->flags & OPERAND_PCREL) { in print_insn()
468 void *pcrel = (void *)((int)value + addr); in print_insn()
471 } else if (operand->flags & OPERAND_SIGNED) in print_insn()
472 ptr += sprintf(ptr, "%i", value); in print_insn()
474 ptr += sprintf(ptr, "%u", value); in print_insn()
475 if (operand->flags & OPERAND_DISP) in print_insn()
477 else if (operand->flags & OPERAND_BASE) { in print_insn()
485 return (int) (ptr - buffer); in print_insn()
492 return -EFAULT; in copy_from_regs()
495 return -EFAULT; in copy_from_regs()
506 int start, end, opsize, hops, i; in show_code() local
509 for (start = 32; start && regs->psw.addr >= 34 - start; start -= 2) { in show_code()
510 addr = regs->psw.addr - 34 + start; in show_code()
511 if (copy_from_regs(regs, code + start - 2, (void *)addr, 2)) in show_code()
515 addr = regs->psw.addr + end - 32; in show_code()
520 if ((regs->psw.addr & 1) || start >= end) { in show_code()
525 while (start < 32) { in show_code()
526 for (i = 0, hops = 0; start + i < 32 && hops < 3; hops++) { in show_code()
527 if (!find_insn(code + start + i)) in show_code()
529 i += insn_length(code[start + i]); in show_code()
531 if (start + i == 32) in show_code()
534 start += 2; in show_code()
540 while (start < end && hops < 8) { in show_code()
541 opsize = insn_length(code[start]); in show_code()
542 if (start + opsize == 32) in show_code()
544 else if (start == 32) in show_code()
548 addr = regs->psw.addr + start - 32; in show_code()
550 if (start + opsize >= end) in show_code()
553 ptr += sprintf(ptr, "%02x", code[start + i]); in show_code()
557 ptr += print_insn(ptr, code + start, addr); in show_code()
558 start += opsize; in show_code()
588 len -= opsize; in print_fn_code()