/*********************************************************************** * podefs.h * Logical P-code operation code definitions * * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ***********************************************************************/ #ifndef __PODEFS_H #define __PODEFS_H /* These definitions represent logical operations as needed by the * the compiler. The specific INSN generation layer must interpret * these requests as is appropriate to the supported INSNS. */ enum pcode_e { /**------------------------------------------------------------------- * OPCODES WITH NO ARGUMENTS **-------------------------------------------------------------------**/ /* Program control (No stack arguments) */ opNOP = 0, /* Arithmetic & logical & and integer conversions (One stack argument) */ opNEG, opABS, opINC, opDEC, opNOT, /* Arithmetic & logical (Two stack arguments) */ opADD, opSUB, opMUL, opDIV, opMOD, opSLL, opSRL, opSRA, opOR, opAND, /* Comparisons (One stack argument) */ opEQUZ, opNEQZ, opLTZ, opGTEZ, opGTZ, opLTEZ, /* Comparisons (Two stack arguments) */ opEQU, opNEQ, opLT, opGTE, opGT, opLTE, opBIT, /* Load Immediate */ opLDI, opLDIB, opLDIM, /* Store Immediate */ opSTI, opSTIB, opSTIM, /* Data stack */ opDUP, opPUSHS, opPOPS, /* Program control (No stack arguments) * Behavior: * Pop return address * Pop saved base register (BR) * Discard saved base address * Set program counter (PC) to return address */ opRET, /* System Functions (No stack arguments) */ opEND, /**------------------------------------------------------------------- ** OPCODES WITH ONE ARGUMENT **-------------------------------------------------------------------**/ /* Floating point operations: arg = FP op-code */ opFLOAT, /* Program control: arg = unsigned label (One stack argument) */ opJEQUZ, opJNEQZ, /* Program control: arg = unsigned label (no stack arguments) */ opJMP, /* Program control: arg = unsigned label (One stack argument) */ opJEQU, opJNEQ, opJLT, opJGTE, opJGT, opJLTE, /* Load: arg = unsigned base offset */ opLD, opLDH, opLDB, opLDM, /* Store: arg = unsigned base offset */ opST, opSTB, opSTM, /* Load Indexed: arg = unsigned base offset */ opLDX, opLDXB, opLDXM, /* Store Indexed: arg16 = unsigned base offset */ opSTX, opSTXB, opSTXM, /* Load address relative to stack base: arg = unsigned offset */ opLA, /* Load absolute stack address: arg = RODATA offset (No stack arguments) */ opLAC, /* Data stack: arg = 16 bit signed data (no stack arguments) */ opPUSH, opINDS, /* Load address relative to stack base: arg1 = unsigned offset, TOS=index */ opLAX, /* System functions: arg = 16-bit library call identifier */ opLIB, /* Program control: arg = unsigned label (no stack arguments) */ opLABEL, /**------------------------------------------------------------------- ** OPCODES WITH TWO ARGUMENTS **-------------------------------------------------------------------**/ /* Program Control: arg1 = level; arg2 = unsigned label */ opPCAL, /* Load: arg1 = level; arg2 = signed frame offset */ opLDS, opLDSH, opLDSB, opLDSM, /* Store: arg1 = level; arg2 = signed frame offset */ opSTS, opSTSB, opSTSM, /* Load Indexed: arg1 = level; arg2 = signed frame offset */ opLDSX, opLDSXB, opLDSXM, /* Store Indexed: arg1 = level; arg2 = signed frame offset */ opSTSX, opSTSXB, opSTSXM, /* FOR LAS/LASX arg1 = level; arg2 = signed frame offset * (no stack arguments) */ opLAS, opLASX, /* System calls: * For SYSIO: arg1 = file number; arg2 = sub-function code */ opSYSIO, /* Pseudo-operations: * For LINE: arg1 = file number; arg2 = line number */ opLINE, NUM_OPCODES }; #endif /* __PODEFS_H */