Commit 5495cc55 by Richard Henderson Committed by Richard Henderson

osf.h (TARGET_HAS_XFLOATING_LIBS): Define.

        * alpha/osf.h (TARGET_HAS_XFLOATING_LIBS): Define.
        * alpha/osf5.h: New file.
        * configure.in (alpha-*-osf5): Add it to tm_file.

        * emit-rtl.c (operand_subword): Support TFmode on a 64-bit target.

        * alpha-protos.h (alpha_emit_xfloating_arith): Declare.
        (alpha_emit_xfloating_cvt, function_arg): Declare.
        * alpha.c (alpha_emit_conditional_branch): Call
        alpha_emit_xfloating_compare for TFmode compares.
        (alpha_lookup_xfloating_lib_func): New.
        (alpha_compute_xfloating_mode_arg): New.
        (alpha_emit_xfloating_libcall): New.
        (alpha_emit_xfloating_arith): New.
        (alpha_emit_xfloating_compare): New.
        (alpha_emit_xfloating_cvt): New.
        (print_operand): Add default abort case.
        (function_arg): Mind FUNCTION_ARG_PASS_BY_REFERENCE.
        * alpha.h (TARGET_HAS_XFLOATING_LIBS): New.
        (BIGGEST_ALIGNMENT): Increase to 128 bits.
        (RETURN_IN_MEMORY): True for TF/TCmode.
        (ALPHA_ARG_SIZE): TF/TCmode is passed indirect.
        (FUNCTION_ARG): Move to function_arg.
        (FUNCTION_ARG_PASS_BY_REFERENCE): New.
        (ASM_OUTPUT_LONG_DOUBLE): New.
        (ASM_OUTPUT_DOUBLE): Always output bits.
        * alpha.md (addtf3, divtf3, multf3, subtf3, cmptf): New.
        (fix_trunctfdi2, floatditf2, floatunsditf2): New.
        (extenddftf2, trunctfdf2): New.

From-SVN: r31579
parent ac490444
2000-01-23 Richard Henderson <rth@cygnus.com>
* alpha/osf.h (TARGET_HAS_XFLOATING_LIBS): Define.
* alpha/osf5.h: New file.
* configure.in (alpha-*-osf5): Add it to tm_file.
* emit-rtl.c (operand_subword): Support TFmode on a 64-bit target.
* alpha-protos.h (alpha_emit_xfloating_arith): Declare.
(alpha_emit_xfloating_cvt, function_arg): Declare.
* alpha.c (alpha_emit_conditional_branch): Call
alpha_emit_xfloating_compare for TFmode compares.
(alpha_lookup_xfloating_lib_func): New.
(alpha_compute_xfloating_mode_arg): New.
(alpha_emit_xfloating_libcall): New.
(alpha_emit_xfloating_arith): New.
(alpha_emit_xfloating_compare): New.
(alpha_emit_xfloating_cvt): New.
(print_operand): Add default abort case.
(function_arg): Mind FUNCTION_ARG_PASS_BY_REFERENCE.
* alpha.h (TARGET_HAS_XFLOATING_LIBS): New.
(BIGGEST_ALIGNMENT): Increase to 128 bits.
(RETURN_IN_MEMORY): True for TF/TCmode.
(ALPHA_ARG_SIZE): TF/TCmode is passed indirect.
(FUNCTION_ARG): Move to function_arg.
(FUNCTION_ARG_PASS_BY_REFERENCE): New.
(ASM_OUTPUT_LONG_DOUBLE): New.
(ASM_OUTPUT_DOUBLE): Always output bits.
* alpha.md (addtf3, divtf3, multf3, subtf3, cmptf): New.
(fix_trunctfdi2, floatditf2, floatunsditf2): New.
(extenddftf2, trunctfdf2): New.
2000-01-23 Alexandre Oliva <oliva@lsd.ic.unicamp.br> 2000-01-23 Alexandre Oliva <oliva@lsd.ic.unicamp.br>
* config/sparc/sol2-sld-64.h (TRANSFER_FROM_TRAMPOLINE): Moved... * config/sparc/sol2-sld-64.h (TRANSFER_FROM_TRAMPOLINE): Moved...
......
...@@ -80,6 +80,8 @@ extern rtx alpha_emit_set_long_const PARAMS ((rtx, HOST_WIDE_INT, ...@@ -80,6 +80,8 @@ extern rtx alpha_emit_set_long_const PARAMS ((rtx, HOST_WIDE_INT,
HOST_WIDE_INT)); HOST_WIDE_INT));
extern rtx alpha_emit_conditional_branch PARAMS ((enum rtx_code)); extern rtx alpha_emit_conditional_branch PARAMS ((enum rtx_code));
extern rtx alpha_emit_conditional_move PARAMS ((rtx, enum machine_mode)); extern rtx alpha_emit_conditional_move PARAMS ((rtx, enum machine_mode));
extern void alpha_emit_xfloating_arith PARAMS ((enum rtx_code, rtx[]));
extern void alpha_emit_xfloating_cvt PARAMS ((enum rtx_code, rtx[]));
extern void alpha_expand_unaligned_load PARAMS ((rtx, rtx, HOST_WIDE_INT, extern void alpha_expand_unaligned_load PARAMS ((rtx, rtx, HOST_WIDE_INT,
HOST_WIDE_INT, int)); HOST_WIDE_INT, int));
extern void alpha_expand_unaligned_store PARAMS ((rtx, rtx, HOST_WIDE_INT, extern void alpha_expand_unaligned_store PARAMS ((rtx, rtx, HOST_WIDE_INT,
...@@ -114,6 +116,8 @@ extern tree alpha_build_va_list PARAMS ((void)); ...@@ -114,6 +116,8 @@ extern tree alpha_build_va_list PARAMS ((void));
#ifdef RTX_CODE #ifdef RTX_CODE
extern void alpha_va_start PARAMS ((int, tree, rtx)); extern void alpha_va_start PARAMS ((int, tree, rtx));
extern rtx alpha_va_arg PARAMS ((tree, tree)); extern rtx alpha_va_arg PARAMS ((tree, tree));
extern rtx function_arg PARAMS ((CUMULATIVE_ARGS, enum machine_mode,
tree, int));
#endif #endif
extern int vms_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree)); extern int vms_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree));
extern void alpha_start_function PARAMS ((FILE *, const char *, tree)); extern void alpha_start_function PARAMS ((FILE *, const char *, tree));
......
...@@ -181,6 +181,9 @@ extern enum alpha_fp_trap_mode alpha_fptm; ...@@ -181,6 +181,9 @@ extern enum alpha_fp_trap_mode alpha_fptm;
#ifndef TARGET_CAN_FAULT_IN_PROLOGUE #ifndef TARGET_CAN_FAULT_IN_PROLOGUE
#define TARGET_CAN_FAULT_IN_PROLOGUE 0 #define TARGET_CAN_FAULT_IN_PROLOGUE 0
#endif #endif
#ifndef TARGET_HAS_XFLOATING_LIBS
#define TARGET_HAS_XFLOATING_LIBS 0
#endif
/* Macro to define tables used to set the flags. /* Macro to define tables used to set the flags.
This is a list in braces of pairs in braces, This is a list in braces of pairs in braces,
...@@ -511,7 +514,7 @@ extern const char *alpha_mlat_string; /* For -mmemory-latency= */ ...@@ -511,7 +514,7 @@ extern const char *alpha_mlat_string; /* For -mmemory-latency= */
(optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0) (optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0)
/* No data type wants to be aligned rounder than this. */ /* No data type wants to be aligned rounder than this. */
#define BIGGEST_ALIGNMENT 64 #define BIGGEST_ALIGNMENT 128
/* For atomic access to objects, must have at least 32-bit alignment /* For atomic access to objects, must have at least 32-bit alignment
unless the machine has byte operations. */ unless the machine has byte operations. */
...@@ -1013,6 +1016,8 @@ extern int alpha_memory_latency; ...@@ -1013,6 +1016,8 @@ extern int alpha_memory_latency;
#define RETURN_IN_MEMORY(TYPE) \ #define RETURN_IN_MEMORY(TYPE) \
(TYPE_MODE (TYPE) == BLKmode \ (TYPE_MODE (TYPE) == BLKmode \
|| TYPE_MODE (TYPE) == TFmode \
|| TYPE_MODE (TYPE) == TCmode \
|| (TREE_CODE (TYPE) == INTEGER_TYPE && TYPE_PRECISION (TYPE) > 64)) || (TREE_CODE (TYPE) == INTEGER_TYPE && TYPE_PRECISION (TYPE) > 64))
/* 1 if N is a possible register number for a function value /* 1 if N is a possible register number for a function value
...@@ -1049,9 +1054,9 @@ extern int alpha_memory_latency; ...@@ -1049,9 +1054,9 @@ extern int alpha_memory_latency;
for the Alpha. */ for the Alpha. */
#define ALPHA_ARG_SIZE(MODE, TYPE, NAMED) \ #define ALPHA_ARG_SIZE(MODE, TYPE, NAMED) \
((MODE) != BLKmode \ ((MODE) == TFmode || (MODE) == TCmode ? 1 \
? (GET_MODE_SIZE (MODE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD \ : (((MODE) == BLKmode ? int_size_in_bytes (TYPE) : GET_MODE_SIZE (MODE)) \
: (int_size_in_bytes (TYPE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
/* Update the data in CUM to advance over an argument /* Update the data in CUM to advance over an argument
of mode MODE and data type TYPE. of mode MODE and data type TYPE.
...@@ -1080,14 +1085,16 @@ extern int alpha_memory_latency; ...@@ -1080,14 +1085,16 @@ extern int alpha_memory_latency;
and the rest are pushed. */ and the rest are pushed. */
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
((CUM) < 6 && ! MUST_PASS_IN_STACK (MODE, TYPE) \ function_arg((CUM), (MODE), (TYPE), (NAMED))
? gen_rtx_REG ((MODE), \
(CUM) + 16 \ /* A C expression that indicates when an argument must be passed by
+ ((TARGET_FPREGS \ reference. If nonzero for an argument, a copy of that argument is
&& (GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \ made in memory and a pointer to the argument is passed instead of
|| GET_MODE_CLASS (MODE) == MODE_FLOAT)) \ the argument itself. The pointer is passed in whatever way is
* 32)) \ appropriate for passing a pointer to that type. */
: 0)
#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
((MODE) == TFmode || (MODE) == TCmode)
/* Specify the padding direction of arguments. /* Specify the padding direction of arguments.
...@@ -1132,7 +1139,6 @@ extern int alpha_memory_latency; ...@@ -1132,7 +1139,6 @@ extern int alpha_memory_latency;
class, but it isn't worth doing anything more efficient in this rare class, but it isn't worth doing anything more efficient in this rare
case. */ case. */
#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \ #define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
{ if ((CUM) < 6) \ { if ((CUM) < 6) \
{ \ { \
...@@ -2015,26 +2021,27 @@ literal_section () \ ...@@ -2015,26 +2021,27 @@ literal_section () \
#define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) \ #define CHECK_FLOAT_VALUE(MODE, D, OVERFLOW) \
((OVERFLOW) = check_float_value (MODE, &D, OVERFLOW)) ((OVERFLOW) = check_float_value (MODE, &D, OVERFLOW))
/* This is how to output an assembler line defining a `long double'
constant. */
#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
do { \
long t[4]; \
REAL_VALUE_TO_TARGET_LONG_DOUBLE ((VALUE), t); \
fprintf (FILE, "\t.quad 0x%lx%08lx,0x%lx%08lx\n", \
t[1] & 0xffffffff, t[0] & 0xffffffff, \
t[3] & 0xffffffff, t[2] & 0xffffffff); \
} while (0)
/* This is how to output an assembler line defining a `double' constant. */ /* This is how to output an assembler line defining a `double' constant. */
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
{ \ do { \
if (REAL_VALUE_ISINF (VALUE) \ long t[2]; \
|| REAL_VALUE_ISNAN (VALUE) \ REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \
|| REAL_VALUE_MINUS_ZERO (VALUE)) \ fprintf (FILE, "\t.quad 0x%lx%08lx\n", \
{ \ t[1] & 0xffffffff, t[0] & 0xffffffff); \
long t[2]; \ } while (0)
REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \
fprintf (FILE, "\t.quad 0x%lx%08lx\n", \
t[1] & 0xffffffff, t[0] & 0xffffffff); \
} \
else \
{ \
char str[30]; \
REAL_VALUE_TO_DECIMAL (VALUE, "%.20e", str); \
fprintf (FILE, "\t.%c_floating %s\n", (TARGET_FLOAT_VAX)?'g':'t', str); \
} \
}
/* This is how to output an assembler line defining a `float' constant. */ /* This is how to output an assembler line defining a `float' constant. */
...@@ -2043,7 +2050,7 @@ literal_section () \ ...@@ -2043,7 +2050,7 @@ literal_section () \
long t; \ long t; \
REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \ REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \
fprintf (FILE, "\t.long 0x%lx\n", t & 0xffffffff); \ fprintf (FILE, "\t.long 0x%lx\n", t & 0xffffffff); \
} while (0) } while (0)
/* This is how to output an assembler line defining an `int' constant. */ /* This is how to output an assembler line defining an `int' constant. */
......
...@@ -1842,6 +1842,13 @@ ...@@ -1842,6 +1842,13 @@
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "addtf3"
[(use (match_operand 0 "register_operand" ""))
(use (match_operand 1 "general_operand" ""))
(use (match_operand 2 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_arith (PLUS, operands); DONE;")
;; Define conversion operators between DFmode and SImode, using the cvtql ;; Define conversion operators between DFmode and SImode, using the cvtql
;; instruction. To allow combine et al to do useful things, we keep the ;; instruction. To allow combine et al to do useful things, we keep the
;; operation as a unit until after reload, at which point we split the ;; operation as a unit until after reload, at which point we split the
...@@ -1981,6 +1988,12 @@ ...@@ -1981,6 +1988,12 @@
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "fix_trunctfdi2"
[(use (match_operand:DI 0 "register_operand" ""))
(use (match_operand:TF 1 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_cvt (FIX, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))] (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
...@@ -2013,6 +2026,18 @@ ...@@ -2013,6 +2026,18 @@
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "floatditf2"
[(use (match_operand:TF 0 "register_operand" ""))
(use (match_operand:DI 1 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_cvt (FLOAT, operands); DONE;")
(define_expand "floatunsditf2"
[(use (match_operand:TF 0 "register_operand" ""))
(use (match_operand:DI 1 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_cvt (UNSIGNED_FLOAT, operands); DONE;")
(define_expand "extendsfdf2" (define_expand "extendsfdf2"
[(use (match_operand:DF 0 "register_operand" "")) [(use (match_operand:DF 0 "register_operand" ""))
(use (match_operand:SF 1 "nonimmediate_operand" ""))] (use (match_operand:SF 1 "nonimmediate_operand" ""))]
...@@ -2047,6 +2072,12 @@ ...@@ -2047,6 +2072,12 @@
[(set_attr "type" "fcpys,fld,fst") [(set_attr "type" "fcpys,fld,fst")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "extenddftf2"
[(use (match_operand:TF 0 "register_operand" ""))
(use (match_operand:DF 1 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_cvt (FLOAT_EXTEND, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(float_truncate:SF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))] (float_truncate:SF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))]
...@@ -2063,6 +2094,12 @@ ...@@ -2063,6 +2094,12 @@
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "trunctfdf2"
[(use (match_operand:DF 0 "register_operand" ""))
(use (match_operand:TF 1 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_cvt (FLOAT_TRUNCATE, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(div:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG") (div:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")
...@@ -2129,6 +2166,13 @@ ...@@ -2129,6 +2166,13 @@
[(set_attr "type" "fdiv") [(set_attr "type" "fdiv")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "divtf3"
[(use (match_operand 0 "register_operand" ""))
(use (match_operand 1 "general_operand" ""))
(use (match_operand 2 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_arith (DIV, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(mult:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG") (mult:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG")
...@@ -2186,6 +2230,13 @@ ...@@ -2186,6 +2230,13 @@
[(set_attr "type" "fmul") [(set_attr "type" "fmul")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "multf3"
[(use (match_operand 0 "register_operand" ""))
(use (match_operand 1 "general_operand" ""))
(use (match_operand 2 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_arith (MULT, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(minus:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG") (minus:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")
...@@ -2253,6 +2304,13 @@ ...@@ -2253,6 +2304,13 @@
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
(set_attr "trap" "yes")]) (set_attr "trap" "yes")])
(define_expand "subtf3"
[(use (match_operand 0 "register_operand" ""))
(use (match_operand 1 "general_operand" ""))
(use (match_operand 2 "general_operand" ""))]
"TARGET_HAS_XFLOATING_LIBS"
"alpha_emit_xfloating_arith (MINUS, operands); DONE;")
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(sqrt:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))] (sqrt:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))]
...@@ -2964,6 +3022,18 @@ ...@@ -2964,6 +3022,18 @@
DONE; DONE;
}") }")
(define_expand "cmptf"
[(set (cc0) (compare (match_operand:TF 0 "general_operand" "")
(match_operand:TF 1 "general_operand" "")))]
"TARGET_HAS_XFLOATING_LIBS"
"
{
alpha_compare.op0 = operands[0];
alpha_compare.op1 = operands[1];
alpha_compare.fp_p = 1;
DONE;
}")
(define_expand "cmpdi" (define_expand "cmpdi"
[(set (cc0) (compare (match_operand:DI 0 "reg_or_0_operand" "") [(set (cc0) (compare (match_operand:DI 0 "reg_or_0_operand" "")
(match_operand:DI 1 "reg_or_8bit_operand" "")))] (match_operand:DI 1 "reg_or_8bit_operand" "")))]
......
...@@ -24,6 +24,11 @@ Boston, MA 02111-1307, USA. */ ...@@ -24,6 +24,11 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_AS_CAN_SUBTRACT_LABELS #undef TARGET_AS_CAN_SUBTRACT_LABELS
#define TARGET_AS_CAN_SUBTRACT_LABELS 1 #define TARGET_AS_CAN_SUBTRACT_LABELS 1
/* The GEM libraries for X_float are present, though not used by C. */
#undef TARGET_HAS_XFLOATING_LIBS
#define TARGET_HAS_XFLOATING_LIBS 1
/* Names to predefine in the preprocessor for this target machine. */ /* Names to predefine in the preprocessor for this target machine. */
#define CPP_PREDEFINES "\ #define CPP_PREDEFINES "\
......
/* Definitions of target machine for GNU compiler, for DEC Alpha on Tru64 5.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#undef LONG_DOUBLE_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE 128
...@@ -3434,7 +3434,7 @@ for machine in $build $host $target; do ...@@ -3434,7 +3434,7 @@ for machine in $build $host $target; do
install_headers_dir=install-headers-cpio install_headers_dir=install-headers-cpio
;; ;;
*-*-osf5*) *-*-osf5*)
tm_file="${tm_file} alpha/osf.h" tm_file="${tm_file} alpha/osf.h alpha/osf5.h"
;; ;;
esac esac
case $machine in case $machine in
......
...@@ -689,7 +689,7 @@ changequote([,])dnl ...@@ -689,7 +689,7 @@ changequote([,])dnl
install_headers_dir=install-headers-cpio install_headers_dir=install-headers-cpio
;; ;;
*-*-osf5*) *-*-osf5*)
tm_file="${tm_file} alpha/osf.h" tm_file="${tm_file} alpha/osf.h alpha/osf5.h"
;; ;;
esac esac
case $machine in case $machine in
......
...@@ -1218,9 +1218,9 @@ operand_subword (op, i, validate_address, mode) ...@@ -1218,9 +1218,9 @@ operand_subword (op, i, validate_address, mode)
are defined as returning one or two 32 bit values, respectively, are defined as returning one or two 32 bit values, respectively,
and not values of BITS_PER_WORD bits. */ and not values of BITS_PER_WORD bits. */
#ifdef REAL_ARITHMETIC #ifdef REAL_ARITHMETIC
/* The output is some bits, the width of the target machine's word. /* The output is some bits, the width of the target machine's word.
A wider-word host can surely hold them in a CONST_INT. A narrower-word A wider-word host can surely hold them in a CONST_INT. A narrower-word
host can't. */ host can't. */
if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
&& GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
&& GET_MODE_BITSIZE (mode) == 64 && GET_MODE_BITSIZE (mode) == 64
...@@ -1271,22 +1271,31 @@ operand_subword (op, i, validate_address, mode) ...@@ -1271,22 +1271,31 @@ operand_subword (op, i, validate_address, mode)
&& GET_MODE_CLASS (mode) == MODE_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
&& GET_MODE_BITSIZE (mode) > 64 && GET_MODE_BITSIZE (mode) > 64
&& GET_CODE (op) == CONST_DOUBLE) && GET_CODE (op) == CONST_DOUBLE)
{ {
long k[4]; long k[4];
REAL_VALUE_TYPE rv; REAL_VALUE_TYPE rv;
REAL_VALUE_FROM_CONST_DOUBLE (rv, op); REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k); REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
if (BITS_PER_WORD == 32) if (BITS_PER_WORD == 32)
{ {
val = k[i]; val = k[i];
val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
return GEN_INT (val); return GEN_INT (val);
} }
else #if HOST_BITS_PER_WIDE_INT >= 64
abort (); else if (BITS_PER_WORD >= 64 && i <= 1)
} {
val = k[i*2 + ! WORDS_BIG_ENDIAN];
val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
val |= (HOST_WIDE_INT) k[i*2 + WORDS_BIG_ENDIAN] & 0xffffffff;
return GEN_INT (val);
}
#endif
else
abort ();
}
#else /* no REAL_ARITHMETIC */ #else /* no REAL_ARITHMETIC */
if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT if (((HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT
&& HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) && HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment