#ifndef morpheo_behavioural_Constants_h #define morpheo_behavioural_Constants_h /* WARNING : I Use reserved exception : 0x10 - EXCEPTION_MEMORY_MISS_SPECULATION - Load miss speculation 0x11 - EXCEPTION_MEMORY_LOAD_SPECULATIVE - The load is speculative : write in register file, but don't commit 0x12 - EXCEPTION_ALU_SPR_ACCESS_INVALID - SPR present in ALU but not compatible privilege 0x13 - EXCEPTION_ALU_SPR_ACCESS_MUST_READ - SPR not present in ALU 0x14 - EXCEPTION_ALU_SPR_ACCESS_MUST_WRITE - SPR not present in ALU I Use reserved SPR : [0][19] - SPR_CID */ namespace morpheo { namespace behavioural { # define SET_FLAG( x,pos) {(x) |= (1<<(pos));} while (0) # define UNSET_FLAG( x,pos) {(x) &= ~(1<<(pos));} while (0) # define IS_SET_FLAG( x,pos) (((x) & (1<<(pos))) != 0) # define IS_UNSET_FLAG(x,pos) (((x) & (1<<(pos))) == 0) # define CHANGE_FLAG( x,pos,f) \ { \ if (f) \ {SET_FLAG(x,pos);} \ else \ {UNSET_FLAG(x,pos);} \ } while (0) //=========================================================[ Type ]===== # define TYPE_ALU 0x0 // 00000 - unit multiple # define TYPE_SHIFT 0x1 // 00000 - unit multiple # define TYPE_MOVE 0x2 // 00000 - unit multiple # define TYPE_TEST 0x3 // 00000 - unit multiple # define TYPE_MUL 0x4 // 00000 - unit multiple # define TYPE_DIV 0x5 // 00000 - unit multiple, type optionnal # define TYPE_EXTEND 0x6 // 00000 - unit multiple, type optionnal # define TYPE_FIND 0x7 // 00000 - unit multiple, type optionnal # define TYPE_SPECIAL 0x8 // 00000 - unit uniq # define TYPE_CUSTOM 0x9 // 00000 - unit uniq , type optionnal # define TYPE_BRANCH 0xa // 00000 - unit multiple # define TYPE_MEMORY 0xb // 00000 - unit uniq //#define NB_TYPE 11 # define SIZE_TYPE 5 # define MAX_TYPE (1< incondionnal # define BRANCH_STATE_SPEC_NTAKE 0x2 // 1 0 # define BRANCH_STATE_SPEC_TAKE 0x3 // 1 1 //---------------------------------------------[ branch_condition ]----- # define SIZE_BRANCH_CONDITION 4 # define BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK 0x0 // None condition (jump) # define BRANCH_CONDITION_NONE_WITH_WRITE_STACK 0x8 // None condition (jump) # define BRANCH_CONDITION_FLAG_UNSET 0x2 // Branch if Flag is clear # define BRANCH_CONDITION_FLAG_SET 0x3 // Branch if Flag is set # define BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK 0x4 // Branch if a register is read # define BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK 0xc // Branch if a register is read # define BRANCH_CONDITION_READ_STACK 0xf // Branch with pop in stack pointer //--------------------------------------------------[ instruction ]----- # define NB_INSTRUCTION 213 // 92 ORBIS, 30 ORFPX (15 simple, 15 double), 91 ORVDX (38 on byte, 41 on half, 12 independant format) enum { // ORBIS INSTRUCTION_L_ADD, INSTRUCTION_L_ADDC, INSTRUCTION_L_ADDI, INSTRUCTION_L_ADDIC, INSTRUCTION_L_AND, INSTRUCTION_L_ANDI, INSTRUCTION_L_BF, INSTRUCTION_L_BNF, INSTRUCTION_L_CMOV, INSTRUCTION_L_CSYNC, INSTRUCTION_L_CUST1, INSTRUCTION_L_CUST2, INSTRUCTION_L_CUST3, INSTRUCTION_L_CUST4, INSTRUCTION_L_CUST5, INSTRUCTION_L_CUST6, INSTRUCTION_L_CUST7, INSTRUCTION_L_CUST8, INSTRUCTION_L_DIV, INSTRUCTION_L_DIVU, INSTRUCTION_L_EXTBS, INSTRUCTION_L_EXTBZ, INSTRUCTION_L_EXTHS, INSTRUCTION_L_EXTHZ, INSTRUCTION_L_EXTWS, INSTRUCTION_L_EXTWZ, INSTRUCTION_L_FF1, INSTRUCTION_L_FL1, INSTRUCTION_L_J, INSTRUCTION_L_JAL, INSTRUCTION_L_JALR, INSTRUCTION_L_JR, INSTRUCTION_L_LBS, INSTRUCTION_L_LBZ, INSTRUCTION_L_LD, INSTRUCTION_L_LHS, INSTRUCTION_L_LHZ, INSTRUCTION_L_LWS, INSTRUCTION_L_LWZ, INSTRUCTION_L_MAC, INSTRUCTION_L_MACI, INSTRUCTION_L_MACRC, INSTRUCTION_L_MFSPR, INSTRUCTION_L_MOVHI, INSTRUCTION_L_MSB, INSTRUCTION_L_MSYNC, INSTRUCTION_L_MTSPR, INSTRUCTION_L_MUL, INSTRUCTION_L_MULI, INSTRUCTION_L_MULU, INSTRUCTION_L_NOP, INSTRUCTION_L_OR, INSTRUCTION_L_ORI, INSTRUCTION_L_PSYNC, INSTRUCTION_L_RFE, INSTRUCTION_L_ROR, INSTRUCTION_L_RORI, INSTRUCTION_L_SB, INSTRUCTION_L_SD, INSTRUCTION_L_SFEQ, INSTRUCTION_L_SFEQI, INSTRUCTION_L_SFGES, INSTRUCTION_L_SFGESI, INSTRUCTION_L_SFGEU, INSTRUCTION_L_SFGEUI, INSTRUCTION_L_SFGTS, INSTRUCTION_L_SFGTSI, INSTRUCTION_L_SFGTU, INSTRUCTION_L_SFGTUI, INSTRUCTION_L_SFLES, INSTRUCTION_L_SFLESI, INSTRUCTION_L_SFLEU, INSTRUCTION_L_SFLEUI, INSTRUCTION_L_SFLTS, INSTRUCTION_L_SFLTSI, INSTRUCTION_L_SFLTU, INSTRUCTION_L_SFLTUI, INSTRUCTION_L_SFNE, INSTRUCTION_L_SFNEI, INSTRUCTION_L_SH, INSTRUCTION_L_SLL, INSTRUCTION_L_SLLI, INSTRUCTION_L_SRA, INSTRUCTION_L_SRAI, INSTRUCTION_L_SRL, INSTRUCTION_L_SRLI, INSTRUCTION_L_SUB, INSTRUCTION_L_SW, INSTRUCTION_L_SYS, INSTRUCTION_L_TRAP, INSTRUCTION_L_XOR, INSTRUCTION_L_XORI, // ORFPX INSTRUCTION_LF_ADD_D, INSTRUCTION_LF_ADD_S, INSTRUCTION_LF_CUST1_D, INSTRUCTION_LF_CUST1_S, INSTRUCTION_LF_DIV_D, INSTRUCTION_LF_DIV_S, INSTRUCTION_LF_FTOI_D, INSTRUCTION_LF_FTOI_S, INSTRUCTION_LF_ITOF_D, INSTRUCTION_LF_ITOF_S, INSTRUCTION_LF_MADD_D, INSTRUCTION_LF_MADD_S, INSTRUCTION_LF_MUL_D, INSTRUCTION_LF_MUL_S, INSTRUCTION_LF_REM_D, INSTRUCTION_LF_REM_S, INSTRUCTION_LF_SFEQ_D, INSTRUCTION_LF_SFEQ_S, INSTRUCTION_LF_SFGE_D, INSTRUCTION_LF_SFGE_S, INSTRUCTION_LF_SFGT_D, INSTRUCTION_LF_SFGT_S, INSTRUCTION_LF_SFLE_D, INSTRUCTION_LF_SFLE_S, INSTRUCTION_LF_SFLT_D, INSTRUCTION_LF_SFLT_S, INSTRUCTION_LF_SFNE_D, INSTRUCTION_LF_SFNE_S, INSTRUCTION_LF_SUB_D, INSTRUCTION_LF_SUB_S, // ORVDX INSTRUCTION_LV_ADD_B, INSTRUCTION_LV_ADD_H, INSTRUCTION_LV_ADDS_B, INSTRUCTION_LV_ADDS_H, INSTRUCTION_LV_ADDU_B, INSTRUCTION_LV_ADDU_H, INSTRUCTION_LV_ADDUS_B, INSTRUCTION_LV_ADDUS_H, INSTRUCTION_LV_ALL_EQ_B, INSTRUCTION_LV_ALL_EQ_H, INSTRUCTION_LV_ALL_GE_B, INSTRUCTION_LV_ALL_GE_H, INSTRUCTION_LV_ALL_GT_B, INSTRUCTION_LV_ALL_GT_H, INSTRUCTION_LV_ALL_LE_B, INSTRUCTION_LV_ALL_LE_H, INSTRUCTION_LV_ALL_LT_B, INSTRUCTION_LV_ALL_LT_H, INSTRUCTION_LV_ALL_NE_B, INSTRUCTION_LV_ALL_NE_H, INSTRUCTION_LV_AND, INSTRUCTION_LV_ANY_EQ_B, INSTRUCTION_LV_ANY_EQ_H, INSTRUCTION_LV_ANY_GE_B, INSTRUCTION_LV_ANY_GE_H, INSTRUCTION_LV_ANY_GT_B, INSTRUCTION_LV_ANY_GT_H, INSTRUCTION_LV_ANY_LE_B, INSTRUCTION_LV_ANY_LE_H, INSTRUCTION_LV_ANY_LT_B, INSTRUCTION_LV_ANY_LT_H, INSTRUCTION_LV_ANY_NE_B, INSTRUCTION_LV_ANY_NE_H, INSTRUCTION_LV_AVG_B, INSTRUCTION_LV_AVG_H, INSTRUCTION_LV_CMP_EQ_B, INSTRUCTION_LV_CMP_EQ_H, INSTRUCTION_LV_CMP_GE_B, INSTRUCTION_LV_CMP_GE_H, INSTRUCTION_LV_CMP_GT_B, INSTRUCTION_LV_CMP_GT_H, INSTRUCTION_LV_CMP_LE_B, INSTRUCTION_LV_CMP_LE_H, INSTRUCTION_LV_CMP_LT_B, INSTRUCTION_LV_CMP_LT_H, INSTRUCTION_LV_CMP_NE_B, INSTRUCTION_LV_CMP_NE_H, INSTRUCTION_LV_CUST1, INSTRUCTION_LV_CUST2, INSTRUCTION_LV_CUST3, INSTRUCTION_LV_CUST4, INSTRUCTION_LV_MADDS_H, INSTRUCTION_LV_MAX_B, INSTRUCTION_LV_MAX_H, INSTRUCTION_LV_MERGE_B, INSTRUCTION_LV_MERGE_H, INSTRUCTION_LV_MIN_B, INSTRUCTION_LV_MIN_H, INSTRUCTION_LV_MSUBS_H, INSTRUCTION_LV_MULS_H, INSTRUCTION_LV_NAND, INSTRUCTION_LV_NOR, INSTRUCTION_LV_OR, INSTRUCTION_LV_PACK_B, INSTRUCTION_LV_PACK_H, INSTRUCTION_LV_PACKS_B, INSTRUCTION_LV_PACKS_H, INSTRUCTION_LV_PACKUS_B, INSTRUCTION_LV_PACKUS_H, INSTRUCTION_LV_PERM_N, INSTRUCTION_LV_RL_B, INSTRUCTION_LV_RL_H, INSTRUCTION_LV_SLL, INSTRUCTION_LV_SLL_B, INSTRUCTION_LV_SLL_H, INSTRUCTION_LV_SRA_B, INSTRUCTION_LV_SRA_H, INSTRUCTION_LV_SRL, INSTRUCTION_LV_SRL_B, INSTRUCTION_LV_SRL_H, INSTRUCTION_LV_SUB_B, INSTRUCTION_LV_SUB_H, INSTRUCTION_LV_SUBS_B, INSTRUCTION_LV_SUBS_H, INSTRUCTION_LV_SUBU_B, INSTRUCTION_LV_SUBU_H, INSTRUCTION_LV_SUBUS_B, INSTRUCTION_LV_SUBUS_H, INSTRUCTION_LV_UNPACK_B, INSTRUCTION_LV_UNPACK_H, INSTRUCTION_LV_XOR }; //-----------------------------------------------[ Code Operation ]----- # define MAX_OPCOD_0 64 // Instructions with immediat # define MAX_OPCOD_1 64 // Instruction ORFPX32/64 # define MAX_OPCOD_2 256 // Instruction ORVDX64 # define MAX_OPCOD_3 256 // Instructions Register-Register # define MAX_OPCOD_4 32 // Instructions "set flag" with register # define MAX_OPCOD_5 32 // Instructions "set flag" with immediat # define MAX_OPCOD_6 4 // Instruction Shift/Rotate with immediat # define MAX_OPCOD_7 16 // Instructions multiply with HI-LO # define MAX_OPCOD_8 2 // Instructions acces at HI-LO # define MAX_OPCOD_9 8 // Instructions special # define MAX_OPCOD_10 4 // Instructions no operation # define MAX_OPCOD_11 4 // Instruction Shift/Rotate with register # define MAX_OPCOD_12 4 // Instructions extend # define MAX_OPCOD_13 4 // Instructions extend (64b) // OPCOD_0 - [31:26] Instructions with immediat # define OPCOD_L_J 0x00 // 000_000 # define OPCOD_L_JAL 0x01 // 000_001 # define OPCOD_L_BNF 0x03 // 000_011 # define OPCOD_L_BF 0x04 // 000_100 # define OPCOD_L_RFE 0x09 // 001_001 # define OPCOD_L_JR 0x11 // 010_001 # define OPCOD_L_JALR 0x12 // 010_010 # define OPCOD_L_MACI 0x13 // 010_011 # define OPCOD_L_CUST1 0x1c // 011_100 # define OPCOD_L_CUST2 0x1d // 011_101 # define OPCOD_L_CUST3 0x1e // 011_110 # define OPCOD_L_CUST4 0x1f // 011_111 # define OPCOD_L_CUST5 0x3c // 111_100 # define OPCOD_L_CUST6 0x3d // 111_101 # define OPCOD_L_CUST7 0x3e // 111_110 # define OPCOD_L_CUST8 0x3f // 111_111 # define OPCOD_L_LD 0x20 // 100_000 # define OPCOD_L_LWZ 0x21 // 100_001 # define OPCOD_L_LWS 0x22 // 100_010 # define OPCOD_L_LBZ 0x23 // 100_011 # define OPCOD_L_LBS 0x24 // 100_100 # define OPCOD_L_LHZ 0x25 // 100_101 # define OPCOD_L_LHS 0x26 // 100_110 # define OPCOD_L_ADDI 0x27 // 100_111 # define OPCOD_L_ADDIC 0x28 // 101_000 # define OPCOD_L_ANDI 0x29 // 101_001 # define OPCOD_L_ORI 0x2a // 101_010 # define OPCOD_L_XORI 0x2b // 101_011 # define OPCOD_L_MULI 0x2c // 101_100 # define OPCOD_L_MFSPR 0x2d // 101_101 # define OPCOD_L_MTSPR 0x30 // 110_000 # define OPCOD_L_SD 0x34 // 110_100 # define OPCOD_L_SW 0x35 // 110_101 # define OPCOD_L_SB 0x36 // 110_110 # define OPCOD_L_SH 0x37 // 110_111 # define OPCOD_1 0x33 // 110_011 // Instruction ORFPX32/64 # define OPCOD_2 0x0a // 001_010 // Instruction ORVDX64 # define OPCOD_3 0x38 // 111_000 // Instructions Register-Register # define OPCOD_4 0x39 // 111_001 // Instructions "set flag" with register # define OPCOD_5 0x2f // 101_111 // Instructions "set flag" with immediat # define OPCOD_6 0x2e // 101_110 // Instruction Shift/Rotate with immediat # define OPCOD_7 0x31 // 110_001 // Instructions multiply with HI-LO # define OPCOD_8 0x06 // 000_110 // Instructions acces at HI-LO # define OPCOD_9 0x08 // 001_000 // Instructions special # define OPCOD_10 0x05 // 000_101 // Instructions no operation // OPCOD_3 instructions - [9:8] [3:0] Instructions Register-Register # define OPCOD_L_ADD 0x00 // 00_0000 # define OPCOD_L_ADDC 0x01 // 00_0001 # define OPCOD_L_SUB 0x02 // 00_0010 # define OPCOD_L_AND 0x03 // 00_0011 # define OPCOD_L_OR 0x04 // 00_0100 # define OPCOD_L_XOR 0x05 // 00_0101 # define OPCOD_L_CMOV 0x0e // 00_1110 # define OPCOD_L_FF1 0x0f // 00_1111 # define OPCOD_L_FL1 0x1f // 01_1111 # define OPCOD_L_MUL 0x36 // 11_0110 # define OPCOD_L_DIV 0x39 // 11_1001 # define OPCOD_L_DIVU 0x3a // 11_1010 # define OPCOD_L_MULU 0x3b // 11_1011 # define OPCOD_11 0x8 // 1000 // Instruction Shift/Rotate with register # define OPCOD_12 0xc // 1100 // Instructions extend # define OPCOD_13 0xd // 1101 // Instructions extend (64b) // OPCOD_4 instructions - [25:21] Instructions "set flag" with register # define OPCOD_L_SFEQ 0x00 // 00000 # define OPCOD_L_SFNE 0x01 // 00001 # define OPCOD_L_SFGTU 0x02 // 00010 # define OPCOD_L_SFGEU 0x03 // 00011 # define OPCOD_L_SFLTU 0x04 // 00100 # define OPCOD_L_SFLEU 0x05 // 00101 # define OPCOD_L_SFGTS 0x0a // 01010 # define OPCOD_L_SFGES 0x0b // 01011 # define OPCOD_L_SFLTS 0x0c // 01100 # define OPCOD_L_SFLES 0x0d // 01101 // OPCOD_5 instructions - [25:21] Instructions "set flag" with immediat # define OPCOD_L_SFEQI 0x00 // 00000 # define OPCOD_L_SFNEI 0x01 // 00001 # define OPCOD_L_SFGTUI 0x02 // 00010 # define OPCOD_L_SFGEUI 0x03 // 00011 # define OPCOD_L_SFLTUI 0x04 // 00100 # define OPCOD_L_SFLEUI 0x05 // 00101 # define OPCOD_L_SFGTSI 0x0a // 01010 # define OPCOD_L_SFGESI 0x0b // 01011 # define OPCOD_L_SFLTSI 0x0c // 01100 # define OPCOD_L_SFLESI 0x0d // 01101 // OPCOD_6 instructions - [7:6] Instruction Shift/Rotate with immediat # define OPCOD_L_SLLI 0x0 // 00 # define OPCOD_L_SRLI 0x1 // 01 # define OPCOD_L_SRAI 0x2 // 10 # define OPCOD_L_RORI 0x3 // 11 // OPCOD_7 instructions - [3:0] Instructions multiply with HI-LO # define OPCOD_L_MAC 0x1 // 0001 # define OPCOD_L_MSB 0x2 // 0010 // OPCOD_8 instructions - [17] Instructions acces at HI-LO # define OPCOD_L_MOVHI 0x0 // 0 # define OPCOD_L_MACRC 0x1 // 1 // OPCOD_9 instructions - [25:23] Instruction special # define OPCOD_L_SYS 0x0 // 000 # define OPCOD_L_TRAP 0x2 // 010 # define OPCOD_L_MSYNC 0x4 // 100 # define OPCOD_L_PSYNC 0x5 // 101 # define OPCOD_L_CSYNC 0x6 // 110 // OPCOD_10 instructions - [25:24] Instruction no operation # define OPCOD_L_NOP 0x1 // 01 // OPCOD_11 instructions - [7:6] Instruction Shift/Rotate with register # define OPCOD_L_SLL 0x0 // 00 # define OPCOD_L_SRL 0x1 // 01 # define OPCOD_L_SRA 0x2 // 10 # define OPCOD_L_ROR 0x3 // 11 // OPCOD_12 instructions - [9:6] Instructions extend # define OPCOD_L_EXTHS 0x0 // 0000 # define OPCOD_L_EXTHZ 0x2 // 0010 # define OPCOD_L_EXTBS 0x1 // 0001 # define OPCOD_L_EXTBZ 0x3 // 0011 // OPCOD_13 instructions - [9:6] Instructions extend (64b) # define OPCOD_L_EXTWS 0x0 // 0000 # define OPCOD_L_EXTWZ 0x1 // 0001 }; // end namespace behavioural }; // end namespace morpheo #endif