Home | History | Annotate | Line # | Download | only in common
cgen-ops.h revision 1.10
      1   1.1  christos /* Semantics ops support for CGEN-based simulators.
      2  1.10  christos    Copyright (C) 1996-2023 Free Software Foundation, Inc.
      3   1.1  christos    Contributed by Cygnus Solutions.
      4   1.1  christos 
      5   1.1  christos This file is part of the GNU Simulators.
      6   1.1  christos 
      7   1.1  christos This program is free software; you can redistribute it and/or modify
      8   1.1  christos it under the terms of the GNU General Public License as published by
      9   1.1  christos the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos This program is distributed in the hope that it will be useful,
     13   1.1  christos but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos You should have received a copy of the GNU General Public License
     18   1.1  christos along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19   1.1  christos 
     20   1.1  christos */
     21   1.1  christos 
     22   1.1  christos #ifndef CGEN_SEM_OPS_H
     23   1.1  christos #define CGEN_SEM_OPS_H
     24   1.1  christos 
     25   1.1  christos #include <assert.h>
     26   1.1  christos 
     27   1.5  christos /* TODO: This should get moved into sim-inline.h.  */
     28   1.1  christos #if defined (__GNUC__) && ! defined (SEMOPS_DEFINE_INLINE)
     29   1.1  christos #define SEMOPS_DEFINE_INLINE
     30   1.5  christos #define SEMOPS_INLINE EXTERN_INLINE
     31   1.1  christos #else
     32   1.1  christos #define SEMOPS_INLINE
     33   1.1  christos #endif
     34   1.1  christos 
     35   1.1  christos /* Semantic operations.
     36   1.1  christos    At one point this file was machine generated.  Maybe it will be again.  */
     37   1.1  christos 
     38   1.1  christos /* TODO: Lazy encoding/decoding of fp values.  */
     39   1.1  christos 
     40   1.1  christos /* These don't really have a mode.  */
     41   1.1  christos #define ANDIF(x, y) ((x) && (y))
     42   1.1  christos #define ORIF(x, y) ((x) || (y))
     43   1.1  christos 
     44   1.1  christos #define SUBBI(x, y) ((x) - (y))
     45   1.1  christos #define ANDBI(x, y) ((x) & (y))
     46   1.1  christos #define ORBI(x, y) ((x) | (y))
     47   1.1  christos #define XORBI(x, y) ((x) ^ (y))
     48   1.1  christos #define NEGBI(x) (- (x))
     49   1.1  christos #define NOTBI(x) (! (BI) (x))
     50   1.1  christos #define INVBI(x) (~ (x))
     51   1.1  christos #define EQBI(x, y) ((BI) (x) == (BI) (y))
     52   1.1  christos #define NEBI(x, y) ((BI) (x) != (BI) (y))
     53   1.1  christos #define LTBI(x, y) ((BI) (x) < (BI) (y))
     54   1.1  christos #define LEBI(x, y) ((BI) (x) <= (BI) (y))
     55   1.1  christos #define GTBI(x, y) ((BI) (x) > (BI) (y))
     56   1.1  christos #define GEBI(x, y) ((BI) (x) >= (BI) (y))
     57   1.1  christos #define LTUBI(x, y) ((BI) (x) < (BI) (y))
     58   1.1  christos #define LEUBI(x, y) ((BI) (x) <= (BI) (y))
     59   1.1  christos #define GTUBI(x, y) ((BI) (x) > (BI) (y))
     60   1.1  christos #define GEUBI(x, y) ((BI) (x) >= (BI) (y))
     61   1.1  christos 
     62   1.1  christos #define ADDQI(x, y) ((QI) ((UQI) (x) + (UQI) (y)))
     64   1.1  christos #define SUBQI(x, y) ((QI) ((UQI) (x) - (UQI) (y)))
     65   1.1  christos #define MULQI(x, y) ((QI) ((UQI) (x) * (UQI) (y)))
     66   1.1  christos #define DIVQI(x, y) ((QI) (x) / (QI) (y))
     67   1.1  christos #define UDIVQI(x, y) ((UQI) (x) / (UQI) (y))
     68   1.1  christos #define MODQI(x, y) ((QI) (x) % (QI) (y))
     69   1.1  christos #define UMODQI(x, y) ((UQI) (x) % (UQI) (y))
     70   1.1  christos #define SRAQI(x, y) ((QI) (x) >> (y))
     71   1.1  christos #define SRLQI(x, y) ((UQI) (x) >> (y))
     72   1.1  christos #define SLLQI(x, y) ((UQI) (x) << (y))
     73   1.1  christos extern QI RORQI (QI, int);
     74   1.1  christos extern QI ROLQI (QI, int);
     75   1.1  christos #define ANDQI(x, y) ((x) & (y))
     76   1.1  christos #define ORQI(x, y) ((x) | (y))
     77   1.1  christos #define XORQI(x, y) ((x) ^ (y))
     78   1.1  christos #define NEGQI(x) ((QI) (- (UQI) (x)))
     79   1.1  christos #define NOTQI(x) (! (QI) (x))
     80   1.1  christos #define INVQI(x) (~ (x))
     81   1.1  christos #define ABSQI(x) ((QI) ((QI) (x) < 0 ? -(UQI) (x) : (UQI) (x)))
     82   1.1  christos #define EQQI(x, y) ((QI) (x) == (QI) (y))
     83   1.1  christos #define NEQI(x, y) ((QI) (x) != (QI) (y))
     84   1.1  christos #define LTQI(x, y) ((QI) (x) < (QI) (y))
     85   1.1  christos #define LEQI(x, y) ((QI) (x) <= (QI) (y))
     86   1.1  christos #define GTQI(x, y) ((QI) (x) > (QI) (y))
     87   1.1  christos #define GEQI(x, y) ((QI) (x) >= (QI) (y))
     88   1.1  christos #define LTUQI(x, y) ((UQI) (x) < (UQI) (y))
     89   1.1  christos #define LEUQI(x, y) ((UQI) (x) <= (UQI) (y))
     90   1.1  christos #define GTUQI(x, y) ((UQI) (x) > (UQI) (y))
     91   1.1  christos #define GEUQI(x, y) ((UQI) (x) >= (UQI) (y))
     92   1.1  christos 
     93   1.1  christos #define ADDHI(x, y) ((HI) ((UHI) (x) + (UHI) (y)))
     95   1.1  christos #define SUBHI(x, y) ((HI) ((UHI) (x) - (UHI) (y)))
     96   1.1  christos #define MULHI(x, y) ((HI) ((UHI) (x) * (UHI) (y)))
     97   1.1  christos #define DIVHI(x, y) ((HI) (x) / (HI) (y))
     98   1.1  christos #define UDIVHI(x, y) ((UHI) (x) / (UHI) (y))
     99   1.1  christos #define MODHI(x, y) ((HI) (x) % (HI) (y))
    100   1.1  christos #define UMODHI(x, y) ((UHI) (x) % (UHI) (y))
    101   1.1  christos #define SRAHI(x, y) ((HI) (x) >> (y))
    102   1.1  christos #define SRLHI(x, y) ((UHI) (x) >> (y))
    103   1.1  christos #define SLLHI(x, y) ((UHI) (x) << (y))
    104   1.1  christos extern HI RORHI (HI, int);
    105   1.1  christos extern HI ROLHI (HI, int);
    106   1.1  christos #define ANDHI(x, y) ((x) & (y))
    107   1.1  christos #define ORHI(x, y) ((x) | (y))
    108   1.1  christos #define XORHI(x, y) ((x) ^ (y))
    109   1.1  christos #define NEGHI(x) ((HI) (- (UHI) (x)))
    110   1.1  christos #define NOTHI(x) (! (HI) (x))
    111   1.1  christos #define INVHI(x) (~ (x))
    112   1.1  christos #define ABSHI(x) ((HI) ((HI) (x) < 0 ? -(UHI) (x) : (UHI) (x)))
    113   1.1  christos #define EQHI(x, y) ((HI) (x) == (HI) (y))
    114   1.1  christos #define NEHI(x, y) ((HI) (x) != (HI) (y))
    115   1.1  christos #define LTHI(x, y) ((HI) (x) < (HI) (y))
    116   1.1  christos #define LEHI(x, y) ((HI) (x) <= (HI) (y))
    117   1.1  christos #define GTHI(x, y) ((HI) (x) > (HI) (y))
    118   1.1  christos #define GEHI(x, y) ((HI) (x) >= (HI) (y))
    119   1.1  christos #define LTUHI(x, y) ((UHI) (x) < (UHI) (y))
    120   1.1  christos #define LEUHI(x, y) ((UHI) (x) <= (UHI) (y))
    121   1.1  christos #define GTUHI(x, y) ((UHI) (x) > (UHI) (y))
    122   1.1  christos #define GEUHI(x, y) ((UHI) (x) >= (UHI) (y))
    123   1.1  christos 
    124   1.1  christos #define ADDSI(x, y) ((SI) ((USI) (x) + (USI) (y)))
    126   1.1  christos #define SUBSI(x, y) ((SI) ((USI) (x) - (USI) (y)))
    127   1.1  christos #define MULSI(x, y) ((SI) ((USI) (x) * (USI) (y)))
    128   1.1  christos #define DIVSI(x, y) ((SI) (x) / (SI) (y))
    129   1.1  christos #define UDIVSI(x, y) ((USI) (x) / (USI) (y))
    130   1.1  christos #define MODSI(x, y) ((SI) (x) % (SI) (y))
    131   1.1  christos #define UMODSI(x, y) ((USI) (x) % (USI) (y))
    132   1.1  christos #define SRASI(x, y) ((SI) (x) >> (y))
    133   1.1  christos #define SRLSI(x, y) ((USI) (x) >> (y))
    134   1.1  christos #define SLLSI(x, y) ((USI) (x) << (y))
    135   1.1  christos extern SI RORSI (SI, int);
    136   1.1  christos extern SI ROLSI (SI, int);
    137   1.1  christos #define ANDSI(x, y) ((x) & (y))
    138   1.1  christos #define ORSI(x, y) ((x) | (y))
    139   1.1  christos #define XORSI(x, y) ((x) ^ (y))
    140   1.1  christos #define NEGSI(x) ((SI) (- (USI) (x)))
    141   1.1  christos #define NOTSI(x) (! (SI) (x))
    142   1.1  christos #define INVSI(x) (~ (x))
    143   1.1  christos #define ABSSI(x) ((SI) ((SI) (x) < 0 ? -(USI) (x) : (USI) (x)))
    144   1.1  christos #define EQSI(x, y) ((SI) (x) == (SI) (y))
    145   1.1  christos #define NESI(x, y) ((SI) (x) != (SI) (y))
    146   1.1  christos #define LTSI(x, y) ((SI) (x) < (SI) (y))
    147   1.1  christos #define LESI(x, y) ((SI) (x) <= (SI) (y))
    148   1.1  christos #define GTSI(x, y) ((SI) (x) > (SI) (y))
    149   1.1  christos #define GESI(x, y) ((SI) (x) >= (SI) (y))
    150   1.1  christos #define LTUSI(x, y) ((USI) (x) < (USI) (y))
    151   1.1  christos #define LEUSI(x, y) ((USI) (x) <= (USI) (y))
    152   1.1  christos #define GTUSI(x, y) ((USI) (x) > (USI) (y))
    153   1.1  christos #define GEUSI(x, y) ((USI) (x) >= (USI) (y))
    154   1.1  christos 
    155   1.1  christos #ifdef DI_FN_SUPPORT
    157   1.1  christos extern DI ADDDI (DI, DI);
    158   1.1  christos extern DI SUBDI (DI, DI);
    159   1.1  christos extern DI MULDI (DI, DI);
    160   1.1  christos extern DI DIVDI (DI, DI);
    161   1.1  christos extern DI UDIVDI (DI, DI);
    162   1.1  christos extern DI MODDI (DI, DI);
    163   1.1  christos extern DI UMODDI (DI, DI);
    164   1.1  christos extern DI SRADI (DI, int);
    165   1.1  christos extern UDI SRLDI (UDI, int);
    166   1.1  christos extern UDI SLLDI (UDI, int);
    167   1.1  christos extern DI RORDI (DI, int);
    168   1.1  christos extern DI ROLDI (DI, int);
    169   1.1  christos extern DI ANDDI (DI, DI);
    170   1.1  christos extern DI ORDI (DI, DI);
    171   1.1  christos extern DI XORDI (DI, DI);
    172   1.1  christos extern DI NEGDI (DI);
    173   1.1  christos extern int NOTDI (DI);
    174   1.1  christos extern DI INVDI (DI);
    175   1.1  christos extern int EQDI (DI, DI);
    176   1.1  christos extern int NEDI (DI, DI);
    177   1.1  christos extern int LTDI (DI, DI);
    178   1.1  christos extern int LEDI (DI, DI);
    179   1.1  christos extern int GTDI (DI, DI);
    180   1.1  christos extern int GEDI (DI, DI);
    181   1.1  christos extern int LTUDI (UDI, UDI);
    182   1.1  christos extern int LEUDI (UDI, UDI);
    183   1.1  christos extern int GTUDI (UDI, UDI);
    184   1.1  christos extern int GEUDI (UDI, UDI);
    185   1.1  christos #else /* ! DI_FN_SUPPORT */
    186   1.1  christos #define ADDDI(x, y) ((DI) ((UDI) (x) + (UDI) (y)))
    187   1.1  christos #define SUBDI(x, y) ((DI) ((UDI) (x) - (UDI) (y)))
    188   1.1  christos #define MULDI(x, y) ((DI) ((UDI) (x) * (UDI) (y)))
    189   1.1  christos #define DIVDI(x, y) ((DI) (x) / (DI) (y))
    190   1.1  christos #define UDIVDI(x, y) ((UDI) (x) / (UDI) (y))
    191   1.1  christos #define MODDI(x, y) ((DI) (x) % (DI) (y))
    192   1.1  christos #define UMODDI(x, y) ((UDI) (x) % (UDI) (y))
    193   1.1  christos #define SRADI(x, y) ((DI) (x) >> (y))
    194   1.1  christos #define SRLDI(x, y) ((UDI) (x) >> (y))
    195   1.1  christos #define SLLDI(x, y) ((UDI) (x) << (y))
    196   1.1  christos extern DI RORDI (DI, int);
    197   1.1  christos extern DI ROLDI (DI, int);
    198   1.1  christos #define ANDDI(x, y) ((x) & (y))
    199   1.1  christos #define ORDI(x, y) ((x) | (y))
    200   1.1  christos #define XORDI(x, y) ((x) ^ (y))
    201   1.1  christos #define NEGDI(x) ((DI) (- (UDI) (x)))
    202   1.1  christos #define NOTDI(x) (! (DI) (x))
    203   1.1  christos #define INVDI(x) (~ (x))
    204   1.1  christos #define ABSDI(x) ((DI) ((DI) (x) < 0 ? -(UDI) (x) : (UDI) (x)))
    205   1.1  christos #define EQDI(x, y) ((DI) (x) == (DI) (y))
    206   1.1  christos #define NEDI(x, y) ((DI) (x) != (DI) (y))
    207   1.1  christos #define LTDI(x, y) ((DI) (x) < (DI) (y))
    208   1.1  christos #define LEDI(x, y) ((DI) (x) <= (DI) (y))
    209   1.1  christos #define GTDI(x, y) ((DI) (x) > (DI) (y))
    210   1.1  christos #define GEDI(x, y) ((DI) (x) >= (DI) (y))
    211   1.1  christos #define LTUDI(x, y) ((UDI) (x) < (UDI) (y))
    212   1.1  christos #define LEUDI(x, y) ((UDI) (x) <= (UDI) (y))
    213   1.1  christos #define GTUDI(x, y) ((UDI) (x) > (UDI) (y))
    214   1.1  christos #define GEUDI(x, y) ((UDI) (x) >= (UDI) (y))
    215   1.1  christos #endif /* DI_FN_SUPPORT */
    216   1.1  christos 
    217   1.1  christos #define EXTBIQI(x) ((QI) (BI) (x))
    219   1.1  christos #define EXTBIHI(x) ((HI) (BI) (x))
    220   1.1  christos #define EXTBISI(x) ((SI) (BI) (x))
    221   1.1  christos #if defined (DI_FN_SUPPORT)
    222   1.1  christos extern DI EXTBIDI (BI);
    223   1.1  christos #else
    224   1.1  christos #define EXTBIDI(x) ((DI) (BI) (x))
    225   1.1  christos #endif
    226   1.1  christos #define EXTQIHI(x) ((HI) (QI) (x))
    227   1.1  christos #define EXTQISI(x) ((SI) (QI) (x))
    228   1.1  christos #if defined (DI_FN_SUPPORT)
    229   1.1  christos extern DI EXTQIDI (QI);
    230   1.1  christos #else
    231   1.1  christos #define EXTQIDI(x) ((DI) (QI) (x))
    232   1.1  christos #endif
    233   1.1  christos #define EXTHIHI(x) ((HI) (HI) (x))
    234   1.1  christos #define EXTHISI(x) ((SI) (HI) (x))
    235   1.1  christos #define EXTSISI(x) ((SI) (SI) (x))
    236   1.1  christos #if defined (DI_FN_SUPPORT)
    237   1.1  christos extern DI EXTHIDI (HI);
    238   1.1  christos #else
    239   1.1  christos #define EXTHIDI(x) ((DI) (HI) (x))
    240   1.1  christos #endif
    241   1.1  christos #if defined (DI_FN_SUPPORT)
    242   1.1  christos extern DI EXTSIDI (SI);
    243   1.1  christos #else
    244   1.1  christos #define EXTSIDI(x) ((DI) (SI) (x))
    245   1.1  christos #endif
    246   1.1  christos 
    247   1.1  christos #define ZEXTBIQI(x) ((QI) (BI) (x))
    249   1.1  christos #define ZEXTBIHI(x) ((HI) (BI) (x))
    250   1.1  christos #define ZEXTBISI(x) ((SI) (BI) (x))
    251   1.1  christos #if defined (DI_FN_SUPPORT)
    252   1.1  christos extern DI ZEXTBIDI (BI);
    253   1.1  christos #else
    254   1.1  christos #define ZEXTBIDI(x) ((DI) (BI) (x))
    255   1.1  christos #endif
    256   1.1  christos #define ZEXTQIHI(x) ((HI) (UQI) (x))
    257   1.1  christos #define ZEXTQISI(x) ((SI) (UQI) (x))
    258   1.1  christos #if defined (DI_FN_SUPPORT)
    259   1.1  christos extern DI ZEXTQIDI (QI);
    260   1.1  christos #else
    261   1.1  christos #define ZEXTQIDI(x) ((DI) (UQI) (x))
    262   1.1  christos #endif
    263   1.1  christos #define ZEXTHISI(x) ((SI) (UHI) (x))
    264   1.1  christos #define ZEXTHIHI(x) ((HI) (UHI) (x))
    265   1.1  christos #define ZEXTSISI(x) ((SI) (USI) (x))
    266   1.1  christos #if defined (DI_FN_SUPPORT)
    267   1.1  christos extern DI ZEXTHIDI (HI);
    268   1.1  christos #else
    269   1.1  christos #define ZEXTHIDI(x) ((DI) (UHI) (x))
    270   1.1  christos #endif
    271   1.1  christos #if defined (DI_FN_SUPPORT)
    272   1.1  christos extern DI ZEXTSIDI (SI);
    273   1.1  christos #else
    274   1.1  christos #define ZEXTSIDI(x) ((DI) (USI) (x))
    275   1.1  christos #endif
    276   1.1  christos 
    277   1.1  christos #define TRUNCQIBI(x) ((BI) (QI) (x))
    279   1.1  christos #define TRUNCHIBI(x) ((BI) (HI) (x))
    280   1.1  christos #define TRUNCHIQI(x) ((QI) (HI) (x))
    281   1.1  christos #define TRUNCSIBI(x) ((BI) (SI) (x))
    282   1.1  christos #define TRUNCSIQI(x) ((QI) (SI) (x))
    283   1.1  christos #define TRUNCSIHI(x) ((HI) (SI) (x))
    284   1.1  christos #define TRUNCSISI(x) ((SI) (SI) (x))
    285   1.1  christos #if defined (DI_FN_SUPPORT)
    286   1.1  christos extern BI TRUNCDIBI (DI);
    287   1.1  christos #else
    288   1.1  christos #define TRUNCDIBI(x) ((BI) (DI) (x))
    289   1.1  christos #endif
    290   1.1  christos #if defined (DI_FN_SUPPORT)
    291   1.1  christos extern QI TRUNCDIQI (DI);
    292   1.1  christos #else
    293   1.1  christos #define TRUNCDIQI(x) ((QI) (DI) (x))
    294   1.1  christos #endif
    295   1.1  christos #if defined (DI_FN_SUPPORT)
    296   1.1  christos extern HI TRUNCDIHI (DI);
    297   1.1  christos #else
    298   1.1  christos #define TRUNCDIHI(x) ((HI) (DI) (x))
    299   1.1  christos #endif
    300   1.1  christos #if defined (DI_FN_SUPPORT)
    301   1.1  christos extern SI TRUNCDISI (DI);
    302   1.1  christos #else
    303   1.1  christos #define TRUNCDISI(x) ((SI) (DI) (x))
    304  1.10  christos #endif
    305  1.10  christos 
    306  1.10  christos /* Composing/decomposing the various types.
    308  1.10  christos    Word ordering is endian-independent.  Words are specified most to least
    309  1.10  christos    significant and word number 0 is the most significant word.
    310  1.10  christos    ??? May also wish an endian-dependent version.  Later.  */
    311  1.10  christos 
    312  1.10  christos QI SUBWORDSIQI (SI, int);
    313  1.10  christos HI SUBWORDSIHI (SI, int);
    314  1.10  christos SI SUBWORDSFSI (SF);
    315  1.10  christos SF SUBWORDSISF (SI);
    316  1.10  christos DI SUBWORDDFDI (DF);
    317  1.10  christos DF SUBWORDDIDF (DI);
    318  1.10  christos QI SUBWORDDIQI (DI, int);
    319  1.10  christos HI SUBWORDDIHI (DI, int);
    320  1.10  christos SI SUBWORDDISI (DI, int);
    321  1.10  christos SI SUBWORDDFSI (DF, int);
    322  1.10  christos SI SUBWORDXFSI (XF, int);
    323  1.10  christos SI SUBWORDTFSI (TF, int);
    324  1.10  christos 
    325   1.1  christos UQI SUBWORDSIUQI (SI, int);
    326   1.1  christos UQI SUBWORDDIUQI (DI, int);
    327   1.1  christos 
    328   1.1  christos DI JOINSIDI (SI, SI);
    329   1.1  christos DF JOINSIDF (SI, SI);
    330   1.1  christos XF JOINSIXF (SI, SI, SI);
    331   1.1  christos TF JOINSITF (SI, SI, SI, SI);
    332   1.1  christos 
    333   1.1  christos #ifdef SEMOPS_DEFINE_INLINE
    334   1.1  christos 
    335   1.1  christos SEMOPS_INLINE SF
    336   1.1  christos SUBWORDSISF (SI in)
    337   1.1  christos {
    338   1.1  christos   union { SI in; SF out; } x;
    339   1.1  christos   x.in = in;
    340   1.1  christos   return x.out;
    341   1.1  christos }
    342   1.1  christos 
    343   1.1  christos SEMOPS_INLINE DF
    344   1.1  christos SUBWORDDIDF (DI in)
    345   1.1  christos {
    346   1.1  christos   union { DI in; DF out; } x;
    347   1.1  christos   x.in = in;
    348   1.1  christos   return x.out;
    349   1.1  christos }
    350   1.1  christos 
    351   1.1  christos SEMOPS_INLINE QI
    352   1.1  christos SUBWORDSIQI (SI in, int byte)
    353   1.1  christos {
    354   1.1  christos   assert (byte >= 0 && byte <= 3);
    355   1.1  christos   return (UQI) (in >> (8 * (3 - byte))) & 0xFF;
    356   1.1  christos }
    357   1.1  christos 
    358   1.1  christos SEMOPS_INLINE UQI
    359   1.1  christos SUBWORDSIUQI (SI in, int byte)
    360   1.1  christos {
    361   1.1  christos   assert (byte >= 0 && byte <= 3);
    362   1.1  christos   return (UQI) (in >> (8 * (3 - byte))) & 0xFF;
    363   1.1  christos }
    364   1.1  christos 
    365   1.1  christos SEMOPS_INLINE QI
    366   1.1  christos SUBWORDDIQI (DI in, int byte)
    367   1.1  christos {
    368   1.1  christos   assert (byte >= 0 && byte <= 7);
    369   1.1  christos   return (UQI) (in >> (8 * (7 - byte))) & 0xFF;
    370   1.1  christos }
    371   1.1  christos 
    372   1.1  christos SEMOPS_INLINE HI
    373   1.1  christos SUBWORDDIHI (DI in, int word)
    374   1.1  christos {
    375   1.1  christos   assert (word >= 0 && word <= 3);
    376   1.1  christos   return (UHI) (in >> (16 * (3 - word))) & 0xFFFF;
    377   1.1  christos }
    378   1.1  christos 
    379   1.1  christos SEMOPS_INLINE HI
    380   1.1  christos SUBWORDSIHI (SI in, int word)
    381   1.1  christos {
    382   1.1  christos   if (word == 0)
    383   1.1  christos     return (USI) in >> 16;
    384   1.1  christos   else
    385   1.1  christos     return in;
    386   1.1  christos }
    387   1.1  christos 
    388   1.1  christos SEMOPS_INLINE SI
    389   1.1  christos SUBWORDSFSI (SF in)
    390   1.1  christos {
    391   1.1  christos   union { SF in; SI out; } x;
    392   1.1  christos   x.in = in;
    393   1.1  christos   return x.out;
    394   1.1  christos }
    395   1.1  christos 
    396   1.1  christos SEMOPS_INLINE DI
    397   1.1  christos SUBWORDDFDI (DF in)
    398   1.1  christos {
    399   1.1  christos   union { DF in; DI out; } x;
    400   1.1  christos   x.in = in;
    401   1.1  christos   return x.out;
    402   1.1  christos }
    403   1.1  christos 
    404   1.1  christos SEMOPS_INLINE UQI
    405   1.1  christos SUBWORDDIUQI (DI in, int byte)
    406   1.1  christos {
    407   1.1  christos   assert (byte >= 0 && byte <= 7);
    408   1.1  christos   return (UQI) (in >> (8 * (7 - byte)));
    409   1.1  christos }
    410   1.1  christos 
    411   1.1  christos SEMOPS_INLINE SI
    412   1.1  christos SUBWORDDISI (DI in, int word)
    413   1.1  christos {
    414   1.1  christos   if (word == 0)
    415   1.1  christos     return (UDI) in >> 32;
    416   1.1  christos   else
    417   1.1  christos     return in;
    418   1.1  christos }
    419   1.1  christos 
    420   1.1  christos SEMOPS_INLINE SI
    421   1.1  christos SUBWORDDFSI (DF in, int word)
    422   1.1  christos {
    423   1.1  christos   /* Note: typedef UDI DF; */
    424   1.1  christos   if (word == 0)
    425   1.1  christos     return (UDI) in >> 32;
    426   1.1  christos   else
    427   1.1  christos     return in;
    428   1.9  christos }
    429   1.1  christos 
    430   1.1  christos SEMOPS_INLINE SI
    431   1.1  christos SUBWORDXFSI (XF in, int word)
    432   1.1  christos {
    433   1.1  christos   /* Note: typedef struct { SI parts[3]; } XF; */
    434   1.1  christos   union { XF in; SI out[3]; } x;
    435   1.1  christos   x.in = in;
    436   1.1  christos   if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
    437   1.1  christos     return x.out[word];
    438   1.1  christos   else
    439   1.1  christos     return x.out[2 - word];
    440   1.9  christos }
    441   1.1  christos 
    442   1.1  christos SEMOPS_INLINE SI
    443   1.1  christos SUBWORDTFSI (TF in, int word)
    444   1.1  christos {
    445   1.1  christos   /* Note: typedef struct { SI parts[4]; } TF; */
    446   1.1  christos   union { TF in; SI out[4]; } x;
    447   1.1  christos   x.in = in;
    448   1.1  christos   if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
    449   1.1  christos     return x.out[word];
    450   1.1  christos   else
    451   1.1  christos     return x.out[3 - word];
    452   1.1  christos }
    453   1.1  christos 
    454   1.1  christos SEMOPS_INLINE DI
    455   1.1  christos JOINSIDI (SI x0, SI x1)
    456   1.9  christos {
    457   1.1  christos   return MAKEDI (x0, x1);
    458   1.1  christos }
    459   1.1  christos 
    460   1.1  christos SEMOPS_INLINE DF
    461   1.1  christos JOINSIDF (SI x0, SI x1)
    462   1.1  christos {
    463   1.1  christos   union { SI in[2]; DF out; } x;
    464   1.1  christos   if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
    465   1.1  christos     x.in[0] = x0, x.in[1] = x1;
    466   1.1  christos   else
    467   1.9  christos     x.in[1] = x0, x.in[0] = x1;
    468   1.1  christos   return x.out;
    469   1.1  christos }
    470   1.1  christos 
    471   1.1  christos SEMOPS_INLINE XF
    472   1.1  christos JOINSIXF (SI x0, SI x1, SI x2)
    473   1.1  christos {
    474   1.1  christos   union { SI in[3]; XF out; } x;
    475   1.1  christos   if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
    476   1.1  christos     x.in[0] = x0, x.in[1] = x1, x.in[2] = x2;
    477   1.1  christos   else
    478   1.9  christos     x.in[2] = x0, x.in[1] = x1, x.in[0] = x2;
    479   1.1  christos   return x.out;
    480   1.1  christos }
    481   1.1  christos 
    482   1.1  christos SEMOPS_INLINE TF
    483   1.1  christos JOINSITF (SI x0, SI x1, SI x2, SI x3)
    484   1.1  christos {
    485   1.1  christos   union { SI in[4]; TF out; } x;
    486   1.1  christos   if (HOST_BYTE_ORDER == BFD_ENDIAN_BIG)
    487   1.1  christos     x.in[0] = x0, x.in[1] = x1, x.in[2] = x2, x.in[3] = x3;
    488   1.1  christos   else
    489  1.10  christos     x.in[3] = x0, x.in[2] = x1, x.in[1] = x2, x.in[0] = x3;
    490  1.10  christos   return x.out;
    491  1.10  christos }
    492  1.10  christos 
    493  1.10  christos #endif /* SUBWORD,JOIN */
    494  1.10  christos 
    495  1.10  christos /* Semantic support utilities.  */
    497  1.10  christos 
    498  1.10  christos SI ADDCSI (SI, SI, BI);
    499  1.10  christos BI ADDCFSI (SI, SI, BI);
    500  1.10  christos BI ADDOFSI (SI, SI, BI);
    501  1.10  christos SI SUBCSI (SI, SI, BI);
    502  1.10  christos BI SUBCFSI (SI, SI, BI);
    503  1.10  christos BI SUBOFSI (SI, SI, BI);
    504  1.10  christos HI ADDCHI (HI, HI, BI);
    505  1.10  christos BI ADDCFHI (HI, HI, BI);
    506  1.10  christos BI ADDOFHI (HI, HI, BI);
    507  1.10  christos HI SUBCHI (HI, HI, BI);
    508  1.10  christos BI SUBCFHI (HI, HI, BI);
    509  1.10  christos BI SUBOFHI (HI, HI, BI);
    510  1.10  christos QI ADDCQI (QI, QI, BI);
    511  1.10  christos BI ADDCFQI (QI, QI, BI);
    512  1.10  christos BI ADDOFQI (QI, QI, BI);
    513  1.10  christos QI SUBCQI (QI, QI, BI);
    514   1.1  christos BI SUBCFQI (QI, QI, BI);
    515   1.1  christos BI SUBOFQI (QI, QI, BI);
    516   1.1  christos BI MUL1OFSI (USI a, USI b);
    517   1.1  christos BI MUL2OFSI (SI a, SI b);
    518   1.1  christos BI ADDCFDI (DI a, DI b, BI c);
    519   1.1  christos BI ADDOFDI (DI a, DI b, BI c);
    520   1.1  christos BI SUBCFDI (DI a, DI b, BI c);
    521   1.1  christos BI SUBOFDI (DI a, DI b, BI c);
    522   1.1  christos 
    523   1.1  christos #ifdef SEMOPS_DEFINE_INLINE
    524   1.1  christos 
    525   1.1  christos SEMOPS_INLINE SI
    526   1.1  christos ADDCSI (SI a, SI b, BI c)
    527   1.1  christos {
    528   1.1  christos   SI res = ADDSI (a, ADDSI (b, c));
    529   1.1  christos   return res;
    530   1.1  christos }
    531   1.1  christos 
    532   1.1  christos SEMOPS_INLINE BI
    533   1.1  christos ADDCFSI (SI a, SI b, BI c)
    534   1.1  christos {
    535   1.1  christos   SI tmp = ADDSI (a, ADDSI (b, c));
    536   1.1  christos   BI res = ((USI) tmp < (USI) a) || (c && tmp == a);
    537   1.1  christos   return res;
    538   1.1  christos }
    539   1.1  christos 
    540   1.1  christos SEMOPS_INLINE BI
    541   1.1  christos ADDOFSI (SI a, SI b, BI c)
    542   1.1  christos {
    543   1.1  christos   SI tmp = ADDSI (a, ADDSI (b, c));
    544   1.1  christos   BI res = (((a < 0) == (b < 0))
    545   1.1  christos 	    && ((a < 0) != (tmp < 0)));
    546   1.1  christos   return res;
    547   1.1  christos }
    548   1.1  christos 
    549   1.1  christos SEMOPS_INLINE SI
    550   1.1  christos SUBCSI (SI a, SI b, BI c)
    551   1.1  christos {
    552   1.1  christos   SI res = SUBSI (a, ADDSI (b, c));
    553   1.1  christos   return res;
    554   1.1  christos }
    555   1.1  christos 
    556   1.1  christos SEMOPS_INLINE BI
    557   1.1  christos SUBCFSI (SI a, SI b, BI c)
    558   1.1  christos {
    559   1.1  christos   BI res = ((USI) a < (USI) b) || (c && a == b);
    560   1.1  christos   return res;
    561   1.1  christos }
    562   1.1  christos 
    563   1.1  christos SEMOPS_INLINE BI
    564   1.1  christos SUBOFSI (SI a, SI b, BI c)
    565   1.1  christos {
    566   1.1  christos   SI tmp = SUBSI (a, ADDSI (b, c));
    567   1.1  christos   BI res = (((a < 0) != (b < 0))
    568   1.1  christos 	    && ((a < 0) != (tmp < 0)));
    569   1.1  christos   return res;
    570   1.1  christos }
    571   1.1  christos 
    572   1.1  christos SEMOPS_INLINE HI
    573   1.1  christos ADDCHI (HI a, HI b, BI c)
    574   1.1  christos {
    575   1.1  christos   HI res = ADDHI (a, ADDHI (b, c));
    576   1.1  christos   return res;
    577   1.1  christos }
    578   1.1  christos 
    579   1.1  christos SEMOPS_INLINE BI
    580   1.1  christos ADDCFHI (HI a, HI b, BI c)
    581   1.1  christos {
    582   1.1  christos   HI tmp = ADDHI (a, ADDHI (b, c));
    583   1.1  christos   BI res = ((UHI) tmp < (UHI) a) || (c && tmp == a);
    584   1.1  christos   return res;
    585   1.1  christos }
    586   1.1  christos 
    587   1.1  christos SEMOPS_INLINE BI
    588   1.1  christos ADDOFHI (HI a, HI b, BI c)
    589   1.1  christos {
    590   1.1  christos   HI tmp = ADDHI (a, ADDHI (b, c));
    591   1.1  christos   BI res = (((a < 0) == (b < 0))
    592   1.1  christos 	    && ((a < 0) != (tmp < 0)));
    593   1.1  christos   return res;
    594   1.1  christos }
    595   1.1  christos 
    596   1.1  christos SEMOPS_INLINE HI
    597   1.1  christos SUBCHI (HI a, HI b, BI c)
    598   1.1  christos {
    599   1.1  christos   HI res = SUBHI (a, ADDHI (b, c));
    600   1.1  christos   return res;
    601   1.1  christos }
    602   1.1  christos 
    603   1.1  christos SEMOPS_INLINE BI
    604   1.1  christos SUBCFHI (HI a, HI b, BI c)
    605   1.1  christos {
    606   1.1  christos   BI res = ((UHI) a < (UHI) b) || (c && a == b);
    607   1.1  christos   return res;
    608   1.1  christos }
    609   1.1  christos 
    610   1.1  christos SEMOPS_INLINE BI
    611   1.1  christos SUBOFHI (HI a, HI b, BI c)
    612   1.1  christos {
    613   1.1  christos   HI tmp = SUBHI (a, ADDHI (b, c));
    614   1.1  christos   BI res = (((a < 0) != (b < 0))
    615   1.1  christos 	    && ((a < 0) != (tmp < 0)));
    616   1.1  christos   return res;
    617   1.1  christos }
    618   1.1  christos 
    619   1.1  christos SEMOPS_INLINE QI
    620   1.1  christos ADDCQI (QI a, QI b, BI c)
    621   1.1  christos {
    622   1.1  christos   QI res = ADDQI (a, ADDQI (b, c));
    623   1.1  christos   return res;
    624   1.1  christos }
    625   1.1  christos 
    626   1.1  christos SEMOPS_INLINE BI
    627   1.1  christos ADDCFQI (QI a, QI b, BI c)
    628   1.1  christos {
    629   1.1  christos   QI tmp = ADDQI (a, ADDQI (b, c));
    630   1.1  christos   BI res = ((UQI) tmp < (UQI) a) || (c && tmp == a);
    631   1.1  christos   return res;
    632   1.1  christos }
    633   1.1  christos 
    634   1.1  christos SEMOPS_INLINE BI
    635   1.1  christos ADDOFQI (QI a, QI b, BI c)
    636   1.1  christos {
    637   1.1  christos   QI tmp = ADDQI (a, ADDQI (b, c));
    638   1.1  christos   BI res = (((a < 0) == (b < 0))
    639   1.1  christos 	    && ((a < 0) != (tmp < 0)));
    640   1.1  christos   return res;
    641   1.1  christos }
    642   1.1  christos 
    643   1.1  christos SEMOPS_INLINE QI
    644   1.1  christos SUBCQI (QI a, QI b, BI c)
    645   1.1  christos {
    646   1.1  christos   QI res = SUBQI (a, ADDQI (b, c));
    647   1.1  christos   return res;
    648   1.1  christos }
    649   1.1  christos 
    650   1.1  christos SEMOPS_INLINE BI
    651   1.1  christos SUBCFQI (QI a, QI b, BI c)
    652   1.1  christos {
    653   1.1  christos   BI res = ((UQI) a < (UQI) b) || (c && a == b);
    654   1.1  christos   return res;
    655   1.1  christos }
    656   1.1  christos 
    657   1.8  christos SEMOPS_INLINE BI
    658   1.8  christos SUBOFQI (QI a, QI b, BI c)
    659   1.8  christos {
    660   1.8  christos   QI tmp = SUBQI (a, ADDQI (b, c));
    661   1.8  christos   BI res = (((a < 0) != (b < 0))
    662   1.8  christos 	    && ((a < 0) != (tmp < 0)));
    663   1.8  christos   return res;
    664   1.8  christos }
    665   1.8  christos 
    666   1.8  christos SEMOPS_INLINE BI
    667   1.8  christos MUL2OFSI (SI a, SI b)
    668   1.8  christos {
    669   1.8  christos   DI tmp = MULDI (EXTSIDI (a), EXTSIDI (b));
    670   1.8  christos   BI res = tmp < -0x80000000LL || tmp > 0x7fffffffLL;
    671   1.8  christos   return res;
    672   1.8  christos }
    673   1.8  christos 
    674   1.8  christos SEMOPS_INLINE BI
    675   1.8  christos MUL1OFSI (USI a, USI b)
    676   1.8  christos {
    677   1.8  christos   UDI tmp = MULDI (ZEXTSIDI (a), ZEXTSIDI (b));
    678   1.8  christos   BI res = (tmp > 0xFFFFFFFFULL);
    679   1.8  christos   return res;
    680   1.8  christos }
    681   1.8  christos 
    682   1.8  christos SEMOPS_INLINE BI
    683   1.8  christos ADDCFDI (DI a, DI b, BI c)
    684   1.8  christos {
    685   1.8  christos   DI tmp = ADDDI (a, ADDDI (b, c));
    686   1.8  christos   BI res = ((UDI) tmp < (UDI) a) || (c && tmp == a);
    687   1.8  christos   return res;
    688   1.8  christos }
    689   1.8  christos 
    690   1.8  christos SEMOPS_INLINE BI
    691   1.8  christos ADDOFDI (DI a, DI b, BI c)
    692   1.8  christos {
    693   1.8  christos   DI tmp = ADDDI (a, ADDDI (b, c));
    694   1.8  christos   BI res = (((a < 0) == (b < 0))
    695   1.8  christos 	    && ((a < 0) != (tmp < 0)));
    696   1.8  christos   return res;
    697   1.8  christos }
    698   1.8  christos 
    699   1.8  christos SEMOPS_INLINE BI
    700   1.8  christos SUBCFDI (DI a, DI b, BI c)
    701   1.8  christos {
    702   1.8  christos   BI res = ((UDI) a < (UDI) b) || (c && a == b);
    703   1.8  christos   return res;
    704   1.8  christos }
    705   1.1  christos 
    706  1.10  christos SEMOPS_INLINE BI
    707   1.1  christos SUBOFDI (DI a, DI b, BI c)
    708  1.10  christos {
    709   1.1  christos   DI tmp = SUBDI (a, ADDSI (b, c));
    710   1.1  christos   BI res = (((a < 0) != (b < 0))
    711                 	    && ((a < 0) != (tmp < 0)));
    712                   return res;
    713                 }
    714                 
    715                 #endif
    716                 
    717                 extern void cgen_rtx_error (SIM_CPU *, const char *);
    718                 
    719                 #endif /* CGEN_SEM_OPS_H */
    720