X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=gcc%2Fconfig%2Fsh%2Fushmedia.h;fp=gcc%2Fconfig%2Fsh%2Fushmedia.h;h=2f1f555833e747ea1e52c840eff60a45b4654626;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=9a402e8a06ec6b4cf7e4698a00c52d850f553870;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/gcc/config/sh/ushmedia.h b/gcc/config/sh/ushmedia.h index 9a402e8a..2f1f5558 100644 --- a/gcc/config/sh/ushmedia.h +++ b/gcc/config/sh/ushmedia.h @@ -1,28 +1,26 @@ -/* Copyright (C) 2000, 2001 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2004, 2005, 2009 Free Software Foundation, Inc. -This file is part of GNU CC. +This file is part of GCC. -GNU CC is free software; you can redistribute it and/or modify +GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. -GNU CC is distributed in the hope that it will be useful, +GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ -/* As a special exception, if you include this header file into source - files compiled by GCC, this header file does not by itself cause - the resulting executable to be covered by the GNU General Public - License. This exception does not however invalidate any other - reasons why the executable file might be covered by the GNU General - Public License. */ /* ushmedia.h: Intrinsics corresponding to SHmedia instructions that may be executed in both user and privileged mode. */ @@ -32,771 +30,710 @@ Boston, MA 02111-1307, USA. */ #if __SHMEDIA__ #if ! __SH4_NO_FPU -typedef float __GCC_FV __attribute__ ((mode (V4SF))); -typedef float __GCC_MTRX __attribute__ ((mode (V16SF))); +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 intrinsics not implemented here. */ + +static __inline__ void sh_media_PREFO(void *mm, int s) +{ + __builtin_sh_media_PREFO (mm + s, 0, 0); +} + +/* Event Handling intrinsics not implemented here. */ + +/* Old asm stuff */ + +static __inline__ void sh_media_NOP (void) { - __asm__ __volatile__ ("nop" : :); + __asm__ ("nop" : :); } __inline__ static @@ -827,7 +764,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 @@ -865,13 +802,6 @@ sh_media_PREFI (void *mm, int s) __asm__ __volatile__ ("prefi %m0" : : "o" (((char*)mm)[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) @@ -911,14 +841,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 +862,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 +884,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 +905,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 }