diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2002-02-25 02:30:33 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2002-02-25 02:30:33 +0000 |
commit | b188f760cee19e9542e5f553fbf7c20a0c6159ac (patch) | |
tree | f43efcd4bcf01294d12142299021e6c8661d401c | |
parent | 2e8f5b2dde5709cd3be658bd3e2c8acac9f03a61 (diff) | |
download | gcc-b188f760cee19e9542e5f553fbf7c20a0c6159ac.zip gcc-b188f760cee19e9542e5f553fbf7c20a0c6159ac.tar.gz gcc-b188f760cee19e9542e5f553fbf7c20a0c6159ac.tar.bz2 |
rs6000.md ("get_vrsave_internal"): New.
2002-02-25 Aldy Hernandez <aldyh@redhat.com>
* 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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 21 |
3 files changed, 32 insertions, 2 deletions
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 <aldyh@redhat.com> + + * 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 <kenner@vlsi1.ultra.nyu.edu> * 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 |