summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/iamcu/args.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.target/i386/iamcu/args.h')
-rw-r--r--gcc/testsuite/gcc.target/i386/iamcu/args.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/i386/iamcu/args.h b/gcc/testsuite/gcc.target/i386/iamcu/args.h
new file mode 100644
index 00000000000..f8abde40155
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/iamcu/args.h
@@ -0,0 +1,77 @@
+#ifndef INCLUDED_ARGS_H
+#define INCLUDED_ARGS_H
+
+/* This defines the calling sequences for integers and floats. */
+#define I0 eax
+#define I1 edx
+#define I2 ecx
+
+typedef unsigned int size_t;
+
+extern void (*callthis)(void);
+extern unsigned long eax,ebx,ecx,edx,esi,edi,esp,ebp;
+extern unsigned long sret_eax;
+extern volatile unsigned long volatile_var;
+extern void snapshot (void);
+extern void snapshot_ret (void);
+extern void *iamcu_memset (void *, int, size_t);
+#define WRAP_CALL(N) \
+ (callthis = (void (*)()) (N), (typeof (&N)) snapshot)
+#define WRAP_RET(N) \
+ (callthis = (void (*)()) (N), (typeof (&N)) snapshot_ret)
+
+/* Clear all scratch integer registers. */
+#define clear_int_hardware_registers \
+ asm __volatile__ ("xor %%eax, %%eax\n\t" \
+ "xor %%edx, %%edx\n\t" \
+ "xor %%ecx, %%ecx\n\t" \
+ ::: "eax", "edx", "ecx");
+
+/* Clear all scratch integer registers, excluding the one used to return
+ aggregate. */
+#define clear_non_sret_int_hardware_registers \
+ asm __volatile__ ("xor %%edx, %%ebx\n\t" \
+ "xor %%ecx, %%ecx\n\t" \
+ ::: "edx", "ecx");
+
+/* This is the list of registers available for passing arguments. Not all of
+ these are used or even really available. */
+struct IntegerRegisters
+{
+ unsigned long eax, ebx, ecx, edx, esi, edi;
+};
+
+/* Implemented in scalarargs.c */
+extern struct IntegerRegisters iregs, iregbits;
+extern unsigned int num_iregs;
+
+#define check_int_arguments do { \
+ assert (num_iregs <= 0 || (iregs.I0 & iregbits.I0) == (I0 & iregbits.I0)); \
+ assert (num_iregs <= 1 || (iregs.I1 & iregbits.I1) == (I1 & iregbits.I1)); \
+ assert (num_iregs <= 2 || (iregs.I2 & iregbits.I2) == (I2 & iregbits.I2)); \
+ } while (0)
+
+#define check_char_arguments check_int_arguments
+#define check_short_arguments check_int_arguments
+#define check_long_arguments check_int_arguments
+#define check_float_arguments check_int_arguments
+#define check_double_arguments check_int_arguments
+#define check_ldouble_arguments check_int_arguments
+
+/* Clear register struct. */
+#define clear_struct_registers \
+ eax = edx = ecx = 0; \
+ iamcu_memset (&iregs, 0, sizeof iregs);
+
+/* Clear both hardware and register structs for integers. */
+#define clear_int_registers \
+ clear_struct_registers \
+ clear_int_hardware_registers
+
+/* Clear both hardware and register structs for integers, excluding the
+ one used to return aggregate. */
+#define clear_non_sret_int_registers \
+ clear_struct_registers \
+ clear_non_sret_int_hardware_registers
+
+#endif /* INCLUDED_ARGS_H */