cpu_arith.h File Reference


Detailed Description

Contains code macros for the processor integer arithmetic instructions.

Based on ARM chapter 4.4.

Id
cpu_arith.h,v 1.15 2008/03/14 15:30:52 iamcamiel Exp

X-1.14 Camiel Vanderhoeven 14-MAR-2008 1. More meaningful exceptions replace throwing (int) 1. 2. U64 macro replaces X64 macro.

X-1.13 Camiel Vanderhoeven 28-JAN-2008 Better floating-point exception handling.

X-1.12 Camiel Vanderhoeven 24-JAN-2008 Fixed some overflow-detection issues.

X-1.11 Camiel Vanderhoeven 22-JAN-2008 Also fixed MULQ/V.

X-1.10 Camiel Vanderhoeven 22-JAN-2008 Use RA, RAV style macro's for integer registers; fixed MULQ.

X-1.9 Camiel Vanderhoeven 22-JAN-2008 Implemented missing /V integer instructions.

X-1.8 Camiel Vanderhoeven 21-JAN-2008 Fixed misunderstanding of the INT bit in integer overflow traps.

X-1.7 Camiel Vanderhoeven 18-JAN-2008 Replaced sext_64 inlines with sext_u64_<bits> inlines for performance reasons (thanks to David Hittner for spotting this!);

X-1.6 David Hittner 16-JAN-2008 Added ADDL/V instruction

X-1.5 Camiel Vanderhoeven 2-DEC-2007 Use sext_64 inline.

X-1.4 Camiel Vanderhoeven 11-APR-2007 Moved all data that should be saved to a state file to a structure "state".

X-1.3 Camiel Vanderhoeven 30-MAR-2007 Added old changelog comments.

X-1.2 Camiel Vanderhoeven 18-MAR-2007 Bugfix in CTLZ and CTTZ instructions. Fixes the INCON_SCHED bugcheck (bug # 1680064).

X-1.1 Camiel Vanderhoeven 18-FEB-2007 File created. Contains code previously found in AlphaCPU.h

Author:
Camiel Vanderhoeven (camiel@camicom.com / http://www.camicom.com)

Definition in file cpu_arith.h.

Go to the source code of this file.

Defines

#define DO_CMPEQ   RCV = (RAV == RBV) ? 1 : 0;
#define DO_CMPLT   RCV = ((s64) RAV < (s64) RBV) ? 1 : 0;
#define DO_CMPLE   RCV = ((s64) RAV <= (s64) RBV) ? 1 : 0;
#define DO_ADDQ   RCV = RAV + RBV;
#define DO_S4ADDQ   RCV = (RAV * 4) + RBV;
#define DO_S8ADDQ   RCV = (RAV * 8) + RBV;
#define DO_ADDQ_V
#define DO_ADDL   RCV = sext_u64_32(RAV + RBV);
#define DO_S4ADDL   RCV = sext_u64_32((RAV * 4) + RBV);
#define DO_S8ADDL   RCV = sext_u64_32((RAV * 8) + RBV);
#define DO_ADDL_V
#define DO_CTLZ
#define DO_CTPOP
#define DO_CTTZ
#define DO_CMPULT   RCV = ((u64) RAV < (u64) RBV) ? 1 : 0;
#define DO_CMPULE   RCV = ((u64) RAV <= (u64) RBV) ? 1 : 0;
#define DO_MULL   RCV = sext_u64_32(sext_u64_32(RAV) * sext_u64_32(RBV));
#define DO_MULL_V
#define DO_MULQ   RCV = RAV * RBV;
#define DO_MULQ_V
#define DO_UMULH   uemul64(RAV, RBV, &RCV);
#define DO_SUBQ   RCV = RAV - RBV;
#define DO_S4SUBQ   RCV = (RAV * 4) - RBV;
#define DO_S8SUBQ   RCV = (RAV * 8) - RBV;
#define DO_SUBQ_V
#define DO_SUBL   RCV = sext_u64_32(RAV - RBV);
#define DO_S4SUBL   RCV = sext_u64_32((RAV * 4) - RBV);
#define DO_S8SUBL   RCV = sext_u64_32((RAV * 8) - RBV);
#define DO_SUBL_V


Define Documentation

#define DO_ADDL   RCV = sext_u64_32(RAV + RBV);

Definition at line 107 of file cpu_arith.h.

#define DO_ADDL_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    RCV = sext_u64_32(rav + rbv);                                               \
                                                                             \
    /* test for integer overflow */                                             \
    if(((~rav ^ rbv) & (rav ^ RCV)) & L_SIGN)                                   \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("ADDL_V %016"LL "x + %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 111 of file cpu_arith.h.

#define DO_ADDQ   RCV = RAV + RBV;

Definition at line 88 of file cpu_arith.h.

#define DO_ADDQ_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    RCV = rav + rbv;                                                            \
                                                                             \
    /* test for integer overflow */                                             \
    if(((~rav ^ rbv) & (rav ^ RCV)) & Q_SIGN)                                   \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("ADDQ_V %016"LL "x + %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 92 of file cpu_arith.h.

#define DO_CMPEQ   RCV = (RAV == RBV) ? 1 : 0;

Definition at line 83 of file cpu_arith.h.

#define DO_CMPLE   RCV = ((s64) RAV <= (s64) RBV) ? 1 : 0;

Definition at line 85 of file cpu_arith.h.

#define DO_CMPLT   RCV = ((s64) RAV < (s64) RBV) ? 1 : 0;

Definition at line 84 of file cpu_arith.h.

#define DO_CMPULE   RCV = ((u64) RAV <= (u64) RBV) ? 1 : 0;

Definition at line 152 of file cpu_arith.h.

#define DO_CMPULT   RCV = ((u64) RAV < (u64) RBV) ? 1 : 0;

Definition at line 151 of file cpu_arith.h.

#define DO_CTLZ

Value:

temp_64 = 0; \
  temp_64_2 = RBV;             \
  for(i = 63; i >= 0; i--)     \
    if((temp_64_2 >> i) & 1)   \
      break;                   \
    else                       \
      temp_64++;               \
  RCV = temp_64;

Definition at line 126 of file cpu_arith.h.

#define DO_CTPOP

Value:

temp_64 = 0; \
  temp_64_2 = RBV;             \
  for(i = 0; i < 64; i++)      \
    if((temp_64_2 >> i) & 1)   \
      temp_64++;               \
  RCV = temp_64;

Definition at line 135 of file cpu_arith.h.

#define DO_CTTZ

Value:

temp_64 = 0; \
  temp_64_2 = RBV;             \
  for(i = 0; i < 64; i++)      \
    if((temp_64_2 >> i) & 1)   \
      break;                   \
    else                       \
      temp_64++;               \
  RCV = temp_64;

Definition at line 142 of file cpu_arith.h.

#define DO_MULL   RCV = sext_u64_32(sext_u64_32(RAV) * sext_u64_32(RBV));

Definition at line 155 of file cpu_arith.h.

#define DO_MULL_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    u64 sr = sext_u64_32(rav) * sext_u64_32(rbv);                               \
    RCV = sext_u64_32(sr);                                                      \
    if((RCV ^ sr) & U64(0xffffffff00000000))                                    \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("MULL_V %016"LL "x * %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 157 of file cpu_arith.h.

#define DO_MULQ   RCV = RAV * RBV;

Definition at line 171 of file cpu_arith.h.

#define DO_MULQ_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    u64 t64;                                                                    \
    RCV = uemul64(rav, rbv, &t64);                                              \
    if(Q_GETSIGN(rav))                                                          \
      t64 -= rbv;                                                               \
    if(Q_GETSIGN(rbv))                                                          \
      t64 -= rav;                                                               \
    if(Q_GETSIGN(RCV) ? (t64 != X64_QUAD) : (t64 != 0))                         \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("MULQ_V %016"LL "x * %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 173 of file cpu_arith.h.

#define DO_S4ADDL   RCV = sext_u64_32((RAV * 4) + RBV);

Definition at line 108 of file cpu_arith.h.

#define DO_S4ADDQ   RCV = (RAV * 4) + RBV;

Definition at line 89 of file cpu_arith.h.

#define DO_S4SUBL   RCV = sext_u64_32((RAV * 4) - RBV);

Definition at line 214 of file cpu_arith.h.

#define DO_S4SUBQ   RCV = (RAV * 4) - RBV;

Definition at line 195 of file cpu_arith.h.

#define DO_S8ADDL   RCV = sext_u64_32((RAV * 8) + RBV);

Definition at line 109 of file cpu_arith.h.

#define DO_S8ADDQ   RCV = (RAV * 8) + RBV;

Definition at line 90 of file cpu_arith.h.

#define DO_S8SUBL   RCV = sext_u64_32((RAV * 8) - RBV);

Definition at line 215 of file cpu_arith.h.

#define DO_S8SUBQ   RCV = (RAV * 8) - RBV;

Definition at line 196 of file cpu_arith.h.

#define DO_SUBL   RCV = sext_u64_32(RAV - RBV);

Definition at line 213 of file cpu_arith.h.

#define DO_SUBL_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    RCV = sext_u64_32(rav - rbv);                                               \
                                                                             \
    /* test for integer overflow */                                             \
    if(((rav ^ rbv) & (rav ^ RCV)) & L_SIGN)                                    \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("SUBL_V %016"LL "x - %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 217 of file cpu_arith.h.

#define DO_SUBQ   RCV = RAV - RBV;

Definition at line 194 of file cpu_arith.h.

#define DO_SUBQ_V

Value:

{                                                                             \
    u64 rav = RAV;                                                              \
    u64 rbv = RBV;                                                              \
    RCV = rav - rbv;                                                            \
                                                                             \
    /* test for integer overflow */                                             \
    if(((rav ^ rbv) & (rav ^ RCV)) & Q_SIGN)                                    \
    {                                                                           \
      ARITH_TRAP_I(TRAP_IOV, RC);                                               \
      printf("SUBQ_V %016"LL "x - %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
             RCV);                                                              \
    }                                                                           \
  }

Definition at line 198 of file cpu_arith.h.

#define DO_UMULH   uemul64(RAV, RBV, &RCV);

Definition at line 191 of file cpu_arith.h.


SourceForge.net Logo
Project space on SourceForge.net