OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [or1ksim/] [cpu/] [or32/] [insnset.c] - Diff between revs 82 and 100

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 82 Rev 100
Line 1... Line 1...
/* insnset.c -- Instruction specific functions.
/* insnset.c -- Instruction specific functions.
 
 
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
                 2000-2002 Marko Mlinar, markom@opencores.org
                 2000-2002 Marko Mlinar, markom@opencores.org
   Copyright (C) 2008 Embecosm Limited
   Copyright (C) 2008 Embecosm Limited
 
   Copyright (C) 2009 Jungsook yang, jungsook.yang@uci.edu
 
 
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
 
   Contributor Julius Baxter julius@orsoc.se
 
 
   This file is part of OpenRISC 1000 Architectural Simulator.
   This file is part of OpenRISC 1000 Architectural Simulator.
 
 
   This program is free software; you can redistribute it and/or modify it
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the Free
   under the terms of the GNU General Public License as published by the Free
Line 539... Line 541...
  SET_PARAM0(ffs(PARAM1));
  SET_PARAM0(ffs(PARAM1));
}
}
/******* Floating point instructions *******/
/******* Floating point instructions *******/
/* Single precision */
/* Single precision */
INSTRUCTION (lf_add_s) {
INSTRUCTION (lf_add_s) {
  SET_PARAM0((float)PARAM1 + (float)PARAM2);
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1, param2;
 
  param1.hval = (uorreg_t)PARAM1;
 
  param2.hval = (uorreg_t)PARAM2;
 
  param0.fval = param1.fval + param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_div_s) {
INSTRUCTION (lf_div_s) {
  SET_PARAM0((float)PARAM1 / (float)PARAM2);
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1, param2;
 
  param1.hval = (uorreg_t)PARAM1;
 
  param2.hval = (uorreg_t)PARAM2;
 
  param0.fval = param1.fval / param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_ftoi_s) {
INSTRUCTION (lf_ftoi_s) {
//  set_operand32(0, freg[get_operand(1)], &breakpoint);
  if (config.cpu.hardfloat) {
 
    // no other way appeared to work --jb
 
    float tmp_f; memcpy((void*)&tmp_f, (void*)&PARAM1, sizeof(float));
 
    SET_PARAM0((int)tmp_f);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_itof_s) {
INSTRUCTION (lf_itof_s) {
//  freg[get_operand(0)] = eval_operand32(1, &breakpoint);
  if (config.cpu.hardfloat) {
 
  FLOAT param0;
 
  param0.fval = (float)((int)PARAM1);
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_madd_s) {
INSTRUCTION (lf_madd_s) {
  SET_PARAM0((float)PARAM0 + (float)PARAM1 * (float)PARAM2);
  if (config.cpu.hardfloat) {
 
  FLOAT param0,param1, param2;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  param2.hval = PARAM2;
 
  param0.fval += param1.fval * param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_mul_s) {
INSTRUCTION (lf_mul_s) {
  SET_PARAM0((float)PARAM1 * (float)PARAM2);
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1, param2;
 
  param1.hval = (uorreg_t)PARAM1;
 
  param2.hval = (uorreg_t)PARAM2;
 
  param0.fval = param1.fval * param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_rem_s) {
INSTRUCTION (lf_rem_s) {
  float temp = (float)PARAM1 / (float)PARAM2;
  if (config.cpu.hardfloat) {
  SET_PARAM0(temp - (uint32_t)temp);
  FLOAT param0, param1, param2;
 
  param1.hval = PARAM1;
 
  param2.hval = PARAM2;
 
  param0.fval = param1.fval / param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sfeq_s) {
INSTRUCTION (lf_sfeq_s) {
  if((float)PARAM0 == (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval == param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sfge_s) {
INSTRUCTION (lf_sfge_s) {
  if((float)PARAM0 >= (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval >= param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sfgt_s) {
INSTRUCTION (lf_sfgt_s) {
  if((float)PARAM0 > (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval > param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sfle_s) {
INSTRUCTION (lf_sfle_s) {
  if((float)PARAM0 <= (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval <= param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sflt_s) {
INSTRUCTION (lf_sflt_s) {
  if((float)PARAM0 < (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval < param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sfne_s) {
INSTRUCTION (lf_sfne_s) {
  if((float)PARAM0 != (float)PARAM1)
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1;
 
  param0.hval = PARAM0;
 
  param1.hval = PARAM1;
 
  if(param0.fval != param1.fval)
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
    cpu_state.sprs[SPR_SR] |= SPR_SR_F;
  else
  else
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
    cpu_state.sprs[SPR_SR] &= ~SPR_SR_F;
 
  } else l_invalid();
}
}
INSTRUCTION (lf_sub_s) {
INSTRUCTION (lf_sub_s) {
  SET_PARAM0((float)PARAM1 - (float)PARAM2);
  if (config.cpu.hardfloat) {
 
  FLOAT param0, param1, param2;
 
  param1.hval = PARAM1;
 
  param2.hval = PARAM2;
 
  param0.fval = param1.fval - param2.fval;
 
  SET_PARAM0(param0.hval);
 
  } else l_invalid();
}
}
 
 
/******* Custom instructions *******/
/******* Custom instructions *******/
INSTRUCTION (l_cust1) {
INSTRUCTION (l_cust1) {
  /*int destr = current->insn >> 21;
  /*int destr = current->insn >> 21;
Line 612... Line 688...
}
}
INSTRUCTION (l_cust3) {
INSTRUCTION (l_cust3) {
}
}
INSTRUCTION (l_cust4) {
INSTRUCTION (l_cust4) {
}
}
 
INSTRUCTION (lf_cust1) {
 
}
 
INSTRUCTION (lf_cust2) {
 
}
 
INSTRUCTION (lf_cust3) {
 
}
 
INSTRUCTION (lf_cust4) {
 
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.