diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2000-04-16 17:52:30 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-04-16 17:52:30 -0700 |
commit | e13f6154aff4ee020e9e14b12d6a11b5e7353746 (patch) | |
tree | d3181b3fc2c2a72427c62c0cf2e6c8052d12b23f /gcc | |
parent | 954869eb3bd32ca1230512deab5a76c826324b73 (diff) | |
download | gcc-e13f6154aff4ee020e9e14b12d6a11b5e7353746.zip gcc-e13f6154aff4ee020e9e14b12d6a11b5e7353746.tar.gz gcc-e13f6154aff4ee020e9e14b12d6a11b5e7353746.tar.bz2 |
i370.c (mvs_add_label): Change spacing for coding conventions.
* i370.c (mvs_add_label): Change spacing for coding conventions.
* i370.h (ASM_OUTPUT_CASE_LABEL): Change to the data CSECT for the
outputing case vectors.
(ASM_OUTPUT_CASE_END): New, put assembler back into code CSECT.
(ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Remove page check,
since vector in in the data CSECT.
(ASM_OUTPUT_REG_POP, ASM_OUTPUT_REG_PUSH): Restore to correct operation. * i370.md (Many patterns): Put the length in the XL directives.
(movdi): Put back STM and MVC in definition.
(floatsidf2): Correct TARGET_ELF_ABI pattern and add back the LE370
pattern using the TCA.
* oe.h (CPP_SPEC): Added to allow trigraphs.
* xm-oe.h (HOST_BITS_PER_LONGLONG): Change to 32. IBM's compiler does
not support the "long long" type.
From-SVN: r33191
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i370/i370.c | 2 | ||||
-rw-r--r-- | gcc/config/i370/i370.h | 26 | ||||
-rw-r--r-- | gcc/config/i370/i370.md | 63 | ||||
-rw-r--r-- | gcc/config/i370/oe.h | 4 | ||||
-rw-r--r-- | gcc/config/i370/xm-oe.h | 2 |
5 files changed, 49 insertions, 48 deletions
diff --git a/gcc/config/i370/i370.c b/gcc/config/i370/i370.c index 1e07775..8d00f73 100644 --- a/gcc/config/i370/i370.c +++ b/gcc/config/i370/i370.c @@ -645,7 +645,7 @@ mvs_add_label (id) fwd_distance = lp->label_last_ref - lp->label_addr; - if (mvs_page_code + 2*fwd_distance + mvs_page_lit < 4060) return; + if (mvs_page_code + 2 * fwd_distance + mvs_page_lit < 4060) return; mvs_need_base_reload ++; } diff --git a/gcc/config/i370/i370.h b/gcc/config/i370/i370.h index 08ac644..88f5dd1 100644 --- a/gcc/config/i370/i370.h +++ b/gcc/config/i370/i370.h @@ -1160,23 +1160,29 @@ enum reg_class fprintf (FILE, "%s%d\tEQU\t*\n", PREFIX, NUM); \ } -/* Generate case label. */ -/* hack alert -- I don't get it ... what if its a really big case label? - * wouldn't we have to say label_emitted also ?? */ +/* Generate case label. For HLASM we can change to the data CSECT + and put the vectors out of the code body. The assembler just + concatenates CSECTs with the same name. */ #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \ - fprintf (FILE, "%s%d\tEQU\t*\n", PREFIX, NUM) + fprintf (FILE, "\tDS\t0F\n"); \ + fprintf (FILE,"\tCSECT\n"); \ + fprintf (FILE, "%s%d\tEQU\t*\n", PREFIX, NUM) + +/* Put the CSECT back to the code body */ + +#define ASM_OUTPUT_CASE_END(FILE, NUM, TABLE) \ + assemble_name (FILE, mvs_function_name); \ + fputs ("\tCSECT\n", FILE); /* This is how to output an element of a case-vector that is absolute. */ #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ - mvs_check_page (FILE, 4, 0); \ fprintf (FILE, "\tDC\tA(L%d)\n", VALUE) /* This is how to output an element of a case-vector that is relative. */ #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ - mvs_check_page (FILE, 4, 0); \ fprintf (FILE, "\tDC\tA(L%d-L%d)\n", VALUE, REL) /* This is how to output an insn to push a register on the stack. @@ -1188,7 +1194,7 @@ enum reg_class #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \ mvs_check_page (FILE, 8, 4); \ - fprintf (FILE, "\tSXXX\t13,=F'4'\n\tST\t%s,%d(13)\n", \ + fprintf (FILE, "\tS\t13,=F'4'\n\tST\t%s,%d(13)\n", \ reg_names[REGNO], STACK_POINTER_OFFSET) /* This is how to output an insn to pop a register from the stack. @@ -1196,13 +1202,9 @@ enum reg_class #define ASM_OUTPUT_REG_POP(FILE, REGNO) \ mvs_check_page (FILE, 8, 0); \ - fprintf (FILE, "\tL\t%s,%d(13)\n\tLAXXX\t13,4(13)\n", \ + fprintf (FILE, "\tL\t%s,%d(13)\n\tLA\t13,4(13)\n", \ reg_names[REGNO], STACK_POINTER_OFFSET) -/* TBD: hack alert XXX these two float point macros print horribly - incorrect things when run in cross-compiler mode. Thats's because - in cross-compiler mode, the VALUE is not really a double. See below, - in the ELF section, for the correct implementation. */ /* This is how to output an assembler line defining a `double' constant. */ #define ASM_OUTPUT_DOUBLE(FILE, VALUE) \ fprintf (FILE, "\tDC\tD'%.18G'\n", (VALUE)) diff --git a/gcc/config/i370/i370.md b/gcc/config/i370/i370.md index c3a3a98..9708195 100644 --- a/gcc/config/i370/i370.md +++ b/gcc/config/i370/i370.md @@ -170,7 +170,7 @@ { /* an unsigned compare to zero is always zero/not-zero... */ mvs_check_page (0, 4, 4); - return \"N %0,=X'000000FF'\"; + return \"N %0,=XL4'000000FF'\"; } mvs_check_page (0, 4, 0); return \"CLI %0,0\"; @@ -189,7 +189,7 @@ { /* an unsigned compare to zero is always zero/not-zero... */ mvs_check_page (0, 4, 4); - return \"N %0,=X'000000FF'\"; + return \"N %0,=XL4'000000FF'\"; } mvs_check_page (0, 8, 0); return \"SLL %0,24\;SRA %0,24\"; @@ -348,7 +348,7 @@ if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 1); - return \"CLM %0,1,=X'%X1'\"; + return \"CLM %0,1,=XL1'%X1'\"; } mvs_check_page (0, 4, 0); return \"CLM %0,1,%1\"; @@ -359,7 +359,7 @@ if (REG_P (operands[1])) { mvs_check_page (0, 4, 1); - return \"CLM %1,1,=X'%X0'\"; + return \"CLM %1,1,=XL1'%X0'\"; } mvs_check_page (0, 4, 0); return \"CLI %1,%B0\"; @@ -394,7 +394,7 @@ if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 1); - return \"CLM %0,1,=X'%X1'\"; + return \"CLM %0,1,=XL1'%X1'\"; } if (!(REG_P (operands[1]))) { @@ -648,9 +648,7 @@ check_label_emit (); else if (REG_P (operands[1])) { mvs_check_page (0, 4, 0); - /* can't use stm otherwise stm r6,r7,0(r10,r13) can happen */ return \"STM %1,%N1,%0\"; - /* return \"ST %1,%0\;ST %N1,4+%0\"; */ } mvs_check_page (0, 6, 0); return \"MVC %O0(8,%R0),%W1\"; @@ -706,17 +704,8 @@ check_label_emit (); mvs_check_page (0, 4, 0); return \"STD %1,%0\"; } - else if (REG_P (operands[1])) - { - /* hack alert -- for some reason, %N0 doesn't work - * when the mem ref is e.g. 168(r13,r1) ... - * add 4 and pray for the best .. */ - mvs_check_page (0, 8, 0); - return \"ST %1,%0\;ST %N1,4+%N0\"; - } - /* this is almost certainly not what is desired, let it break ... */ - mvs_check_page (0, 8, 0); - return \"xxxST %1,%0\;ST %N1,%N0\"; + mvs_check_page (0, 4, 0); + return \"STM %1,%N1,%0\"; }" [(set_attr "length" "8")] ) @@ -740,16 +729,15 @@ check_label_emit (); if (REG_P (operands[0])) { mvs_check_page (0, 8, 0); - return \"L %0,%1\;L %N0,4+%N1\"; + return \"LM %0,%N0,%1\"; } else if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); - return \"ST %1,%0\;ST %N1,4+%N0\"; + return \"STM %1,%N1,%0\"; } mvs_check_page (0, 6, 0); - /* should never get here ... */ - return \"xxxxxxMVC %O0(8,%R0),%W1\"; + return \"MVC %O0(8,%R0),%1\"; }" [(set_attr "length" "8")] ) @@ -1200,7 +1188,7 @@ check_label_emit (); return \"STM %1,%N1,%0\"; } mvs_check_page (0, 6, 0); - return \"MVC %O0(8,%R0),%W1\"; + return \"MVC %O0(8,%R0),%1\"; }" [(set_attr "length" "12")] ) @@ -1715,7 +1703,7 @@ check_label_emit (); /* AND only sets zero/not-zero bits not the arithmetic bits ... */ CC_STATUS_INIT; mvs_check_page (0, 4, 4); - return \"N %1,=X'0000FFFF'\"; + return \"N %1,=XL4'0000FFFF'\"; }" [(set_attr "length" "4")] ) @@ -1736,7 +1724,7 @@ check_label_emit (); /* AND only sets zero/not-zero bits not the arithmetic bits ... */ CC_STATUS_INIT; mvs_check_page (0, 4, 4); - return \"N %0,=X'000000FF'\"; + return \"N %0,=XL4'000000FF'\"; } if (GET_CODE (operands[1]) == CONST_INT) { @@ -1766,7 +1754,7 @@ check_label_emit (); /* AND only sets zero/not-zero bits not the arithmetic bits ... */ CC_STATUS_INIT; mvs_check_page (0, 4, 4); - return \"N %0,=X'000000FF'\"; + return \"N %0,=XL4'000000FF'\"; } if (GET_CODE (operands[1]) == CONST_INT) { @@ -1830,6 +1818,8 @@ check_label_emit (); ; ; floatsidf2 instruction pattern(s). ; +; LE/370 mode uses the float field of the TCA. +; (define_insn "floatsidf2" [(set (match_operand:DF 0 "general_operand" "=f") @@ -1839,10 +1829,15 @@ check_label_emit (); { check_label_emit (); CC_STATUS_INIT; +#ifdef TARGET_ELF_ABI + mvs_check_page (0, 22, 12); + return \"MVC 140(4,13),=XL4'4E000000'\;ST %1,144(,13)\;XI 144(13),128\;LD %0,140(,13)\;SD %0,=XL8'4E00000080000000'\"; +#else mvs_check_page (0, 16, 8); - return \"ST %1,144(,13)\;XI 144(13),128\;LD %0,140(,13)\;SD %0,=XL8'4E00000080000000'\"; + return \"ST %1,508(,12)\;XI 508(12),128\;LD %0,504(,12)\;SD %0,=XL8'4E00000080000000'\"; +#endif }" - [(set_attr "length" "16")] + [(set_attr "length" "22")] ) ; @@ -2419,7 +2414,7 @@ check_label_emit (); /* XXX trouble. Below we generate some rtx's that model what * is really supposed to happen with multiply on the 370/390 - * hardware, and that is all well & god. However, during optimization + * hardware, and that is all well & good. However, during optimization * it can happen that the two operands are exchanged (after all, * multiplication is commutitive), in which case the doubleword * ends up in memory and everything is hosed. The gen_reg_rtx @@ -3579,7 +3574,7 @@ check_label_emit (); return \"X %0,=F'-1'\"; } mvs_check_page (0, 6, 4); - return \"XC %O0(2,%R0),=X'FFFF'\"; + return \"XC %O0(2,%R0),=XL4'FFFF'\"; }" [(set_attr "length" "6")] ) @@ -3867,10 +3862,10 @@ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 8, 4); - return \"N %0,=X'0000FFFF'\;SRL %0,0(%2)\"; + return \"N %0,=XL4'0000FFFF'\;SRL %0,0(%2)\"; } mvs_check_page (0, 8, 4); - return \"N %0,=X'0000FFFF'\;SRL %0,%c2\"; + return \"N %0,=XL4'0000FFFF'\;SRL %0,%c2\"; }" [(set_attr "length" "8")] ) @@ -3890,8 +3885,8 @@ check_label_emit (); CC_STATUS_INIT; /* AND sets the CC but not how we want it */ mvs_check_page (0, 8, 4); if (REG_P (operands[2])) - return \"N %0,=X'000000FF'\;SRL %0,0(%2)\"; - return \"N %0,=X'000000FF'\;SRL %0,%c2\"; + return \"N %0,=XL4'000000FF'\;SRL %0,0(%2)\"; + return \"N %0,=XL4'000000FF'\;SRL %0,%c2\"; }" [(set_attr "length" "8")] ) diff --git a/gcc/config/i370/oe.h b/gcc/config/i370/oe.h index 6290052..634252e 100644 --- a/gcc/config/i370/oe.h +++ b/gcc/config/i370/oe.h @@ -29,6 +29,10 @@ Boston, MA 02111-1307, USA. */ #define TARGET_EBCDIC 1 #define TARGET_HLASM 1 +/* Options for the preprocessor for this target machine. */ + +#define CPP_SPEC "-trigraphs" + /* Options for this target machine. */ #define LIB_SPEC "" diff --git a/gcc/config/i370/xm-oe.h b/gcc/config/i370/xm-oe.h index 370ec09..a930a2b 100644 --- a/gcc/config/i370/xm-oe.h +++ b/gcc/config/i370/xm-oe.h @@ -34,7 +34,7 @@ Boston, MA 02111-1307, USA. */ #define HOST_BITS_PER_SHORT 16 #define HOST_BITS_PER_INT 32 #define HOST_BITS_PER_LONG 32 -#define HOST_BITS_PER_LONGLONG 64 +#define HOST_BITS_PER_LONGLONG 32 #define HOST_FLOAT_FORMAT IBM_FLOAT_FORMAT #define HOST_EBCDIC 1 |