table.c 11.2 KB
/****************************************************************
  WHAT:	RSP REGRESSION TEST GENERATOR - INSTRUCTION TABLE
  SCCS: @(#)table.c	1.2 03 Oct 1994
  FILE:	table.c
   WHO:	Project Reality - Evan Y. Wang
   (C):	1994 Silicon Graphics, Inc.
 ****************************************************************/
#include <stdio.h>
#include <assert.h>
#include "software.h"
#include "gen.h"
#include "suregre.h"

/****************************************************************
 * R4000 INSTRUCTION SET PREDICTION ROUTINES			*
 *   add: ADD, ADDI, ADDIU, ADDU				*
 *   and: AND, ANDI						*
 *   nor: NOR							*
 *   or : OR, ORI						*
 *   sub: SUB, SUBU						*
 *   xor: XOR, XORI						*
 *   sll: SLL, SLLV						*
 *   srl: SRL, SRLV						*
 *   sra: SRA, SRAV						*
 *   eql: BEQ							*
 *   gez: BGEZ, BGEZAL						*
 *   gtz: BGTZ							*
 *   lez: BLEZ							*
 *   ltz: BLTZ, BLTZAL						*
 *   neq: BNE							*
 *   slt: SLT, SLTU, SLTI, SLTIU				*
 ****************************************************************/
u32 lui(i)     u16 i;	 { return (u32) i << 16;		}
u32 add(a,b)   u32 a,b;	 { return a + b;			}
u32 addi(a,i)  u32 a,i;	 { return a + HSgnExt(i);		}
u32 and(a,b)   u32 a,b;	 { return a & b;			}
u32 nor(a,b)   u32 a,b;	 { return ~(a | b);			}
u32 or (a,b)   u32 a,b;	 { return a | b;			}
u32 sub(a,b)   u32 a,b;	 { return a - b;			}
u32 xor(a,b)   u32 a,b;	 { return a ^ b;			}
u32 sll(a,s)   u32 a,s;	 { return a << s;			}
u32 srl(a,s)   u32 a,s;	 { return a >> s;			}
u32 sra(a,s)   s32 a,s;	 { return (signed) a >> s;		}
u32 eql(a,b)   s32 a,b;	 { return a == b;			}
u32 gez(a)     s32 a;	 { return a >= 0;			}
u32 gtz(a)     s32 a;	 { return a > 0;			}
u32 lez(a)     s32 a;	 { return a <= 0;			}
u32 ltz(a)     s32 a;	 { return a < 0;			}
u32 neq(a,b)   s32 a,b;	 { return a != b;			}
u32 slt(a,b)   s32 a,b;	 { return a < b;			}
u32 slti(a,i)  s32 a,i;	 { return a < (long) HSgnExt(i);	}
u32 sltiu(a,i) u32 a,i;	 { return a < (u32)  HSgnExt(i);	}
u32 sltu(a,b)  u32 a,b;  { return a < b;			}
u32 lb(b,i)    s32 b,i;	 { u32 adr = b-DMEM_BASE+HSgnExt(i);
			   assert(adr>=0 && adr<BMEMSIZE);
			   return BSgnExt(*BMem[adr]);		}
u32 lbu(b,i)   s32 b,i;	 { s32 adr = b-DMEM_BASE+HSgnExt(i);
			   assert(adr>=0 && adr<BMEMSIZE);
			   return *BMem[adr];			}
u32 lh(b,i)    s32 b,i;	 { s32 adr = (b-DMEM_BASE+HSgnExt(i))>>1;
			   assert(adr>=0 && adr<HMEMSIZE);
			   return HSgnExt(*HMem[adr]);		}
u32 lhu(b,i)   s32 b,i;	 { s32 adr = (b-DMEM_BASE+HSgnExt(i))>>1;
			   assert(adr>=0 && adr<HMEMSIZE);
			   return *HMem[adr];			}
u32 lw(b,i)    s32 b,i;	 { s32 adr = (b-DMEM_BASE+HSgnExt(i))>>2;
			   assert(adr>=0 && adr<WMEMSIZE);
			   return *WMem[adr];			}
u32 dum(a)     u32 a;	 { return a;				}
u32 sb(a,b,i)  u32 a;
	       s32 b,i;  { s32 adr = b-DMEM_BASE+HSgnExt(i);
			   assert(adr>=0 && adr<BMEMSIZE);
			   *BMem[adr] = (u8) a;
			   return *WMem[adr>>2];		}
u32 sh(a,b,i)  u32 a;
	       s32 b,i;  { s32 adr = (b-DMEM_BASE+HSgnExt(i))>>1;
			   assert(adr>=0 && adr<HMEMSIZE);
			   *HMem[adr] = (u16) a;
			   return *WMem[adr>>1];		}
u32 sw(a,b,i)  u32 a;
	       s32 b,i;  { s32 adr = (b-DMEM_BASE+HSgnExt(i))>>2;
			   assert(adr>=0 && adr<WMEMSIZE);
			   return *WMem[adr] = a;		}
extern	u32 vld();
extern	u32 vlt();
extern	u32 vst();

u32 cfc2(a,b) u32 a,b;   { return Imm = HSgnExt(b);  }
u32 ctc2(a,b) u32 a,b;   { Imm = a; return HSgnExt(a); }

I_TABLE InstrTable[] = {

    { "lui",    NMEM,  LUI_VEC, AluWIGen,   dum  },
    { "add",    NMEM,  ADD_VEC, AluWWWGen,  add  },
    { "addi",   NMEM,  ADD_VEC, AluWWIGen,  addi },
    { "addiu",  NMEM,  ADD_VEC, AluWWIGen,  addi },
    { "addu",   NMEM,  ADD_VEC, AluWWWGen,  add  },
    { "and",    NMEM,  LOG_VEC, AluWWWGen,  and  },
    { "andi",   NMEM,  LOG_VEC, AluWWIGen,  and  },
    { "nor",    NMEM,  LOG_VEC, AluWWWGen,  nor  },
    { "or",     NMEM,  LOG_VEC, AluWWWGen,  or   },
    { "ori",    NMEM,  LOG_VEC, AluWWIGen,  or   },
    { "sll",    NMEM,  SHF_VEC, AluWWIGen,  sll  },
    { "sllv",   NMEM,  SHF_VEC, AluWWWGen,  sll  },
    { "sra",    NMEM,  SHF_VEC, AluWWIGen,  sra  },
    { "srav",   NMEM,  SHF_VEC, AluWWWGen,  sra  },
    { "srl",    NMEM,  SHF_VEC, AluWWIGen,  srl  },
    { "srlv",   NMEM,  SHF_VEC, AluWWWGen,  srl  },
    { "sub",    NMEM,  ADD_VEC, AluWWWGen,  sub  },
    { "subu",   NMEM,  ADD_VEC, AluWWWGen,  sub  },
    { "xor",    NMEM,  LOG_VEC, AluWWWGen,  xor  },
    { "xori",   NMEM,  LOG_VEC, AluWWIGen,  xor  },
    { "beq",    NMEM,  BRN_VEC, BrWWGen,    eql  },
    { "bgez",   NMEM,  BRN_VEC, BrWGen,     gez  },
    { "bgezal", NMEM,  BRN_VEC, BrlWGen,    gez  },
    { "bgtz",   NMEM,  BRN_VEC, BrWGen,     gtz  },
    { "blez",   NMEM,  BRN_VEC, BrWGen,     lez  },
    { "bltz",   NMEM,  BRN_VEC, BrWGen,     ltz  },
    { "bltzal", NMEM,  BRN_VEC, BrlWGen,    ltz  },
    { "bne",    NMEM,  BRN_VEC, BrWWGen,    neq  },
    { "slt",    NMEM,  SET_VEC, AluWWWGen,  slt  },
    { "slti",   NMEM,  SET_VEC, AluWWIGen,  slti },
    { "sltiu",  NMEM,  SET_VEC, AluWWIGen,  sltiu},
    { "sltu",   NMEM,  SET_VEC, AluWWWGen,  sltu },
    { "j",      NMEM,  JMP_VEC, JGen,       dum  },
    { "jal",    NMEM,  JMP_VEC, JalGen,     dum  },
    { "jalr",   NMEM,  JMP_VEC, JalrGen,    dum  },
    { "jr",     NMEM,  JMP_VEC, JrGen,      dum  },
    { "lb",     SMEM,  LDB_VEC, LdGen,      lb   },
    { "lbu",    SMEM,  LDB_VEC, LdGen,      lbu  },
    { "lh",     SMEM,  LDH_VEC, LdGen,      lh   },
    { "lhu",    SMEM,  LDH_VEC, LdGen,      lhu  },
    { "lw",     SMEM,  LDW_VEC, LdGen,      lw   },
    { "sb",     ZMEM,  STB_VEC, StGen,      sb   },
    { "sh",     ZMEM,  STH_VEC, StGen,      sh   },
    { "sw",     ZMEM,  STW_VEC, StGen,      sw   },
    { "lbv",    VMEM,  VLS_BYTE, VldGen,    vld  },
    { "lsv",    VMEM,  VLS_SHRT, VldGen,    vld  },
    { "llv",    VMEM,  VLS_WORD, VldGen,    vld  },
    { "ldv",    VMEM,  VLS_DBLE, VldGen,    vld  },
    { "lqv",    VMEM,  VLS_QUAD, VldGen,    vld  },
    { "lrv",    VMEM,  VLS_REST, VldGen,    vld  },
    { "lpv",    VMEM,  VLS_PACK, VldGen,    vld  },
    { "luv",    VMEM,  VLS_UPCK, VldGen,    vld  },
    { "lhv",    VMEM,  VLS_HALF, VldGen,    vld  },
    { "lfv",    VMEM,  VLS_FRTH, VldGen,    vld  },

    { "ltv",    NMEM,  VLD_TRNS, VtwGen,    dum  },
    { "sbv",    VMEM,  VLS_BYTE, VstGen,    vst  },
    { "ssv",    VMEM,  VLS_SHRT, VstGen,    vst  },
    { "slv",    VMEM,  VLS_WORD, VstGen,    vst  },
    { "sdv",    VMEM,  VLS_DBLE, VstGen,    vst  },
    { "sqv",    VMEM,  VLS_QUAD, VstGen,    vst  },
    { "srv",    VMEM,  VLS_REST, VstGen,    vst  },
    { "spv",    VMEM,  VLS_PACK, VstGen,    vst  },
    { "suv",    VMEM,  VLS_UPCK, VstGen,    vst  },
    { "shv",    VMEM,  VLS_HALF, VstGen,    vst  },
    { "sfv",    VMEM,  VLS_FRTH, VstGen,    vst  },
    { "stv",    NMEM,  VST_TRNS, VtwGen,    dum  },
    { "swv",	NMEM,  VST_WRAP, VtwGen,    dum  },
    { "cfc2",	NMEM,  NUL_VEC,  Cc2Gen,    cfc2 },
    { "ctc2",	NMEM,  NUL_VEC,  Cc2Gen,    ctc2 },
    { "mfc2",	NMEM,  NUL_VEC,  Mc2Gen,    cfc2 },
    { "mtc2",	NMEM,  NUL_VEC,  Mc2Gen,    ctc2 },
};
int InstrTableSize = sizeof(InstrTable) / sizeof(InstrTable[0]);

u8  * BMem[128] = {

    &Mem[0].u.h.u.hb, &Mem[0].u.h.u.lb, &Mem[0].u.l.u.hb, &Mem[0].u.l.u.lb,
    &Mem[1].u.h.u.hb, &Mem[1].u.h.u.lb, &Mem[1].u.l.u.hb, &Mem[1].u.l.u.lb,
    &Mem[2].u.h.u.hb, &Mem[2].u.h.u.lb, &Mem[2].u.l.u.hb, &Mem[2].u.l.u.lb,
    &Mem[3].u.h.u.hb, &Mem[3].u.h.u.lb, &Mem[3].u.l.u.hb, &Mem[3].u.l.u.lb,
    &Mem[4].u.h.u.hb, &Mem[4].u.h.u.lb, &Mem[4].u.l.u.hb, &Mem[4].u.l.u.lb,
    &Mem[5].u.h.u.hb, &Mem[5].u.h.u.lb, &Mem[5].u.l.u.hb, &Mem[5].u.l.u.lb,
    &Mem[6].u.h.u.hb, &Mem[6].u.h.u.lb, &Mem[6].u.l.u.hb, &Mem[6].u.l.u.lb,
    &Mem[7].u.h.u.hb, &Mem[7].u.h.u.lb, &Mem[7].u.l.u.hb, &Mem[7].u.l.u.lb,

    &Mem[8].u.h.u.hb, &Mem[8].u.h.u.lb, &Mem[8].u.l.u.hb, &Mem[8].u.l.u.lb,
    &Mem[9].u.h.u.hb, &Mem[9].u.h.u.lb, &Mem[9].u.l.u.hb, &Mem[9].u.l.u.lb,
    &Mem[10].u.h.u.hb,&Mem[10].u.h.u.lb,&Mem[10].u.l.u.hb,&Mem[10].u.l.u.lb,
    &Mem[11].u.h.u.hb,&Mem[11].u.h.u.lb,&Mem[11].u.l.u.hb,&Mem[11].u.l.u.lb,
    &Mem[12].u.h.u.hb,&Mem[12].u.h.u.lb,&Mem[12].u.l.u.hb,&Mem[12].u.l.u.lb,
    &Mem[13].u.h.u.hb,&Mem[13].u.h.u.lb,&Mem[13].u.l.u.hb,&Mem[13].u.l.u.lb,
    &Mem[14].u.h.u.hb,&Mem[14].u.h.u.lb,&Mem[14].u.l.u.hb,&Mem[14].u.l.u.lb,
    &Mem[15].u.h.u.hb,&Mem[15].u.h.u.lb,&Mem[15].u.l.u.hb,&Mem[15].u.l.u.lb,

    &Mem[16].u.h.u.hb,&Mem[16].u.h.u.lb,&Mem[16].u.l.u.hb,&Mem[16].u.l.u.lb,
    &Mem[17].u.h.u.hb,&Mem[17].u.h.u.lb,&Mem[17].u.l.u.hb,&Mem[17].u.l.u.lb,
    &Mem[18].u.h.u.hb,&Mem[18].u.h.u.lb,&Mem[18].u.l.u.hb,&Mem[18].u.l.u.lb,
    &Mem[19].u.h.u.hb,&Mem[19].u.h.u.lb,&Mem[19].u.l.u.hb,&Mem[19].u.l.u.lb,
    &Mem[20].u.h.u.hb,&Mem[20].u.h.u.lb,&Mem[20].u.l.u.hb,&Mem[20].u.l.u.lb,
    &Mem[21].u.h.u.hb,&Mem[21].u.h.u.lb,&Mem[21].u.l.u.hb,&Mem[21].u.l.u.lb,
    &Mem[22].u.h.u.hb,&Mem[22].u.h.u.lb,&Mem[22].u.l.u.hb,&Mem[22].u.l.u.lb,
    &Mem[23].u.h.u.hb,&Mem[23].u.h.u.lb,&Mem[23].u.l.u.hb,&Mem[23].u.l.u.lb,

    &Mem[24].u.h.u.hb,&Mem[24].u.h.u.lb,&Mem[24].u.l.u.hb,&Mem[24].u.l.u.lb,
    &Mem[25].u.h.u.hb,&Mem[25].u.h.u.lb,&Mem[25].u.l.u.hb,&Mem[25].u.l.u.lb,
    &Mem[26].u.h.u.hb,&Mem[26].u.h.u.lb,&Mem[26].u.l.u.hb,&Mem[26].u.l.u.lb,
    &Mem[27].u.h.u.hb,&Mem[27].u.h.u.lb,&Mem[27].u.l.u.hb,&Mem[27].u.l.u.lb,
    &Mem[28].u.h.u.hb,&Mem[28].u.h.u.lb,&Mem[28].u.l.u.hb,&Mem[28].u.l.u.lb,
    &Mem[29].u.h.u.hb,&Mem[29].u.h.u.lb,&Mem[29].u.l.u.hb,&Mem[29].u.l.u.lb,
    &Mem[30].u.h.u.hb,&Mem[30].u.h.u.lb,&Mem[30].u.l.u.hb,&Mem[30].u.l.u.lb,
    &Mem[31].u.h.u.hb,&Mem[31].u.h.u.lb,&Mem[31].u.l.u.hb,&Mem[31].u.l.u.lb,
};

u16 * HMem[64] = {
    &Mem[0].u.h.hw,   &Mem[0].u.l.hw,   &Mem[1].u.h.hw,   &Mem[1].u.l.hw, 
    &Mem[2].u.h.hw,   &Mem[2].u.l.hw,   &Mem[3].u.h.hw,   &Mem[3].u.l.hw, 
    &Mem[4].u.h.hw,   &Mem[4].u.l.hw,   &Mem[5].u.h.hw,   &Mem[5].u.l.hw, 
    &Mem[6].u.h.hw,   &Mem[6].u.l.hw,   &Mem[7].u.h.hw,   &Mem[7].u.l.hw, 
    &Mem[8].u.h.hw,   &Mem[8].u.l.hw,   &Mem[9].u.h.hw,   &Mem[9].u.l.hw, 
    &Mem[10].u.h.hw,  &Mem[10].u.l.hw,  &Mem[11].u.h.hw,  &Mem[11].u.l.hw, 
    &Mem[12].u.h.hw,  &Mem[12].u.l.hw,  &Mem[13].u.h.hw,  &Mem[13].u.l.hw, 
    &Mem[14].u.h.hw,  &Mem[14].u.l.hw,  &Mem[15].u.h.hw,  &Mem[15].u.l.hw, 

    &Mem[16].u.h.hw,  &Mem[16].u.l.hw,  &Mem[17].u.h.hw,  &Mem[17].u.l.hw, 
    &Mem[18].u.h.hw,  &Mem[18].u.l.hw,  &Mem[19].u.h.hw,  &Mem[19].u.l.hw, 
    &Mem[20].u.h.hw,  &Mem[20].u.l.hw,  &Mem[21].u.h.hw,  &Mem[21].u.l.hw, 
    &Mem[22].u.h.hw,  &Mem[22].u.l.hw,  &Mem[23].u.h.hw,  &Mem[23].u.l.hw, 
    &Mem[24].u.h.hw,  &Mem[24].u.l.hw,  &Mem[25].u.h.hw,  &Mem[25].u.l.hw, 
    &Mem[26].u.h.hw,  &Mem[26].u.l.hw,  &Mem[27].u.h.hw,  &Mem[27].u.l.hw, 
    &Mem[28].u.h.hw,  &Mem[28].u.l.hw,  &Mem[29].u.h.hw,  &Mem[29].u.l.hw, 
    &Mem[30].u.h.hw,  &Mem[30].u.l.hw,  &Mem[31].u.h.hw,  &Mem[31].u.l.hw, 
};

u32 * WMem[32] = {
    &Mem[0].w,        &Mem[1].w,        &Mem[2].w,        &Mem[3].w,
    &Mem[4].w,        &Mem[5].w,        &Mem[6].w,        &Mem[7].w,
    &Mem[8].w,        &Mem[9].w,        &Mem[10].w,       &Mem[11].w,
    &Mem[12].w,       &Mem[13].w,       &Mem[14].w,       &Mem[15].w,
    &Mem[16].w,       &Mem[17].w,       &Mem[18].w,       &Mem[19].w,
    &Mem[20].w,       &Mem[21].w,       &Mem[22].w,       &Mem[23].w,
    &Mem[24].w,       &Mem[25].w,       &Mem[26].w,       &Mem[27].w,
    &Mem[28].w,       &Mem[29].w,       &Mem[30].w,       &Mem[31].w,
};