diff options
Diffstat (limited to 'gcc/config/spu/spu.c')
-rw-r--r-- | gcc/config/spu/spu.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 230f4c0..1021a91 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -352,6 +352,8 @@ spu_override_options (void) else error ("Unknown architecture '%s'", &spu_tune_string[0]); } + + REAL_MODE_FORMAT (SFmode) = &spu_single_format; } /* Handle an attribute requiring a FUNCTION_DECL; arguments as in @@ -1519,10 +1521,18 @@ spu_split_immediate (rtx * ops) { unsigned char arrhi[16]; unsigned char arrlo[16]; - rtx to, hi, lo; + rtx to, temp, hi, lo; int i; + enum machine_mode imode = mode; + /* We need to do reals as ints because the constant used in the + IOR might not be a legitimate real constant. */ + imode = int_mode_for_mode (mode); constant_to_array (mode, ops[1], arrhi); - to = !can_create_pseudo_p () ? ops[0] : gen_reg_rtx (mode); + if (imode != mode) + to = simplify_gen_subreg (imode, ops[0], mode, 0); + else + to = ops[0]; + temp = !can_create_pseudo_p () ? to : gen_reg_rtx (imode); for (i = 0; i < 16; i += 4) { arrlo[i + 2] = arrhi[i + 2]; @@ -1530,11 +1540,11 @@ spu_split_immediate (rtx * ops) arrlo[i + 0] = arrlo[i + 1] = 0; arrhi[i + 2] = arrhi[i + 3] = 0; } - hi = array_to_constant (mode, arrhi); - lo = array_to_constant (mode, arrlo); - emit_move_insn (to, hi); + hi = array_to_constant (imode, arrhi); + lo = array_to_constant (imode, arrlo); + emit_move_insn (temp, hi); emit_insn (gen_rtx_SET - (VOIDmode, ops[0], gen_rtx_IOR (mode, to, lo))); + (VOIDmode, to, gen_rtx_IOR (imode, temp, lo))); return 1; } case IC_FSMBI2: |