Browse Source

[sim,xcc] Added first few Hauser FP insns (sign-injection)

Also updated FPmove test case to test negation and moving between FP regs
cs250
Andrew Waterman 16 years ago
parent
commit
c12327f15c
  1. 1
      riscv/decode.h
  2. 84
      riscv/execute.h
  3. 0
      riscv/insns/add_d.h
  4. 0
      riscv/insns/add_s.h
  5. 0
      riscv/insns/div_d.h
  6. 0
      riscv/insns/div_s.h
  7. 2
      riscv/insns/mov_fmt.h
  8. 1
      riscv/insns/movn.h
  9. 1
      riscv/insns/movz.h
  10. 0
      riscv/insns/mul_d.h
  11. 0
      riscv/insns/mul_s.h
  12. 2
      riscv/insns/sgninj_d.h
  13. 2
      riscv/insns/sgninj_s.h
  14. 2
      riscv/insns/sgninjn_d.h
  15. 2
      riscv/insns/sgninjn_s.h
  16. 2
      riscv/insns/sgnmul_d.h
  17. 2
      riscv/insns/sgnmul_s.h
  18. 0
      riscv/insns/sqrt_d.h
  19. 0
      riscv/insns/sqrt_s.h
  20. 0
      riscv/insns/sub_d.h
  21. 0
      riscv/insns/sub_s.h

1
riscv/decode.h

@ -1,6 +1,7 @@
#ifndef _RISCV_DECODE_H
#define _RISCV_DECODE_H
#define __STDC_LIMIT_MACROS
#include <stdint.h>
typedef int int128_t __attribute__((mode(TI)));
typedef unsigned int uint128_t __attribute__((mode(TI)));

84
riscv/execute.h

@ -67,72 +67,84 @@ switch((insn.bits >> 0x19) & 0x7f)
{
case 0x0:
{
if((insn.bits & 0xfe007c00) == 0xd0000000)
if((insn.bits & 0xfe007fe0) == 0xd0000ca0)
{
#include "insns/add_fmt.h"
#include "insns/sgninj_d.h"
break;
}
#include "insns/unimp.h"
}
case 0x1:
if((insn.bits & 0xfe007fe0) == 0xd00000a0)
{
if((insn.bits & 0xfe007c00) == 0xd0001000)
{
#include "insns/sub_fmt.h"
#include "insns/sgninj_s.h"
break;
}
#include "insns/unimp.h"
}
case 0x2:
if((insn.bits & 0xfe007fe0) == 0xd0000000)
{
if((insn.bits & 0xfe007c00) == 0xd0002000)
{
#include "insns/mul_fmt.h"
#include "insns/add_s.h"
break;
}
#include "insns/unimp.h"
}
case 0x3:
{
if((insn.bits & 0xfe007c00) == 0xd0003000)
if((insn.bits & 0xfe007fe0) == 0xd0000c00)
{
#include "insns/div_fmt.h"
#include "insns/add_d.h"
break;
}
#include "insns/unimp.h"
if((insn.bits & 0xfe007fe0) == 0xd0000ce0)
{
#include "insns/sgnmul_d.h"
break;
}
case 0x4:
if((insn.bits & 0xfe007fe0) == 0xd0000cc0)
{
if((insn.bits & 0xfe0ffc00) == 0xd0004000)
#include "insns/sgninjn_d.h"
break;
}
if((insn.bits & 0xfe007fe0) == 0xd00000c0)
{
#include "insns/sqrt_fmt.h"
#include "insns/sgninjn_s.h"
break;
}
#include "insns/unimp.h"
if((insn.bits & 0xfe007fe0) == 0xd0000c40)
{
#include "insns/mul_d.h"
break;
}
case 0x5:
if((insn.bits & 0xfe007fe0) == 0xd0000020)
{
if((insn.bits & 0xfe0ffc00) == 0xd0005000)
#include "insns/sub_s.h"
break;
}
if((insn.bits & 0xfe007fe0) == 0xd0000c20)
{
#include "insns/abs_fmt.h"
#include "insns/sub_d.h"
break;
}
#include "insns/unimp.h"
if((insn.bits & 0xfe0fffe0) == 0xd0000080)
{
#include "insns/sqrt_s.h"
break;
}
case 0x6:
if((insn.bits & 0xfe0fffe0) == 0xd0000c80)
{
if((insn.bits & 0xfe0ffc00) == 0xd0006000)
#include "insns/sqrt_d.h"
break;
}
if((insn.bits & 0xfe007fe0) == 0xd00000e0)
{
#include "insns/mov_fmt.h"
#include "insns/sgnmul_s.h"
break;
}
#include "insns/unimp.h"
if((insn.bits & 0xfe007fe0) == 0xd0000c60)
{
#include "insns/div_d.h"
break;
}
case 0x7:
if((insn.bits & 0xfe007fe0) == 0xd0000060)
{
if((insn.bits & 0xfe0ffc00) == 0xd0007000)
#include "insns/div_s.h"
break;
}
if((insn.bits & 0xfe007fe0) == 0xd0000040)
{
#include "insns/neg_fmt.h"
#include "insns/mul_s.h"
break;
}
#include "insns/unimp.h"

0
riscv/insns/abs_fmt.h → riscv/insns/add_d.h

0
riscv/insns/add_fmt.h → riscv/insns/add_s.h

0
riscv/insns/div_fmt.h → riscv/insns/div_d.h

0
riscv/insns/mul_fmt.h → riscv/insns/div_s.h

2
riscv/insns/mov_fmt.h

@ -1,2 +0,0 @@
require_fp;
FRC = FRA;

1
riscv/insns/movn.h

@ -1 +0,0 @@
if(RB) RC = RA;

1
riscv/insns/movz.h

@ -1 +0,0 @@
if(!RB) RC = RA;

0
riscv/insns/neg_fmt.h → riscv/insns/mul_d.h

0
riscv/insns/sqrt_fmt.h → riscv/insns/mul_s.h

2
riscv/insns/sgninj_d.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = (FRA.bits &~ INT64_MIN) | (FRB.bits & INT64_MIN);

2
riscv/insns/sgninj_s.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = (FRA.bits &~ (uint32_t)INT32_MIN) | (FRB.bits & (uint32_t)INT32_MIN);

2
riscv/insns/sgninjn_d.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = (FRA.bits &~ INT64_MIN) | ((~FRB.bits) & INT64_MIN);

2
riscv/insns/sgninjn_s.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = (FRA.bits &~ (uint32_t)INT32_MIN) | ((~FRB.bits) & (uint32_t)INT32_MIN);

2
riscv/insns/sgnmul_d.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = FRA.bits ^ (FRB.bits & INT64_MIN);

2
riscv/insns/sgnmul_s.h

@ -0,0 +1,2 @@
require_fp;
FRC.bits = FRA.bits ^ (FRB.bits & (uint32_t)INT32_MIN);

0
riscv/insns/sub_fmt.h → riscv/insns/sqrt_d.h

0
riscv/insns/sqrt_s.h

0
riscv/insns/sub_d.h

0
riscv/insns/sub_s.h

Loading…
Cancel
Save