modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/compile/20071114-1.c (about)

     1  /* PR tree-optimization/34046 */
     2  /* Origin: dcb <dcb314@hotmail.com> */
     3  
     4  typedef unsigned char bool8;
     5  typedef unsigned char uint8_t;
     6  typedef unsigned short int uint16_t;
     7  typedef unsigned int uint32_t;
     8  typedef uint8_t uint8;
     9  typedef uint16_t uint16;
    10  typedef uint32_t uint32;
    11  
    12  struct SIAPU
    13  {
    14      uint8 *PC;
    15      uint8 *RAM;
    16      uint8 Bit;
    17      uint32 Address;
    18      uint8 *WaitAddress1;
    19      uint8 *WaitAddress2;
    20      uint8 _Carry;
    21  };
    22  
    23  struct SAPU
    24  {
    25      bool8 ShowROM;
    26      uint8 OutPorts [4];
    27      uint8 ExtraRAM [64];
    28      uint16 TimerTarget [3];
    29  };
    30  
    31  struct SAPU APU;
    32  struct SIAPU IAPU;
    33  
    34  void S9xSetAPUControl (uint8 byte);
    35  void S9xSetAPUDSP (uint8 byte);
    36  uint8 S9xGetAPUDSP ();
    37  
    38  uint8 S9xAPUGetByte (uint32 Address)
    39  {
    40    Address &= 0xffff;
    41  
    42    if (Address <= 0xff && Address >= 0xf0)
    43      {
    44        if (Address >= 0xf4 && Address <= 0xf7)
    45  	{
    46  	  IAPU.WaitAddress2 = IAPU.WaitAddress1;
    47  	  IAPU.WaitAddress1 = IAPU.PC;
    48  	  return (IAPU.RAM [Address]);
    49  	}
    50        else if (Address == 0xf3)
    51  	return (S9xGetAPUDSP ());
    52  
    53        if (Address >= 0xfd)
    54  	{
    55  	  IAPU.WaitAddress2 = IAPU.WaitAddress1;
    56  	  IAPU.WaitAddress1 = IAPU.PC;
    57  	  uint8 t = IAPU.RAM [Address];
    58  	  IAPU.RAM [Address] = 0;
    59  	  return (t);
    60  	}
    61  
    62        return (IAPU.RAM [Address]);
    63      }
    64   else
    65     return (IAPU.RAM [Address]);
    66  }
    67  
    68  void S9xAPUSetByte (uint8 byte, uint32 Address)
    69  {
    70    Address &= 0xffff;
    71  
    72    if (Address <= 0xff && Address >= 0xf0)
    73      {
    74        if (Address == 0xf3)
    75  	S9xSetAPUDSP (byte);
    76        else if (Address >= 0xf4 && Address <= 0xf7)
    77  	APU.OutPorts [Address - 0xf4] = byte;
    78        else if (Address == 0xf1)
    79  	S9xSetAPUControl (byte);
    80        else if (Address < 0xfd)
    81  	{
    82  	  IAPU.RAM [Address] = byte;
    83  	  if (Address >= 0xfa)
    84  	    {
    85  	      if (byte == 0)
    86  		APU.TimerTarget [Address - 0xfa] = 0x100;
    87  	      else
    88  		APU.TimerTarget [Address - 0xfa] = byte;
    89  	    }
    90  	}
    91      }
    92    else
    93      {
    94        if (Address < 0xffc0)
    95  	IAPU.RAM [Address] = byte;
    96        else
    97  	{
    98  	  APU.ExtraRAM [Address - 0xffc0] = byte;
    99  	  if (!APU.ShowROM)
   100  	    IAPU.RAM [Address] = byte;
   101  	}
   102      }
   103  }
   104  
   105  void ApuCA ()
   106  {
   107    IAPU.Address = *(uint16 *) (IAPU.PC + 1);
   108    IAPU.Bit = (uint8)(IAPU.Address >> 13);
   109    if ((IAPU._Carry))
   110      S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) | (1 << IAPU.Bit), IAPU.Address);
   111    else
   112      S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) & ~(1 << IAPU.Bit), IAPU.Address);
   113  }