1  #ifndef INCLUDED_ARGS_H
       2  #define INCLUDED_ARGS_H
       3  
       4  /* This defines the calling sequences for integers and floats.  */
       5  #define I0 eax
       6  #define I1 edx
       7  #define I2 ecx
       8  
       9  typedef unsigned int size_t;
      10  
      11  extern void (*callthis)(void);
      12  extern unsigned long eax,ebx,ecx,edx,esi,edi,esp,ebp;
      13  extern unsigned long sret_eax;
      14  extern volatile unsigned long volatile_var;
      15  extern void snapshot (void);
      16  extern void snapshot_ret (void);
      17  extern void *iamcu_memset (void *, int, size_t);
      18  #define WRAP_CALL(N) \
      19    (callthis = (void (*)()) (N), (typeof (&N)) snapshot)
      20  #define WRAP_RET(N) \
      21    (callthis = (void (*)()) (N), (typeof (&N)) snapshot_ret)
      22  
      23  /* Clear all scratch integer registers.  */
      24  #define clear_int_hardware_registers \
      25    asm __volatile__ ("xor %%eax, %%eax\n\t" \
      26  		    "xor %%edx, %%edx\n\t" \
      27  		    "xor %%ecx, %%ecx\n\t" \
      28  		    ::: "eax", "edx", "ecx");
      29  
      30  /* Clear all scratch integer registers, excluding the one used to return
      31     aggregate.  */
      32  #define clear_non_sret_int_hardware_registers \
      33    asm __volatile__ ("xor %%edx, %%edx\n\t" \
      34  		    "xor %%ecx, %%ecx\n\t" \
      35  		    ::: "edx", "ecx");
      36  
      37  /* This is the list of registers available for passing arguments. Not all of
      38     these are used or even really available.  */
      39  struct IntegerRegisters
      40  {
      41    unsigned long eax, ebx, ecx, edx, esi, edi;
      42  };
      43  
      44  /* Implemented in scalarargs.c  */
      45  extern struct IntegerRegisters iregs, iregbits;
      46  extern unsigned int num_iregs;
      47  
      48  #define check_int_arguments do { \
      49    assert (num_iregs <= 0 || (iregs.I0 & iregbits.I0) == (I0 & iregbits.I0)); \
      50    assert (num_iregs <= 1 || (iregs.I1 & iregbits.I1) == (I1 & iregbits.I1)); \
      51    assert (num_iregs <= 2 || (iregs.I2 & iregbits.I2) == (I2 & iregbits.I2)); \
      52    } while (0)
      53  
      54  #define check_char_arguments check_int_arguments
      55  #define check_short_arguments check_int_arguments
      56  #define check_long_arguments check_int_arguments
      57  #define check_float_arguments check_int_arguments
      58  #define check_double_arguments check_int_arguments
      59  #define check_ldouble_arguments check_int_arguments
      60  
      61  /* Clear register struct.  */
      62  #define clear_struct_registers \
      63    eax = edx = ecx = 0; \
      64    iamcu_memset (&iregs, 0, sizeof iregs);
      65  
      66  /* Clear both hardware and register structs for integers.  */
      67  #define clear_int_registers \
      68    clear_struct_registers \
      69    clear_int_hardware_registers
      70  
      71  /* Clear both hardware and register structs for integers, excluding the
      72     one used to return aggregate.  */
      73  #define clear_non_sret_int_registers \
      74    clear_struct_registers \
      75    clear_non_sret_int_hardware_registers
      76  
      77  #endif /* INCLUDED_ARGS_H  */