diff options
author | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-09 17:42:55 +0000 |
---|---|---|
committer | amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-09 17:42:55 +0000 |
commit | 59312820e49658a8bf1f74d96fc59c14f6a8c564 (patch) | |
tree | 1c4460163b21563fa573216bf31246f144d5c158 /gcc/config/sh/ushmedia.h | |
parent | 1ca361fdc5eab22baf4c5eda2686df93de41c5c0 (diff) | |
download | gcc-59312820e49658a8bf1f74d96fc59c14f6a8c564.tar.gz |
gcc:
2005-05-09 J"orn Rennecke <joern.rennecke@st.com>
* config/sh/sh.h (OVERRIDE_OPTIONS): Don't set flag_finite_math_only
if flag_signaling_nans is set.
For TARGET_SH2E, if flag_finite_math_only is not set, set IEEE_BIT.
* doc/invoke.texi (SH -mieee): Document relation to -ffinite-math-only.
2005-05-06 J"orn Rennecke <joern.rennecke@st.com>
Merge of sh-elf specific patches from sh-elf-4_1-branch:
2005-05-05 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.h (ASM_OUTPUT_REG_PUSH): Provide SHMEDIA version.
(ASM_OUTPUT_REG_POP): Likewise.
2005-05-05 J"orn Rennecke <joern.rennecke@st.com>
Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c (sh_builtin_saveregs): Use copy_to_mode_reg
and plus_constant.
2005-05-04 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c (sh_div_strategy): Initialize with
SH_DIV_STRATEGY_DEFAULT.
* config/sh/sh.c (SH_DIV_STR_FOR_SIZE): Define.
(SH_DIV_STRATEGY_DEFAULT): Likewise.
(OPTIMIZATION_OPTIONS): Set sh_div_str to SH_DIV_STR_FOR_SIZE
when optimized for size.
* config/sh/linux.h (SH_DIV_STRATEGY_DEFAULT): Redefine.
(SH_DIV_STR_FOR_SIZE): Likewise.
* config/sh/netbsd-elf.h (SH_DIV_STRATEGY_DEFAULT): Likewise.
(SH_DIV_STR_FOR_SIZE): Likewise.
2005-05-04 J"orn Rennecke <joern.rennecke@st.com>
* config/sh/sh-modes.def (PDImode): Add.
* config/sh/sh-protos.h (shmedia_prepare_call_address): Declare.
* config/sh/sh.c (print_operand): Handle IF_THEN_ELSE.
(target_reg_operand): Allow PDImode.
(sh_register_move_cost): If neither sh_gettrcost_str nor
TARGET_PT_FIXED is set, assume gettr costs 100.
(shmedia_prepare_call_address): New function.
(sh_gettrcost_str): Initialize to empty string.
(sh_divsi3_libfunc): New variable.
* config/sh/sh.h (PT_FIXED_BIT, TARGET_INVALID_SYMBOLS): Define.
(TARGET_SWITCH_SH5_32_ANY_EXTRA): Likewise.
(TARGET_SWITCH_SH5_MEDIA_ANY_EXTRA): Likewise.
(TARGET_SWITCHES): Use TARGET_SWITCH_SH5_32_ANY_EXTRA and
TARGET_SWITCH_SH5_MEDIA_ANY_EXTRA.
(TARGET_OPTIONS): Add -mdivsi3_libfunc.
(OVERRIDE_OPTIONS): Set sh_divsi3_libfunc if it hasn't been set
by the user.
Also set flag_no_function_cse for (TARGET_SHMEDIA && !TARGET_PT_FIXED).
(HARD_REGNO_MODE_OK): Allow TARGET_REGS in PDImode.
(CONSTRAINT_LEN): Remove debug version.
(SECONDARY_INOUT_RELOAD_CLASS:) Break out of
(SECONDARY_OUTPUT_RELOAD_CLASS). Use EXTRA_CONSTRAINT_Csy for check
if a target register needs a secondary reload through GENERAL_REGS.
(SECONDARY_INPUT_RELOAD_CLASS): Use SECONDARY_INOUT_RELOAD_CLASS.
(sh_divsi3_libfunc): Declare.
(FUNCTION_PROFILER): Provide SHMEDIA version.
* config/sh/predicates.md: New file.
* config/sh/sh.md (predicates.md): Include.
(divsi_inv_call_combine, divsi3): Use sh_divsi3_libfunc.
(reload_insi): Fix predicates and constraints.
(ptabs): New expander.
(*extendsipdi_media, *truncdipdi_media): New insns.
(call, call_value, sibcall): Use shmedia_prepare_call_address.
* doc/invoke.texi (-multcost, -mdiv): Document new SH options.
(-mdivsi3_libfunc, -madjust-unroll, -mindexed-addressing): Likewise.
(-mgettrcost, -mpt-fixed, -minvalid-symbols): Likewise.
2005-04-11 J"orn Rennecke <joern.rennecke@st.com>
* sh.c (print_operand): Remove sh_rep_vec extraction.
(sh_output_mi_thunk): Make i unsigned.
* sh.c (TARGET_ADJUST_UNROLL_MAX): Only redefine if already defined.
(sh_adjust_unroll_max): Only define if TARGET_ADJUST_UNROLL_MAX
is defined. Update label detection code and iteration lookup,
enable basic functionality, but without IV analysis.
2005-04-11 J"orn Rennecke <joern.rennecke@st.com>
* sh.h (OPTIMIZATION_OPTIONS): Don't make setting of
flag_branch_target_load_optimize dependent on TARGET_SHMEDIA.
Set flag_finite_math_only to 2.
If flag_finite_math_only set set to 2, set it to 1 iff
we use SH2E..SH4 arithmetic without full IEEE support.
2005-04-09 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/lib1funcs.asm (ic_invalidate): Fix typos.
* config/sh/t-linux (LIB1ASMFUNCS_CACHE): Add _ic_invalidate_array.
2005-04-06 J"orn Rennecke <joern.rennecke@st.com>
Merge of SuperH / STM SH specific patches, including fix for
PR target/20695:
* config.gcc (sh*-superh-elf, sh*elf (newlib)): Use newlib.h
when building with libgloss.
(sh*elf): Implement --without-fp option.
(sh64-superh-linux*): Don't multilib.
(sh*-*-linux): Use sh3 as basic multilib.
* config/sh/crt1.asm (SHmedia start): Add code to enable the MMU,
and to set up vbr. Enable FPU before calling set_fpscr.
Load atexit address just before use. Use __SH_FPU_ANY__.
(SH3*/SH4* start): Add code to set up vbr. Use __SH_FPU_ANY__.
Set DN bit in fpscr.
* config/sh/elf.h (SUBTARGET_ASM_ISA_SPEC): Merge into:
config/sh/sh.h (SH_ASM_SPEC, SUBTARGET_ASM_ISA_SPEC): Here.
* config/sh/lib1funcs.asm (HIDDEN_FUNC, HIDDEN_ALIAS): Define.
(FMOVD_WORKS): Don't define for __SH5__.
(ashiftrt_r4_0, ashiftrt_r4_1, ashiftrt_r4_2, ashiftrt_r4_3): Hide.
(ashiftrt_r4_4, ashiftrt_r4_5, ashiftrt_r4_6, ashiftrt_r4_7): Hide.
(ashiftrt_r4_8, ashiftrt_r4_9, ashiftrt_r4_10, ashiftrt_r4_11): Hide.
(ashiftrt_r4_12, ashiftrt_r4_13, ashiftrt_r4_14, ashiftrt_r4_15): Hide.
(ashiftrt_r4_16, ashiftrt_r4_17, ashiftrt_r4_18, ashiftrt_r4_19): Hide.
(ashiftrt_r4_20, ashiftrt_r4_21, ashiftrt_r4_22, ashiftrt_r4_23): Hide.
(ashiftrt_r4_24, ashiftrt_r4_25, ashiftrt_r4_26, ashiftrt_r4_27): Hide.
(ashiftrt_r4_28, ashiftrt_r4_29, ashiftrt_r4_30, ashiftrt_r4_31): Hide.
(ashiftrt_r4_32, ashrsi3, ashlsi3, lshrsi3, movmem, movstr): Hide.
(movstrSI64, movmemSI64, movstrSI60, movmemSI60): Hide.
(movstrSI56, movmemSI56, movstrSI52, movmemSI52): Hide.
(movstrSI48, movmemSI48, movstrSI44, movmemSI44): Hide.
(movstrSI40, movmemSI40, movstrSI36, movmemSI36): Hide.
(movstrSI32, movmemSI32, movstrSI28, movmemSI28): Hide.
(movstrSI24, movmemSI24, movstrSI20, movmemSI20): Hide.
(movstrSI16,movmemSI16, movstrSI12,movmemSI12): Hide.
(movstrSI8,movmemSI8, movstrSI4,movmemSI4): Hide.
(movmemSI0, movstrSI0): Remove.
(movmemSI4): Schedule last store into rts delay slot.
(movmem): Shorten code. Provide ENDFUNC.
(movmem_i4_even, movmem_i4_odd, movmemSI12_i4, mulsi3): Hide.
(mulsi3): Provide ENDFUNC.
(sdivsi3_i4, sdivsi3_i4, udivsi3_i4, udivsi3, set_fpscr): Hide.
(SH5 sdivsi3): Reimplement, using:
(div_table): New, linear approximation table lookup for division seed.
(sdivsi3_2): New SH5 entry point.
(divdi3): Use hidden alias for udivdi3.
(moddi3): Use hidden alias for umoddi3.
(init_trampoline): Hide. Provide exact ENDFUNC.
(ic_invalidate): Hide. Re-implement SH4 version, using
(ic_invalidate_array): New global.
(GCC_shcompact_return_trampoline, GCC_nested_trampoline): Hide.
(GCC_push_shmedia_regs_nofpu): Only provide for __SH4_NOFPU__.
(GCC_pop_shmedia_regs_nofpu): Likewise.
* config/sh/libgcc-excl.ver (__mulsi3): Add.
* config/sh/linux.h (TARGET_DEFAULT): Include TARGET_OPT_DEFAULT.
* config/sh/sh-protos.h (sh_function_kind): New enum.
(sh_gen_truncate, replace_n_hard_rtx): Declare.
(function_symbol): Update declaration.
(shmedia_cleanup_truncate, sh_contains_memref_p): Declare.
* sh.c (cfgloop.h): Include.
(TARGET_ADJUST_UNROLL_MAX): Redefine.
(print_operand): Add '>' and 'U' support. Handle TRUNCATE and
SIGN_EXTEND.
(function_sybol): Add arguments for target and kind of symbol.
If not an ordinary function symbol, make sure the string becomes
unique. For PIC, load appropriately depending on kind of symbol.
Changed all callers.
(prepare_move_operands): Dont copy R0 to a pseudo for SHmedia.
(multcosts): Check sh_multcost_str. If not set, return 2 for
SHMEDIA TARGET_SMALLCODE.
(sh_rtx_costs): Lower some costs when outer_code is SET. Add code
for CONST_VECTOR, MINUS and PARALLEL.
(gen_shifty_op): Don't emit nop.
(expand_ashiftrt): While expanding to rtl, do shift by 31 using a
register set to zero.
(gen_datalabel_ref): Make sure that the string is shared.
(MAX_POOL_SIZE): Define as 372.
(find_barrier): Remove spurious adjustment.
(sh_media_register_for_return): Return -1 for interrupt handlers.
(sh_pch_valid_p): Use a copy of TARGET_OPTIONS.
(general_movsrc_operand): Accept vector that match sh_rep_vec.
(general_movdst_operand): For SHmedia, recject paradoxical DImode
subregs before high_life / reload.
(arith_reg_operand): Allow no-op sign extensions.
(logical_reg_operand, fp_arith_reg_dest, xor_operand): New functions.
(cmp_operand, shift_operator, logical_operator): Likewise.
(minuend_operand, ua_address_operand, cache_address_operand): Likewise.
(ua_offset, shift_count_reg_operand, shift_count_operand): Likewise.
(sh_adjust_unroll_max, replace_n_hard_rtx, sh_gen_truncate): Likewise.
(shmedia_cleanup_truncate, sh_contains_memref_p_1): Likewise.
(sh_contains_memref_p): Likewise.
(shmedia_6bit_operand): Remove.
(arith_operand): Allow some TRUNCATEs.
(logical_operand): Disallow subregs <= SImode of >= DImode.
(greater_comparison_operator): Fix mode comparison.
(less_comparison_operator): Likewise.
(target_reg_operand, target_operand): Compare modes with Pmode.
(sh_adjust_cost): Consider the dependency between a target register
load and its use in a subsequent block.
Implement mac_media latency exception.
Before reload, anticipate floating point latencies to be at least four.
Give preference to the ptabs feeding a casesi_jump_media.
Handle UNSPEC in a CALL address.
(sh_optimize_target_register_callee_saved): Improve handling of
borderline cases.
(sh_function_ok_for_sibcall): Allow for non-pic, and also when we
will use the symbol with @GOTOFF addressing.
(SH_BLTIN_UDI): Remove.
(SH_BLTIN_LDUA_L64, SH_BLTIN_LDUA_Q64, SH_BLTIN_STUA_L64): New.
(SH_BLTIN_STUA_Q64): Likewise.
(signature_args, SH_BLTIN_NUM_SHARED_SIGNATURES): Update.
(SH_BLTIN_2, SH_BLTIN_SU, SH_BLTIN_3, SH_BLTIN_SUS): Renumber.
(SH_BLTIN_PSSV, SH_BLTIN_XXUU, SH_BLTIN_UUUU, SH_BLTIN_PV): Likewise.
(bdesc): Add entries for alloco, mac_media, sqrtdf2, sqrtsf2, fsrra_s,
{ld,st}{hi,lo}.[lq] and prefetch.
Change mextr entries to use SH_BLTIN_V8QI3.
(sh_media_init_builtins): Implement specific TARGET_SHMEDIA32 /
TARGET_SHMEDIA64 checks for pointer arguments.
(sh_expand_builtin): For pointer types, use ptr_mode / ptr_type_mode.
(sh_register_move_cost): Check sh_gettrcost_str.
(cmpsi_operand): T_REG is only allowed for TARGET_SH1.
(sh_output_mi_thunk): Make static. Check that needed registers are
actually available. Make sure that the sibcall won't go via the PLT.
(sh_multcost_str, sh_gettrcost_str, sh_div_str): New variables.
(cut2_workaround_str, sh_div_strategy, boardtype, osruntime): Likewise.
(arith_reg_dest): Allow paradoxical DImode subreg for ! TARGET_SHMEDIA.
* sh.h (TARGET_CPU_CPP_BUILTINS): Define __SH_FPU_ANY__ and
__SH_FPU_DOUBLE__.
(INDEXED_ADDRESS_BIT, ADJUST_UNROLL_BIT, TARGET_DIVIDE_INV): Define.
(TARGET_HARVARD): Also true for TARGET_SH5.
(TARGET_DIVIDE_FP, TARGET_DIVIDE_INV_FP, TARGET_DIVIDE_CALL2): Define.
(TARGET_DIVIDE_INV_MINLAT, TARGET_DIVIDE_INV20U): Define.
(TARGET_DIVIDE_INV20L, TARGET_DIVIDE_INV_CALL): Define.
(TARGET_DIVIDE_INV_CALL2, TARGET_ALLOW_INDEXED_ADDRESS): Define.
(TARGET_ADJUST_UNROLL, TARGET_OPT_DEFAULT, SUBTARGET_OPTIONS): Define.
(TARGET_SWITCHES): Removed excessive whitespace. Added options
indexed-addressing, no-indexed-addressing, adjust-unroll and
no-adjust-unroll.
(TARGET_DEFAULT): Add TARGET_OPT_DEFAULT.
(TARGET_OPTIONS): Define.
(EXTRA_SPECS): Add subtarget_asm_spec.
(SH_ASM_SPEC): Pass cut2-workaround option.
(SUBTARGET_ASM_ISA_SPEC): Enforce STRICT_NOFPU for SH4 --without-fp.
(LINK_EMUL_PREFIX): If target defaults to little endian, default to shl.
(OPTIMIZATION_OPTIONS): Set sh_div_str. If not using if not -mieee,
set flag_finite_math_only.
(sh_divide_strategy_e): New enum.
(sh_div_strategy): Declare.
(OVERRIDE_OPTIONS): Don't set FMOVD_BIT for TARGET_SHCOMPACT.
Clear flag_if_conversion2 for SHMEDIA.
Set sh_div_strategy.
Leave profile_flag and profile_arc_flag alone.
(LOOP_ALIGN): Replace TARGET_HARVARD test with TARGET_HARD_SH4 test.
(HARD_REGNO_MODE_OK): Allow TImode in aligned FP registers.
(MODES_TIEABLE_P): For TARGET_SHMEDIA, allow tying of integral modes
of the same size.
(CONST_OK_FOR_I): Fix detection of I06 constraint.
(PREFERRED_RELOAD_CLASS): Also choose GENERAL_REGS for
PIC_DIRECT_ADDR_P.
(SECONDARY_INPUT_RELOAD_CLASS): Fix parentheses. For TARGET_SHMEDIA,
check for inqhi_operand, LABEL_REF and PIC_DIRECT_ADDR_P.
(FUNCTION_VALUE, PROMOTE_MODE): Don't promote from SImode. For
TARGET_SHMEDIA32, promote to SImode.
(EXTRA_CONSTRAINT_C16): Allow SIGN_EXTEND to SImode.
(DATALABEL_REF_NO_CONST_P: Don't allow SYMBOL_REF.
(DATALABEL_REF_P): Don't define.
(NON_PIC_REFERENCE_P): Allow LABEL_REF and SYMBOL_REF directly inside
a CONST. Don't allow DATALABEL_REF_NO_CONST_P outside of a CONST.
Allow a LABEL_REF in a sum.
(BASE_REGISTER_RTX_P): Check TRULY_NOOP_TRUNCATION.
(INDEX_REGISTER_RTX_P): Likewise.
(GO_IF_LEGITIMATE_INDEX): Check if pased the address of an unaligned
load / store.
(ALLOW_INDEXED_ADDRESS): Define.
(GO_IF_LEGITIMATE_ADDRESS): Use it.
(TRULY_NOOP_TRUNCATION): Don't allow no-op truncation from 64 bit or
beyond to less than 64 bit.
(PRINT_OPERAND_PUNCT_VALID_P): Allow '>'.
(rtx_equal_function_value_matters): Don't declare.
(arith_reg_operand): Allow sign_extend.
(PREDICATE_CODES): Allow SIGN_EXTEND in arith_reg_operand. Add
any_arith_reg_dest, cache_address_operand, cmp_operand,
fp_arith_reg_dest, logical_operator, logical_reg_operand,
minuend_operand, shift_count_operand, shift_count_reg_operand,
shift_operator, ua_address_operand, ua_offset, unary_float_operator,
xor_operand. Don't allow PARALLEL in sh_1el_vec and sh_rep_vec
Remove shmedia_6bit_operand.
(SPECIAL_MODE_PREDICATES): Add any-arith_reg_dest, target_operand
and target_reg_operand.
(SIDI_OFF, SIMULTANEOUS_PREFETCHES, high_life_started): Define.
(sh_multcost_str, sh_gettrcost_str, sh_div_str): Declare.
(cut2_workaround_str): Declare.
(INDEX_REG_CLASS): Is NO_REGS if ALLOW_INDEXED_ADDRESS is zero.
(LEGITIMIZE_RELOAD_ADDRESS): Check ALLOW_INDEXED_ADDRESS.
Substitute INDEX_REG_CLASS with R0_REGS.
* sh.md (UNSPEC_DIV_INV_M0, UNSPEC_DIV_INV_M1): New constants.
(UNSPEC_DIV_INV_M2, UNSPEC_DIV_INV_M3, UNSPEC_DIV_INV20): Likewise.
(UNSPEC_ASHIFTRT, UNSPEC_THUNK): Likewise.
(Attribute "length"): jump_media has length 8 if
TARGET_SH5_CUT2_WORKAROUND is true.
("highpart"): New attribute.
(cmpsi): Allow TARGET_SHMEDIA.
(cmpeqsi_media, cmpgtsi_media, cmpgtusi_media): New patterns.
(cmpsieqsi_media, cmpsieqdi_media, cmpsigtsi_media): Likewise.
(cmpsigtdi_media, cmpsigtusi_media, cmpsigtudi_media): Likewise.
(*cmpne0si_media, *cmpne0sisi_media, movdicc_true+1): Likewise.
(movdicc_true+2, movsicc_false, movsicc_true): Likewise.
(movsicc_true+1, movsicc_true+2, movsicc_true+3): Likewise.
(*movsicc_umin, movsicc, movqicc, *adddisi3_media): Likewise.
(addsidi3_media, subdisi3_media, mov_neg_si_t): Likewise.
(*subsi3_media+1, *subsi3_media+2, divsi3_media_2): Likewise.
(divsi_inv_call, *divsi_inv_call_combine, divsi_inv_m0): Likewise.
(divsi_inv_m1, divsi_inv_m2, divsi_inv_m3, divsi_inv_m1_3): Likewise.
(divsi_inv20, divsi_inv_fp, *divsi_inv_fp_combine, muldi3): Likewise.
(*andsi3_media, andcsi3): Likewise.
(cmpeqdi_media): Use cmp_operand operand predicate.
(*adddi3_media, adddi3z_media): Use arith_reg_dest operand predicate.
(adddi3_compact, adddi3_compact+1, addc, addc1): Likewise.
(addsi3_media, *addsi3_compact, *subdi3_media): Likewise.
(subdi3_compact, subdi3_compact+1, subc, subc1): Likewise.
(*subsi3_internal, *subsi3_media, udivsi3_sh2a, divsi3_sh2a): Likewise.
(mul_r, mulsidi3_media, mulsidi3_compact): Likewise.
(mulsidi3_compact+1, umulsidi3_media, umulsidi3_compact): Likewise.
(umulsidi3_compact+1, *andsi3_compact, anddi3, andcdi3): Likewise.
(*subsi3_media): Make define_insn_and_split. Use minuend_operand
operand predicate.
(subsi3): Don't force operand 1 into a register if it is a SUBREG.
(udivsi3_i1_media, udivsi3): Use Pmode for function/target address.
(divsi3_i1_media, beq_media, *beq_media_i, bne_media): Likewise.
(bgt_media, bge_media, bgtu_media, bgeu_media, *bgt_media_i): Likewise.
(*blt_media_i, bunordered, jump_media, jump, call_media): Likewise.
(call_value_media, call, call_value, sibcall_media, sibcall): Likewise.
(indirect_jump, casesi_jump_media, GOTaddr2picreg, *ptb): Likewise.
(symGOT_load, casesi, casesi_shift_media, casesi_load_media): Likewise.
(return_media_i, return_media): Likewise.
(udivsi3_i1_media): Enable also for ! TARGET_DIVIDE_FP.
(divsi3_i1_media): Likewise. Don't clobber R2 / R3 / TR1 / TR2.
(divsi3): Add support for division by multiplying with inverse.
(andsi3): Use logical_reg_operand predicate. Add SHmedia support.
(iorsi3): Rename to:
(*iorsi3_compact).
(xorsi3): Rename to:
(*xorsi3_compact).
(iorsi3, *iorsi3_media, *logical_sidi3, xorsi3): New patterns.
(*logical_sidisi3, *logical_sidi3_2, rotrdi3_mextr+1): Likewise.
(ashrsi2_31+2, *ashlsi_c_void, *ashldisi3_media): Likewise.
(*lshrdisi3_media, *ashrdisi3_media, ashrdisi3_media_high): Likewise.
(ashrdisi3_media_opaque, one_cmpldi2+1, cneg, movsi_const): Likewise.
(movsi_const_16bit, *movdi_media_I16, *shori_media_si): Likewise.
(*beq_media_i32, *bgt_media_i32, *blt_media_i32): Likewise.
(bunordered+1, sibcalli_thunk, ptrel_si, cmpsieqsf_media): Likewise.
(cmpsieqdf_media, addv2hi3, ashlv2si3+1, subv2hi3, ldhi_l): Likewise.
(ldhi_q, *ldhi_q_comb0, *ldhi_q_comb1, ldlo_l, ldlo_q): Likewise.
(*ldlo_q_comb0, *ldlo_q_comb1, sthi_l, sthi_q): Likewise.
(*sthi_q_comb0, *sthi_q_comb1, stlo_l, stlo_q): Likewise.
(*stlo_q_comb0, *stlo_q_comb1, ldhi_l64, ldhi_q64, ldlo_l64): Likewise.
(ldlo_q64, sthi_l64, sthi_q64, stlo_l64, stlo_q64, alloco_i): Likewise.
(alloca_i+1): Likewise.
(prefetch_media): Inhibit generator function generation.
(prefetch_i4): Likewise. Also enable for TARGET_SHCOMPACT.
(*iorsi3_compact, iordi3): Use arith_reg_dest operand predicate.
(*xorsi3_compact, xordi3, xordi3+1, rotlsi3_1, rotlsi3_31): Likewise.
(rotlsi3_16, rotlsi3, *rotlhi3_8, ashlsi3_sh2a, ashlsi3_std): Likewise.
(ashlhi3_k, ashlsi3_n, ashlsi3_n+1, ashlsi3_media): Likewise.
(*ashlhi3_n, ashlhi3+1, ashrsi3_sh2a, ashrsi3_k, ashrsi2_16): Likewise.
(ashrsi2_16+1, ashrsi2_31, ashrsi2_31+1, ashlsi_c): Likewise.
(ashrsi3_d, ashrsi3_media, lshrsi3_sh2a, lshrsi3_d): Likewise.
(lshrsi3_m, lshrsi3_k, lshrsi3_n, lshrsi3_n, lshrsi3_media): Likewise.
(lshrsi3, ashldi3_k, ashldi3_mediai, lshrdi3_k): Likewise.
(ashrdi3_k, xtrct_left, xtrct_right, negc, *negdi_media): Likewise.
(negsi2, one_cmplsi2, one_cmpldi2, zero_extendsidi2): Likewise.
(*zero_extendhisi2_compact, *zero_extendqisi2_compact): Likewise.
(zero_extendqihi2, extendhisi2, *extendhisi2_compact): Likewise.
(extendqisi2, *extendqisi2_compact, extendqihi2): Likewise.
(movsi_const_16bit+1, *movdi_media_I16+1): Likewise.
(movdf_media_nofpu+1, movsf_media_nofpu+1, dect, movt, seq): Likewise.
(movnegt+1, divsf3_i): Likewise.
(xordi3): Use xor_operand operand predicate.
(ashlsi3_media): Use shift_count_operand operand predicate.
(ashrsi3_media, lshrsi3_media, ashldi3_media, lshrdi3_media): Likewise.
(ashrdi3_media): Likewise.
(ashrsi2_31+1): Use mov_neg_si_t.
(lshrdi3_media, ashrdi3_media): Use ext_dest_operand predicate.
Make sure that either the destination is not a subreg, or that the
shift generates a sufficient number of sign bit copies.
(*loaddi_trunc): Use any_register_operand predicate.
(ic_invalidate_line_sh4a): Likewise.
(*zero_extendhisi2_media+1): Use simplify_gen_subreg.
(*extendhisi2_media+1i, *extendqisi2_media+1): Likewise.
(extendsidi2): Add fmov.sl alternative.
(load_ra): Add mode for operand 1.
(*movsi_media): Discourage the use of floating point registers.
Allow TRUNCATE.
(*movsi_media_nofpu): Ignore target register alternative for register
preferencing. Allow TRUNCATE.
(movsi_const_16bit+1): Use gen_movsi_const, and add an REG_EQUAL note.
(*movqi_media): Use extend_reg_or_0_operand predicate.
(*movdi_media): Ignore target register alternative for register
preferencing. Discourage the use of floating point registers.
(*movdi_media_nofpu): Ignore target register alternative for register
preferencing.
(movdi_const_16bit+1): If the source is subregged from SImode,
sign-extend highpart. Use ext_dest_operand predicate.
(movdi_const_16bit+2, shori_media): Use ext_dest_operand predicate.
(reload_outdf+7, reload_outdf+8): Check ALLOW_INDEXED_ADDRESS.
(stuff_delay_slot): Add modes for operands 0 and 1.
(*beq_media_i, *bgt_media_i): Add '>' to output templates.
(*blt_media_i, jump_media): Likewise.
(beq, bne): Pass through SImode inputs, and I06 constants.
(bgt, blt, ble, bge, bgtu): Pass through SImode inputs, the constant 0.
(bltu, bgeu, bleu): Likewise.
(GOTaddr2picreg): Don't call gen_datalabel_ref.
(ptrel): Rename to:
(ptrel_di).
(tls_global_dynamic, tls_local_dynamic): Add mode for call.
(seq): Properly support input modes other than DImode.
(slt, sle, sgt, sge,sne): Properly support SImode.
(addsf3_i, negdf2_i, sqrtdf2_i, absdf2_i): Use fp_arith_reg_operand.
(mac_media) Enable generator function generation.
(fix_truncsfdi2): Use fp_arith_reg_dest operand predicate.
(fix_truncdfdi2): Likewise.
(movv8qi_i+3): Enable for CONST0_RTX too.
(movv2hi_i): Use add.l, not addz.l.
(ashlv2si3, ashlv4hi3, lshrv2si3): Use shift_count_reg_operand.
(lshrv4hi3): Likewise.
(ussubv8qi3): Allow zero for operand 1.
(prefetch): Allow any mode for operand 0. Enable for SHCOMPACT.
Use force_reg.
* config/sh/shmedia.md: (shmedia): Remove automaton declaration.
(sh5inst_pipe, sh5fpu_pipe): New automatons.
(sh5issue): Use sh5inst_pipe.
(sh5fds): Use sh5fpu_pipe.
(shmedia_fdiv, shmedia_dfdiv): Also use sh5issue.
* config/sh/sshmedia.h (sh_media_GETCON, sh_media_PUTCON): Declare
with always_inline Attribute.
* t-sh64 (LIB1ASMFUNCS): Add _div_table.
* config/sh/ushmedia.h (sh_media_MABS_L): Use builtin function.
(sh_media_MABS_W, sh_media_MADD_L, sh_media_MADD_W): Likewise.
(sh_media_MADDS_L, sh_media_MADDS_UB, sh_media_MADDS_W): Likewise.
(sh_media_MCMPEQ_B, sh_media_MCMPEQ_L, sh_media_MCMPEQ_W): Likewise.
(sh_media_MCMPGT_UB, sh_media_MCMPGT_L, sh_media_MCMPGT_W): Likewise.
(sh_media_MCMV, sh_media_MCNVS_LW, sh_media_MCNVS_WB): Likewise.
(sh_media_MCNVS_WUB, sh_media_MEXTR1, sh_media_MEXTR2): Likewise.
(sh_media_MEXTR3, sh_media_MEXTR4, sh_media_MEXTR5): Likewise.
(sh_media_MEXTR6, sh_media_MEXTR7, sh_media_MMACFX_WL): Likewise.
(sh_media_MMACNFX_WL, sh_media_MMUL_L, sh_media_MMUL_W): Likewise.
(sh_media_MMULFX_L, sh_media_MMULFX_W, sh_media_MMULFXRP_W): Likewise.
(sh_media_MMULHI_WL, sh_media_MMULLO_WL): Likewise.
(sh_media_MMULSUM_WQ, sh_media_MPERM_W, sh_media_MSAD_UBQ): Likewise.
(sh_media_MSHALDS_L, sh_media_MSHALDS_W, sh_media_MSHARD_L): Likewise.
(sh_media_MSHARD_W, sh_media_MSHARDS_Q, sh_media_MSHFHI_B): Likewise.
(sh_media_MSHFHI_L, sh_media_MSHFHI_W, sh_media_MSHFLO_B): Likewise.
(sh_media_MSHFLO_L, sh_media_MSHFLO_W, sh_media_MSHLLD_L): Likewise.
(sh_media_MSHLLD_W, sh_media_MSHLRD_L, sh_media_MSHLRD_W): Likewise.
(sh_media_MSUB_L, sh_media_MSUB_W, sh_media_MSUBS_L): Likewise.
(sh_media_MSUBS_UB, sh_media_MSUBS_W, sh_media_FABS_D): Likewise.
(sh_media_FABS_S, sh_media_FCMPUN_D, sh_media_FCMPUN_S): Likewise.
(sh_media_FIPR_S, sh_media_FMAC_S, sh_media_FSQRT_D): Likewise.
(sh_media_FSQRT_S, sh_media_FTRV_S, sh_media_LDHI_L): Likewise.
(sh_media_LDHI_Q, sh_media_LDLO_L, sh_media_LDLO_Q): Likewise.
(sh_media_STHI_L, sh_media_STHI_Q, sh_media_STLO_L): Likewise.
(sh_media_STLO_Q, sh_media_NSB, sh_media_BYTEREV): Likewise.
(sh_media_PREFO, sh_media_ALLOCO): Likewise.
(sh_media_FCOSA_S, sh_media_FSINA_S): New function.
(sh_media_FMOV_DQ, sh_media_FMOV_LS): Use union assignment.
(sh_media_FMOV_QD, sh_media_FMOV_SL): Likewise.
(sh_media_CMVEQ): Use C code. Add attribute always_inline.
(sh_media_CMVNE): Likewise.
(sh_media_ADDZ_L): Use C code.
(sh_media_unaligned_LD_L): Use intrinsics directly.
(sh_media_unaligned_LD_Q, sh_media_unaligned_ST_L): Likewise.
(sh_media_unaligned_ST_Q): Likewise.
* config/sh/divtab.c: New file.
2005-04-06 Andrew Stubbs <andrew.stubbs@superh.com>
J"orn Rennecke <joern.rennecke@superh.com>
* config/sh/superh64.h, config/sh/superh.h: New files.
* config/sh/newlib.h, config/sh/t-superh: Likewise.
* config.gcc: Add support for sh*-superh-elf* and sh64-superh-linux*.
gcc/testsuite:
2005-05-06 J"orn Rennecke <joern.rennecke@st.com>
* gcc.dg/pr15784-3.c: Add -fno-finite-math-only option.
* gcc.dg/20021029-1.c: For sh64*-*-*, add -mpt-fixed.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99460 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/sh/ushmedia.h')
-rw-r--r-- | gcc/config/sh/ushmedia.h | 884 |
1 files changed, 413 insertions, 471 deletions
diff --git a/gcc/config/sh/ushmedia.h b/gcc/config/sh/ushmedia.h index 6fb70162618..86312af3297 100644 --- a/gcc/config/sh/ushmedia.h +++ b/gcc/config/sh/ushmedia.h @@ -36,767 +36,706 @@ typedef float __GCC_FV __attribute__ ((vector_size (4 * sizeof (float)))); typedef float __GCC_MTRX __attribute__ ((vector_size (16 * sizeof (float)))); #endif -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MABS_L (unsigned long long mm) { - unsigned long long res; - __asm__ ("mabs.l %1, %0" : "=r" (res) : "r" (mm)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_absv2si2 ((v2si) mm); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MABS_W (unsigned long long mm) { - unsigned long long res; - __asm__ ("mabs.w %1, %0" : "=r" (res) : "r" (mm)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_absv4hi2 ((v4hi) mm); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MADD_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("madd.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_addv2si3 ((v2si) mm, (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MADD_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("madd.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_addv4hi3 ((v4hi) mm, (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MADDS_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("madds.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_ssaddv2si3 ((v2si) mm, (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MADDS_UB (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("madds.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_usaddv8qi3 ((v8qi) mm, (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MADDS_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("madds.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_ssaddv4hi3 ((v4hi) mm, (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCMPEQ_B (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmpeq.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MCMPEQ_B ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCMPEQ_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmpeq.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MCMPEQ_L ((v2si) mm, + (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCMPEQ_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmpeq.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; -} + typedef float v4hi __attribute__ ((mode(V4HI))); -__inline__ static -unsigned long long -sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn) -{ - unsigned long long res; - __asm__ ("mcmpgt.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + return (unsigned long long) __builtin_sh_media_MCMPEQ_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCMPGT_UB (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmpgt.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MCMPGT_UB ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long -sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn) +static __inline unsigned long long +sh_media_MCMPGT_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmpgt.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MCMPGT_L ((v2si) mm, + (v2si) mn); } -__inline__ static -unsigned long long -sh_media_MCMV (unsigned long long mm, unsigned long long mn, unsigned long long mw) +static __inline unsigned long long +sh_media_MCMPGT_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcmv %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MCMPGT_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +#define sh_media_MCMV __builtin_sh_media_MCMV + +static __inline unsigned long long sh_media_MCNVS_LW (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcnvs.lw %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + typedef unsigned int uv2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MCNVS_LW ((v2si) mm, + (uv2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCNVS_WB (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcnvs.wb %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MCNVS_WB ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MCNVS_WUB (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mcnvs.wub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MCNVS_WUB ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR1 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr1 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR1 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR2 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr2 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR2 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR3 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr3 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR3 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR4 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr4 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR4 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR5 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr5 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR5 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR6 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr6 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR6 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MEXTR7 (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mextr7 %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MEXTR7 ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long -sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw) +static __inline unsigned long long +sh_media_MMACFX_WL (unsigned long long mm, unsigned long long mn, + unsigned long long mw) { - unsigned long long res; - __asm__ ("mmacfx.wl %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + typedef float v2hi __attribute__ ((mode(V2HI))); + typedef float v2si __attribute__ ((mode(V2SI))); + typedef unsigned int uv2si __attribute__ ((mode(V2SI))); + + long mm_l = (long) mm; + long mn_l = (long) mn; + + return ((unsigned long long) + __builtin_sh_media_MMACFX_WL ((v2hi) mm_l, (v2hi) mn_l, + (uv2si) mw)); } -__inline__ static -unsigned long long -sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn, unsigned long long mw) +static __inline unsigned long long +sh_media_MMACNFX_WL (unsigned long long mm, unsigned long long mn, + unsigned long long mw) { - unsigned long long res; - __asm__ ("mmacnfx.wl %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + typedef float v2hi __attribute__ ((mode(V2HI))); + typedef float v2si __attribute__ ((mode(V2SI))); + typedef unsigned int uv2si __attribute__ ((mode(V2SI))); + + long mm_l = (long) mm; + long mn_l = (long) mn; + + return ((unsigned long long) + __builtin_sh_media_MMACNFX_WL ((v2hi) mm_l, (v2hi) mn_l, + (uv2si) mw)); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMUL_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmul.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_mulv2si3 ((v2si) mm, (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMUL_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmul.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_mulv4hi3 ((v4hi) mm, (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMULFX_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmulfx.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MMULFX_L ((v2si) mm, + (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMULFX_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmulfx.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MMULFX_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMULFXRP_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmulfxrp.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MMULFXRP_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMULHI_WL (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmulhi.wl %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MMULHI_WL ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MMULLO_WL (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mmullo.wl %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MMULLO_WL ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long -sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) +static __inline unsigned long long +sh_media_MMULSUM_WQ (unsigned long long mm, unsigned long long mn, + unsigned long long mw) { - unsigned long long res; - __asm__ ("mmulsum.wq %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + typedef unsigned int uv4hi __attribute__ ((mode(V4HI))); + + return __builtin_sh_media_MMULSUM_WQ ((uv4hi) mm, (uv4hi) mn, mw); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MPERM_W (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mperm.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MPERM_W ((v4hi) mm, mn); } -__inline__ static -unsigned long long -sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) +static __inline unsigned long long +sh_media_MSAD_UBQ (unsigned long long mm, unsigned long long mn, + unsigned long long mw) { - unsigned long long res; - __asm__ ("msad.ubq %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + typedef unsigned int uv8qi __attribute__ ((mode(V8QI))); + + return __builtin_sh_media_MSAD_UBQ ((uv8qi) mm, (uv8qi) mn, mw); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHALDS_L (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshalds.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MSHALDS_L ((v2si) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHALDS_W (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshalds.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MSHALDS_W ((v4hi) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHARD_L (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshard.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_ashrv2si3 ((v2si) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHARD_W (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshard.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; -} + typedef float v4hi __attribute__ ((mode(V4HI))); -__inline__ static -short -sh_media_MSHARDS_Q (long long mm, unsigned int mn) -{ - short res; - __asm__ ("mshards.q %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + return (unsigned long long) __builtin_ashrv4hi3 ((v4hi) mm, mn); } -__inline__ static -unsigned long long +#define sh_media_MSHARDS_Q __builtin_sh_media_MSHARDS_Q + +static __inline unsigned long long sh_media_MSHFHI_B (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshfhi.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MSHFHI_B ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHFHI_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshfhi.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MSHFHI_L ((v2si) mm, + (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHFHI_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshfhi.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MSHFHI_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHFLO_B (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshflo.b %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_MSHFLO_B ((v8qi) mm, + (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHFLO_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshflo.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sh_media_MSHFLO_L ((v2si) mm, + (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHFLO_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("mshflo.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sh_media_MSHFLO_W ((v4hi) mm, + (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHLLD_L (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshlld.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_ashlv2si3 ((v2si) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHLLD_W (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshlld.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_ashlv4hi3 ((v4hi) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHLRD_L (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshlrd.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_lshrv2si3 ((v2si) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSHLRD_W (unsigned long long mm, unsigned int mn) { - unsigned long long res; - __asm__ ("mshlrd.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_lshrv4hi3 ((v4hi) mm, mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSUB_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("msub.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_subv2si3 ((v2si) mm, (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSUB_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("msub.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_subv4hi3 ((v4hi) mm, (v4hi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSUBS_L (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("msubs.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v2si __attribute__ ((mode(V2SI))); + + return (unsigned long long) __builtin_sssubv2si3 ((v2si) mm, (v2si) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSUBS_UB (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("msubs.ub %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_ussubv8qi3 ((v8qi) mm, (v8qi) mn); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_MSUBS_W (unsigned long long mm, unsigned long long mn) { - unsigned long long res; - __asm__ ("msubs.w %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + typedef float v4hi __attribute__ ((mode(V4HI))); + + return (unsigned long long) __builtin_sssubv4hi3 ((v4hi) mm, (v4hi) mn); } #if ! __SH4_NOFPU__ -__inline__ static -double -sh_media_FABS_D (double dg) -{ - double res; - __asm__ ("fabs.d %1, %0" : "=f" (res) : "f" (dg)); - return res; -} +/* Floating-point Intrinsics */ -__inline__ static -float -sh_media_FABS_S (float fg) -{ - float res; - __asm__ ("fabs.s %1, %0" : "=f" (res) : "f" (fg)); - return res; -} +#define sh_media_FABS_D __builtin_fabs +#define sh_media_FABS_S __builtin_fabsf +#define sh_media_FCMPUN_D __builtin_isunordered +#define sh_media_FCMPUN_S __builtin_isunordered -__inline__ static -int -sh_media_FCMPUN_D (double dg, double dh) +static __inline float sh_media_FCOSA_S (float fg) { - int res; - __asm__ ("fcmpun.d %1, %2, %0" : "=f" (res) : "f" (dg), "f" (dh)); - return res; -} + union { int i; float f; } u; -__inline__ static -int -sh_media_FCMPUN_S (float fg, float fh) -{ - int res; - __asm__ ("fcmpun.s %1, %2, %0" : "=f" (res) : "f" (fg), "f" (fh)); - return res; + u.f = fg; + return __builtin_sh_media_FCOSA_S (u.i); } -__inline__ static -float +static __inline float sh_media_FGETSCR (void) -{ - float res; - __asm__ ("fgetscr %0" : "=f" (res)); - return res; +{ + float f; + + __asm volatile ("fgetscr %0" : "=f" (f)); + return f; } -__inline__ static -float +static __inline float sh_media_FIPR_S (const void *fvg, const void *fvh) { - float res; - __asm__ ("fipr.s %1, %2, %0" : "=f" (res) - : "f" (*(const __GCC_FV *)fvg), "f" (*(const __GCC_FV *)fvh)); - return res; + typedef float v4sf __attribute__ ((mode(V4SF))); + v4sf vg = *(v4sf*) fvg; + v4sf vh = *(v4sf*) fvh; + + return __builtin_sh_media_FIPR_S (vg, vh); } -__inline__ static -float +#if 0 +/* This gives different results for -O0 */ +static __inline float sh_media_FMAC_S (float fg, float fh, float fq) { - float res; - __asm__ ("fmac.s %1, %2, %0" : "=f" (res) - : "f" (fg), "f" (fh), "0" (fq)); - return res; + return fg * fh + fq; } +#else -__inline__ static -long long +#define sh_media_FMAC_S __builtin_sh_media_FMAC_S +#endif + +static __inline long long sh_media_FMOV_DQ (double dg) { - long long res; - __asm__ ("fmov.dq %1, %0" : "=r" (res) : "f" (dg)); - return res; + union { long long l; double d; } u; + + u.d = dg; + return u.l; } -__inline__ static -float +static __inline float sh_media_FMOV_LS (int mm) { - float res; - __asm__ ("fmov.ls %1, %0" : "=f" (res) : "r" (mm)); - return res; + union { int i; float f; } u; + + u.i = mm; + return u.f; } -__inline__ static -double +static __inline double sh_media_FMOV_QD (long long mm) { - double res; - __asm__ ("fmov.qd %1, %0" : "=f" (res) : "r" (mm)); - return res; + union { long long l; double d; } u; + + u.l = mm; + return u.d; } -__inline__ static -int +static __inline int sh_media_FMOV_SL (float fg) { - int res; - __asm__ ("fmov.sl %1, %0" : "=r" (res) : "f" (fg)); - return res; + union { int i; float f; } u; + + u.f = fg; + return u.i; } -__inline__ static -void +static __inline void sh_media_FPUTSCR (float fg) -{ - __asm__ ("fputscr %0" : : "f" (fg)); +{ + __asm volatile ("fputscr %0" : : "f" (fg)); } -__inline__ static -double -sh_media_FSQRT_D (double dg) +static __inline float sh_media_FSINA_S (float fg) { - double res; - __asm__ ("fsqrt.d %1, %0" : "=f" (res) : "f" (dg)); - return res; -} + union { int i; float f; } u; -__inline__ static -float -sh_media_FSQRT_S (float fg) -{ - float res; - __asm__ ("fsqrt.s %1, %0" : "=f" (res) : "f" (fg)); - return res; + u.f = fg; + return __builtin_sh_media_FSINA_S (u.i); } -__inline__ static -void +/* Can't use __builtin_sqrt / __builtin_sqrtf because they still implement + error handling unless -ffast-math is used. */ +#define sh_media_FSQRT_D __builtin_sh_media_FSQRT_D +#define sh_media_FSQRT_S __builtin_sh_media_FSQRT_S +#define sh_media_FSRRA_S __builtin_sh_media_FSRRA_S + +static __inline void sh_media_FTRV_S (const void *mtrxg, const void *fvh, void *fvf) { - __asm__ ("ftrv.s %2, %1, %0" : "=f" (*(__GCC_FV *)fvf) - : "f" (*(const __GCC_FV *)fvh), "f" (*(const __GCC_MTRX *)mtrxg)); + typedef float v16sf __attribute__ ((mode(V16SF))); + typedef float v4sf __attribute__ ((mode(V4SF))); + v16sf mtrx = *(v16sf*) mtrxg; + v4sf vh = *(v4sf*) fvh; + + *(v4sf*) fvf = __builtin_sh_media_FTRV_S (mtrx, vh); } #endif /* ! __SH4_NOFPU__ */ -__inline__ static -unsigned long long +/* Not implemented here: Control and Configuration intrinsics. */ +/* Misaligned Access Support intrinsics */ + +static __inline unsigned long long sh_media_LDHI_L (void *p, int s) { - unsigned long long res; - __asm__ ("ldhi.l %m1, %0" : "=r" (res) : "o" (((char*)p)[s])); - return res; + return __builtin_sh_media_LDHI_L ((char *)p + s); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_LDHI_Q (void *p, int s) { - unsigned long long res; - __asm__ ("ldhi.q %m1, %0" : "=r" (res) : "o" (((char*)p)[s])); - return res; + return __builtin_sh_media_LDHI_Q ((char *)p + s); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_LDLO_L (void *p, int s) { - unsigned long long res; - __asm__ ("ldlo.l %m1, %0" : "=r" (res) : "o" (((char*)p)[s])); - return res; + return __builtin_sh_media_LDLO_L ((char *)p + s); } -__inline__ static -unsigned long long +static __inline unsigned long long sh_media_LDLO_Q (void *p, int s) { - unsigned long long res; - __asm__ ("ldlo.q %m1, %0" : "=r" (res) : "o" (((char*)p)[s])); - return res; + return __builtin_sh_media_LDLO_Q ((char *)p + s); } -__inline__ static -void +static __inline void sh_media_STHI_L (void *p, int s, unsigned int mw) { - __asm__ ("sthi.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw)); + __builtin_sh_media_STHI_L ((char*)p + s, mw); } -__inline__ static -void +static __inline void sh_media_STHI_Q (void *p, int s, unsigned long long mw) { - __asm__ ("sthi.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw)); + __builtin_sh_media_STHI_Q ((char*)p + s, mw); } -__inline__ static -void +static __inline void sh_media_STLO_L (void *p, int s, unsigned int mw) { - __asm__ ("stlo.l %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw)); + __builtin_sh_media_STLO_L ((char*)p + s, mw); } -__inline__ static -void +static __inline void sh_media_STLO_Q (void *p, int s, unsigned long long mw) { - __asm__ ("stlo.q %m0, %1" : "+o" (((char*)p)[s]) : "r" (mw)); + __builtin_sh_media_STLO_Q ((char*)p + s, mw); } -__inline__ static -unsigned char -sh_media_NSB (long long mm) -{ - unsigned char res; - __asm__ ("nsb %1, %0" : "=r" (res) : "r" (mm)); - return res; -} +/* Miscellaneous intrinsics */ -__inline__ static -unsigned long long +#define sh_media_NSB __builtin_sh_media_NSB + +static __inline unsigned long long sh_media_BYTEREV (unsigned long long mm) { - unsigned long long res; - __asm__ ("byterev %1, %0" : "=r" (res) : "r" (mm)); - return res; + typedef float v8qi __attribute__ ((mode(V8QI))); + + return (unsigned long long) __builtin_sh_media_BYTEREV ((v8qi) mm); } -__inline__ static -unsigned long long +__inline__ static unsigned long long +sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline)); + +__inline__ static unsigned long long sh_media_CMVEQ (unsigned long long mm, unsigned long long mn, unsigned long long mw) { - unsigned long long res; - __asm__ ("cmveq %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + return mm == 0 ? mn : mw; } -__inline__ static -unsigned long long +__inline__ static unsigned long long +sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw) __attribute__ ((always_inline)); + +__inline__ static unsigned long long sh_media_CMVNE (unsigned long long mm, unsigned long long mn, unsigned long long mw) { - unsigned long long res; - __asm__ ("cmveq %1, %2, %0" : "=r" (res) - : "r" (mm), "r" (mn), "0" (mw)); - return res; + return mm != 0 ? mn : mw; } -__inline__ static -unsigned long long +static __inline long long sh_media_ADDZ_L (unsigned int mm, unsigned int mn) { - unsigned long long res; - __asm__ ("addz.l %1, %2, %0" : "=r" (res) : "r" (mm), "r" (mn)); - return res; + return mm + mn; } -__inline__ static +/* NOP and Synchronization instrinsics not implemented here. */ + +static __inline__ void sh_media_PREFO(void *mm, int s) +{ + __builtin_sh_media_PREFO (mm + s, 0, 0); +} + +/* Event Handling instrinsics not implemented here. */ + +/* Old asm stuff */ + +static __inline__ void sh_media_NOP (void) { - __asm__ __volatile__ ("nop" : :); + __asm__ ("nop" : :); } __inline__ static @@ -827,7 +766,7 @@ __inline__ static void sh_media_ALLOCO (void *mm, int s) { - __asm__ __volatile__ ("alloco %m0" : : "o" (((char*)mm)[s])); + __builtin_sh_media_ALLOCO (mm + s); } __inline__ static @@ -867,13 +806,6 @@ sh_media_PREFI (void *mm, int s) __inline__ static void -sh_media_PREFO (void *mm, int s) -{ - __asm__ __volatile__ ("ld.b %m0, r63" : : "o" (((char*)mm)[s])); -} - -__inline__ static -void sh_media_BRK (void) { __asm__ __volatile__ ("brk"); @@ -911,14 +843,19 @@ sh_media_unaligned_LD_UW (void *p) #endif } +/* We don't use the sh_media_LD* functions here because that turned out + to impede constant propagation of the offsets into the ldhi / ldlo + instructions. */ __inline__ static int sh_media_unaligned_LD_L (void *p) { #if __LITTLE_ENDIAN__ - return sh_media_LDHI_L (p, 3) | sh_media_LDLO_L (p, 0); + return (__builtin_sh_media_LDHI_L ((char *)p + 3) + | __builtin_sh_media_LDLO_L (p)); #else - return sh_media_LDLO_L (p, 3) | sh_media_LDHI_L (p, 0); + return (__builtin_sh_media_LDLO_L ((char *)p + 3) + | __builtin_sh_media_LDHI_L (p)); #endif } @@ -927,9 +864,11 @@ long long sh_media_unaligned_LD_Q (void *p) { #if __LITTLE_ENDIAN__ - return sh_media_LDHI_Q (p, 7) | sh_media_LDLO_Q (p, 0); + return (__builtin_sh_media_LDHI_Q ((char *)p + 7) + | __builtin_sh_media_LDLO_Q (p)); #else - return sh_media_LDLO_Q (p, 7) | sh_media_LDHI_Q (p, 0); + return (__builtin_sh_media_LDLO_Q ((char *)p + 7) + | __builtin_sh_media_LDHI_Q (p)); #endif } @@ -947,16 +886,19 @@ sh_media_unaligned_ST_W (void *p, unsigned int k) #endif } +/* We don't use the sh_media_ST* functions here because that turned out + to impede constant propagation of the offsets into the ldhi / ldlo + instructions. */ __inline__ static void sh_media_unaligned_ST_L (void *p, unsigned int k) { #if __LITTLE_ENDIAN__ - sh_media_STHI_L (p, 3, k); - sh_media_STLO_L (p, 0, k); + __builtin_sh_media_STHI_L (p + 3, k); + __builtin_sh_media_STLO_L (p, k); #else - sh_media_STLO_L (p, 3, k); - sh_media_STHI_L (p, 0, k); + __builtin_sh_media_STLO_L (p + 3, k); + __builtin_sh_media_STHI_L (p, k); #endif } @@ -965,11 +907,11 @@ void sh_media_unaligned_ST_Q (void *p, unsigned long long k) { #if __LITTLE_ENDIAN__ - sh_media_STHI_Q (p, 7, k); - sh_media_STLO_Q (p, 0, k); + __builtin_sh_media_STHI_Q (p + 7, k); + __builtin_sh_media_STLO_Q (p, k); #else - sh_media_STLO_Q (p, 7, k); - sh_media_STHI_Q (p, 0, k); + __builtin_sh_media_STLO_Q (p + 7, k); + __builtin_sh_media_STHI_Q (p, k); #endif } |