From b188f760cee19e9542e5f553fbf7c20a0c6159ac Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Mon, 25 Feb 2002 02:30:33 +0000 Subject: rs6000.md ("get_vrsave_internal"): New. 2002-02-25 Aldy Hernandez * config/rs6000/rs6000.md ("get_vrsave_internal"): New. ("*set_vrsave_internal"): use mfspr for Darwin. * config/rs6000/rs6000.c (rs6000_emit_prologue): Call gen_get_vrsave_internal. From-SVN: r50015 --- gcc/ChangeLog | 8 ++++++++ gcc/config/rs6000/rs6000.c | 5 ++++- gcc/config/rs6000/rs6000.md | 21 ++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e06eee..9e3e084 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-02-25 Aldy Hernandez + + * config/rs6000/rs6000.md ("get_vrsave_internal"): New. + ("*set_vrsave_internal"): use mfspr for Darwin. + + * config/rs6000/rs6000.c (rs6000_emit_prologue): Call + gen_get_vrsave_internal. + Sun Feb 24 16:38:56 2002 Richard Kenner * optabs.c (widen_operand): Properly handle CONST_INT for NO_EXTEND. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 70adbf8..c1d8911 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -8739,7 +8739,10 @@ rs6000_emit_prologue () /* Get VRSAVE onto a GPR. */ reg = gen_rtx_REG (SImode, 12); vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO); - emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave)); + if (TARGET_MACHO) + emit_insn (gen_get_vrsave_internal (reg)); + else + emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave)); /* Save VRSAVE. */ offset = info->vrsave_save_offset + sp_offset; diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index c83a4db..baf9653 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -14008,13 +14008,32 @@ [(set_attr "type" "altivec") (set_attr "length" "*,*,*,16,16,16")]) +(define_insn "get_vrsave_internal" + [(set (match_operand:SI 0 "register_operand" "=r") + (unspec:SI [(reg:SI 109)] 214))] + "TARGET_ALTIVEC" + "* +{ + if (TARGET_MACHO) + return \"mtspr 256,%0\"; + else + return \"mtvrsave %0\"; +}" + [(set_attr "type" "altivec")]) + (define_insn "*set_vrsave_internal" [(match_parallel 0 "vrsave_operation" [(set (reg:SI 109) (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "r") (reg:SI 109)] 30))])] "TARGET_ALTIVEC" - "mtvrsave %1" + "* +{ + if (TARGET_MACHO) + return \"mfspr %1,256\"; + else + return \"mtvrsave %1\"; +}" [(set_attr "type" "altivec")]) ;; Vector clears -- cgit v1.1