--- gcc/config/hp320.h 2018/04/24 17:54:04 1.1.1.2 +++ gcc/config/hp320.h 2018/04/24 18:04:24 1.1.1.4 @@ -32,6 +32,17 @@ the Free Software Foundation, 675 Mass A #define SGS_CMP_ORDER /* Takes cmp operands in reverse order */ #define HPUX_ASM +#if !defined (CROSS_COMPILE) && !defined (NO_BUGS) +/* The assembler on HP 9k3xx machines running HPUX 8.0 doesn't translate + floating point constants behind some operands. The workaround is to + use hex constants. Reported by Thomas Nau (nau@medizin.uni-ulm.de). */ +#define AS_BUG_FLOATING_CONSTANT +/* The assembler on HP 9k3xx machines running HPUX 8.0 doesn't accept + labels followed by a text, data, or other section directive. Reported + by Thomas Nau (nau@medizin.uni-ulm.de). */ +#define AS_BUG_TRAILING_LABEL +#endif + /* gcc.c should find libgcc.a itself rather than expecting linker to. */ #define LINK_LIBGCC_SPECIAL /* The arguments of -L must be a separate argv element. */ @@ -164,8 +175,8 @@ the Free Software Foundation, 675 Mass A #undef PRINT_OPERAND #undef PRINT_OPERAND_ADDRESS #undef FUNCTION_PROFILER -#undef ASM_GLOBALIZE_LABEL #undef ASM_OUTPUT_INTERNAL_LABEL +#undef GLOBAL_ASM_OP #define TARGET_VERSION fprintf (stderr, " (68k, SGS/hpux syntax)"); @@ -288,11 +299,20 @@ the Free Software Foundation, 675 Mass A #define ASM_APP_OFF "" +#ifdef AS_BUG_TRAILING_LABEL +#define TEXT_SECTION_ASM_OP "\tlalign\t1\ntext" +#define DATA_SECTION_ASM_OP "\tlalign\t1\ndata" +#else #define TEXT_SECTION_ASM_OP "text" - #define DATA_SECTION_ASM_OP "data" +#endif #define ASCII_DATA_ASM_OP "byte" + +/* This is the command to make the user-level label named NAME + defined for reference from other files. */ + +#define GLOBAL_ASM_OP "global" /* This says how to output an assembler line to define a global common symbol. */ @@ -318,12 +338,6 @@ the Free Software Foundation, 675 Mass A ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \ sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO))) -/* This is how to output a command to make the user-level label named NAME - defined for reference from other files. */ - -#define ASM_GLOBALIZE_LABEL(FILE,NAME) \ - do { fputs ("\tglobal ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0) - #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ do{ if (PREFIX[0] == 'L' && PREFIX[1] == 'I') \ fprintf(FILE, "\tset %s%d,.+2\n", PREFIX, NUM); \ @@ -337,6 +351,24 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #define ASM_OUTPUT_FLOAT(FILE, VALUE) \ fprintf (FILE, "\tfloat 0f%.9g\n", (VALUE)) +#ifdef AS_BUG_FLOATING_CONSTANT +#undef ASM_OUTPUT_DOUBLE_OPERAND +#define ASM_OUTPUT_DOUBLE_OPERAND(FILE, VALUE) \ + do { \ + union { double d; int i[2]; } dummy_u; \ + dummy_u.d = (VALUE); \ + asm_fprintf (FILE, "%I0x%x%08x", dummy_u.i[0], dummy_u.i[1]); \ + } while (0) + +#undef ASM_OUTPUT_FLOAT_OPERAND +#define ASM_OUTPUT_FLOAT_OPERAND(FILE, VALUE) \ + do { \ + union { float f; int i; } dummy_u; \ + dummy_u.f = (VALUE); \ + asm_fprintf (FILE, "%I0x%08x", dummy_u.i); \ + } while (0) +#endif /* AS_BUG_FLOATING_CONSTANT */ + /* This is how to output an assembler line defining an `int' constant. */ #define ASM_OUTPUT_INT(FILE,VALUE) \ @@ -379,6 +411,17 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME) #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO) +#ifdef AS_BUG_FLOATING_CONSTANT +#define PRINT_OPERAND_FLOAT(FILE,CODE,FLOAT,INT) \ + fprintf (FILE, "&0x%x", (INT)) +#else +#define PRINT_OPERAND_FLOAT(FILE,CODE,FLOAT,INT) \ + if (CODE == 'f') \ + fprintf (FILE, "&0f%.9g", (FLOAT)); \ + else \ + fprintf (FILE, "&0x%x", (INT)) +#endif /* AS_BUG_FLOATING_CONSTANT */ + #define PRINT_OPERAND(FILE, X, CODE) \ { if (CODE == '.') fprintf (FILE, "."); \ else if (CODE == '#') fprintf (FILE, "&"); \ @@ -397,10 +440,7 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = union { float f; int i; } u1; \ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ u1.f = u.d; \ - if (CODE == 'f') \ - fprintf (FILE, "&0f%.9g", u1.f); \ - else \ - fprintf (FILE, "&0x%x", u1.i); } \ + PRINT_OPERAND_FLOAT (FILE,CODE, u1.f, u1.i); } \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \ { union { double d; int i[2]; } u; \ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ @@ -612,7 +652,12 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #else /* not HPUX_ASM */ #undef FUNCTION_PROFILER -#define FUNCTION_PROFILER(FILE, LABELNO) \ - fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABELNO)); + +/* HP-UX needs the call to mcount before the link instruction. + Copy the return address onto the stack before the call to fake it out. */ +#define FUNCTION_PROFILER(FILE, LABEL_NO) \ + fprintf (FILE, "\tmovel a6@(4),sp@-\n" \ + "\tmovl #LP%d,a0\n\tjsr mcount\n" \ + "\taddqw #4,sp\n", (LABEL_NO)); #endif /* not HPUX_ASM */