Path: blob/master/arch/sh/kernel/cpu/sh2a/opcode_helper.c
17311 views
/*1* arch/sh/kernel/cpu/sh2a/opcode_helper.c2*3* Helper for the SH-2A 32-bit opcodes.4*5* Copyright (C) 2007 Paul Mundt6*7* This file is subject to the terms and conditions of the GNU General Public8* License. See the file "COPYING" in the main directory of this archive9* for more details.10*/11#include <linux/kernel.h>12#include <asm/system.h>1314/*15* Instructions on SH are generally fixed at 16-bits, however, SH-2A16* introduces some 32-bit instructions. Since there are no real17* constraints on their use (and they can be mixed and matched), we need18* to check the instruction encoding to work out if it's a true 32-bit19* instruction or not.20*21* Presently, 32-bit opcodes have only slight variations in what the22* actual encoding looks like in the first-half of the instruction, which23* makes it fairly straightforward to differentiate from the 16-bit ones.24*25* First 16-bits of encoding Used by26*27* 0011nnnnmmmm0001 mov.b, mov.w, mov.l, fmov.d,28* fmov.s, movu.b, movu.w29*30* 0011nnnn0iii1001 bclr.b, bld.b, bset.b, bst.b, band.b,31* bandnot.b, bldnot.b, bor.b, bornot.b,32* bxor.b33*34* 0000nnnniiii0000 movi2035* 0000nnnniiii0001 movi20s36*/37unsigned int instruction_size(unsigned int insn)38{39/* Look for the common cases */40switch ((insn & 0xf00f)) {41case 0x0000: /* movi20 */42case 0x0001: /* movi20s */43case 0x3001: /* 32-bit mov/fmov/movu variants */44return 4;45}4647/* And the special cases.. */48switch ((insn & 0xf08f)) {49case 0x3009: /* 32-bit b*.b bit operations */50return 4;51}5253return 2;54}555657