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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [gcc.c-torture/] [execute/] [comp-goto-1.c] - Diff between revs 297 and 338

Only display areas with differences | Details | Blame | View Log

Rev 297 Rev 338
#include <stdlib.h>
#include <stdlib.h>
 
 
#if !defined(NO_LABEL_VALUES) && (!defined(STACK_SIZE) || STACK_SIZE >= 4000) && __INT_MAX__ >= 2147483647
#if !defined(NO_LABEL_VALUES) && (!defined(STACK_SIZE) || STACK_SIZE >= 4000) && __INT_MAX__ >= 2147483647
typedef unsigned int uint32;
typedef unsigned int uint32;
typedef signed int sint32;
typedef signed int sint32;
 
 
typedef uint32 reg_t;
typedef uint32 reg_t;
 
 
typedef unsigned long int host_addr_t;
typedef unsigned long int host_addr_t;
typedef uint32 target_addr_t;
typedef uint32 target_addr_t;
typedef sint32 target_saddr_t;
typedef sint32 target_saddr_t;
 
 
typedef union
typedef union
{
{
  struct
  struct
    {
    {
      unsigned int      offset:18;
      unsigned int      offset:18;
      unsigned int      ignore:4;
      unsigned int      ignore:4;
      unsigned int      s1:8;
      unsigned int      s1:8;
      int               :2;
      int               :2;
      signed int        simm:14;
      signed int        simm:14;
      unsigned int      s3:8;
      unsigned int      s3:8;
      unsigned int      s2:8;
      unsigned int      s2:8;
      int               pad2:2;
      int               pad2:2;
    } f1;
    } f1;
  long long ll;
  long long ll;
  double d;
  double d;
} insn_t;
} insn_t;
 
 
typedef struct
typedef struct
{
{
  target_addr_t vaddr_tag;
  target_addr_t vaddr_tag;
  unsigned long int rigged_paddr;
  unsigned long int rigged_paddr;
} tlb_entry_t;
} tlb_entry_t;
 
 
typedef struct
typedef struct
{
{
  insn_t *pc;
  insn_t *pc;
  reg_t registers[256];
  reg_t registers[256];
  insn_t *program;
  insn_t *program;
  tlb_entry_t tlb_tab[0x100];
  tlb_entry_t tlb_tab[0x100];
} environment_t;
} environment_t;
 
 
enum operations
enum operations
{
{
  LOAD32_RR,
  LOAD32_RR,
  METAOP_DONE
  METAOP_DONE
};
};
 
 
host_addr_t
host_addr_t
f ()
f ()
{
{
  abort ();
  abort ();
}
}
 
 
reg_t
reg_t
simulator_kernel (int what, environment_t *env)
simulator_kernel (int what, environment_t *env)
{
{
  register insn_t *pc = env->pc;
  register insn_t *pc = env->pc;
  register reg_t *regs = env->registers;
  register reg_t *regs = env->registers;
  register insn_t insn;
  register insn_t insn;
  register int s1;
  register int s1;
  register reg_t r2;
  register reg_t r2;
  register void *base_addr = &&sim_base_addr;
  register void *base_addr = &&sim_base_addr;
  register tlb_entry_t *tlb = env->tlb_tab;
  register tlb_entry_t *tlb = env->tlb_tab;
 
 
  if (what != 0)
  if (what != 0)
    {
    {
      int i;
      int i;
      static void *op_map[] =
      static void *op_map[] =
        {
        {
          &&L_LOAD32_RR,
          &&L_LOAD32_RR,
          &&L_METAOP_DONE,
          &&L_METAOP_DONE,
        };
        };
      insn_t *program = env->program;
      insn_t *program = env->program;
      for (i = 0; i < what; i++)
      for (i = 0; i < what; i++)
        program[i].f1.offset = op_map[program[i].f1.offset] - base_addr;
        program[i].f1.offset = op_map[program[i].f1.offset] - base_addr;
    }
    }
 
 
 sim_base_addr:;
 sim_base_addr:;
 
 
  insn = *pc++;
  insn = *pc++;
  r2 = (*(reg_t *) (((char *) regs) + (insn.f1.s2 << 2)));
  r2 = (*(reg_t *) (((char *) regs) + (insn.f1.s2 << 2)));
  s1 = (insn.f1.s1 << 2);
  s1 = (insn.f1.s1 << 2);
  goto *(base_addr + insn.f1.offset);
  goto *(base_addr + insn.f1.offset);
 
 
 L_LOAD32_RR:
 L_LOAD32_RR:
  {
  {
    target_addr_t vaddr_page = r2 / 4096;
    target_addr_t vaddr_page = r2 / 4096;
    unsigned int x = vaddr_page % 0x100;
    unsigned int x = vaddr_page % 0x100;
    insn = *pc++;
    insn = *pc++;
 
 
    for (;;)
    for (;;)
      {
      {
        target_addr_t tag = tlb[x].vaddr_tag;
        target_addr_t tag = tlb[x].vaddr_tag;
        host_addr_t rigged_paddr = tlb[x].rigged_paddr;
        host_addr_t rigged_paddr = tlb[x].rigged_paddr;
 
 
        if (tag == vaddr_page)
        if (tag == vaddr_page)
          {
          {
            *(reg_t *) (((char *) regs) + s1) = *(uint32 *) (rigged_paddr + r2);
            *(reg_t *) (((char *) regs) + s1) = *(uint32 *) (rigged_paddr + r2);
            r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));
            r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));
            s1 = insn.f1.s1 << 2;
            s1 = insn.f1.s1 << 2;
            goto *(base_addr + insn.f1.offset);
            goto *(base_addr + insn.f1.offset);
          }
          }
 
 
        if (((target_saddr_t) tag < 0))
        if (((target_saddr_t) tag < 0))
          {
          {
            *(reg_t *) (((char *) regs) + s1) = *(uint32 *) f ();
            *(reg_t *) (((char *) regs) + s1) = *(uint32 *) f ();
            r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));
            r2 = *(reg_t *) (((char *) regs) + (insn.f1.s2 << 2));
            s1 = insn.f1.s1 << 2;
            s1 = insn.f1.s1 << 2;
            goto *(base_addr + insn.f1.offset);
            goto *(base_addr + insn.f1.offset);
          }
          }
 
 
        x = (x - 1) % 0x100;
        x = (x - 1) % 0x100;
      }
      }
 
 
    L_METAOP_DONE:
    L_METAOP_DONE:
      return (*(reg_t *) (((char *) regs) + s1));
      return (*(reg_t *) (((char *) regs) + s1));
  }
  }
}
}
 
 
insn_t program[2 + 1];
insn_t program[2 + 1];
 
 
void *malloc ();
void *malloc ();
 
 
int
int
main ()
main ()
{
{
  environment_t env;
  environment_t env;
  insn_t insn;
  insn_t insn;
  int i, res;
  int i, res;
  host_addr_t a_page = (host_addr_t) malloc (2 * 4096);
  host_addr_t a_page = (host_addr_t) malloc (2 * 4096);
  target_addr_t a_vaddr = 0x123450;
  target_addr_t a_vaddr = 0x123450;
  target_addr_t vaddr_page = a_vaddr / 4096;
  target_addr_t vaddr_page = a_vaddr / 4096;
  a_page = (a_page + 4096 - 1) & -4096;
  a_page = (a_page + 4096 - 1) & -4096;
 
 
  env.tlb_tab[((vaddr_page) % 0x100)].vaddr_tag = vaddr_page;
  env.tlb_tab[((vaddr_page) % 0x100)].vaddr_tag = vaddr_page;
  env.tlb_tab[((vaddr_page) % 0x100)].rigged_paddr = a_page - vaddr_page * 4096;
  env.tlb_tab[((vaddr_page) % 0x100)].rigged_paddr = a_page - vaddr_page * 4096;
  insn.f1.offset = LOAD32_RR;
  insn.f1.offset = LOAD32_RR;
  env.registers[0] = 0;
  env.registers[0] = 0;
  env.registers[2] = a_vaddr;
  env.registers[2] = a_vaddr;
  *(sint32 *) (a_page + a_vaddr % 4096) = 88;
  *(sint32 *) (a_page + a_vaddr % 4096) = 88;
  insn.f1.s1 = 0;
  insn.f1.s1 = 0;
  insn.f1.s2 = 2;
  insn.f1.s2 = 2;
 
 
  for (i = 0; i < 2; i++)
  for (i = 0; i < 2; i++)
    program[i] = insn;
    program[i] = insn;
 
 
  insn.f1.offset = METAOP_DONE;
  insn.f1.offset = METAOP_DONE;
  insn.f1.s1 = 0;
  insn.f1.s1 = 0;
  program[2] = insn;
  program[2] = insn;
 
 
  env.pc = program;
  env.pc = program;
  env.program = program;
  env.program = program;
 
 
  res = simulator_kernel (2 + 1, &env);
  res = simulator_kernel (2 + 1, &env);
 
 
  if (res != 88)
  if (res != 88)
    abort ();
    abort ();
  exit (0);
  exit (0);
}
}
#else
#else
main(){ exit (0); }
main(){ exit (0); }
#endif
#endif
 
 

powered by: WebSVN 2.1.0

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