Path: blob/master/arch/sh/kernel/cpu/sh2a/opcode_helper.c
26495 views
// SPDX-License-Identifier: GPL-2.01/*2* arch/sh/kernel/cpu/sh2a/opcode_helper.c3*4* Helper for the SH-2A 32-bit opcodes.5*6* Copyright (C) 2007 Paul Mundt7*/8#include <linux/kernel.h>910#include <asm/processor.h>1112/*13* Instructions on SH are generally fixed at 16-bits, however, SH-2A14* introduces some 32-bit instructions. Since there are no real15* constraints on their use (and they can be mixed and matched), we need16* to check the instruction encoding to work out if it's a true 32-bit17* instruction or not.18*19* Presently, 32-bit opcodes have only slight variations in what the20* actual encoding looks like in the first-half of the instruction, which21* makes it fairly straightforward to differentiate from the 16-bit ones.22*23* First 16-bits of encoding Used by24*25* 0011nnnnmmmm0001 mov.b, mov.w, mov.l, fmov.d,26* fmov.s, movu.b, movu.w27*28* 0011nnnn0iii1001 bclr.b, bld.b, bset.b, bst.b, band.b,29* bandnot.b, bldnot.b, bor.b, bornot.b,30* bxor.b31*32* 0000nnnniiii0000 movi2033* 0000nnnniiii0001 movi20s34*/35unsigned int instruction_size(unsigned int insn)36{37/* Look for the common cases */38switch ((insn & 0xf00f)) {39case 0x0000: /* movi20 */40case 0x0001: /* movi20s */41case 0x3001: /* 32-bit mov/fmov/movu variants */42return 4;43}4445/* And the special cases.. */46switch ((insn & 0xf08f)) {47case 0x3009: /* 32-bit b*.b bit operations */48return 4;49}5051return 2;52}535455