diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e06eeeb35e..9e3e0845c1b 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 70adbf86cb4..c1d89111825 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 c83a4dbf683..baf96534802 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