Changes between Version 45 and Version 46 of ReplacingGMPNotes


Ignore:
Timestamp:
Jan 6, 2007 3:17:11 AM (7 years ago)
Author:
p_tanski
Comment:

more color experiments

Legend:

Unmodified
Added
Removed
Modified
  • ReplacingGMPNotes

    v45 v46  
    189189Related to replacing GMP, some operations in CgPrimOP.hs such as IntAddCOp may benefit from operations defined in a replacement MP library (or, more generally, simple optimisation).  For example: 
    190190{{{ 
    191  
    192 emitPrimOp [res_r,res_c] IntAddCOp [aa,bb] live 
    193 {-  
    194    With some bit-twiddling, we can define int{Add,Sub}Czh portably in 
    195    C, and without needing any comparisons.  This may not be the 
    196    fastest way to do it - if you have better code, please send it! --SDM 
    197    
    198    Return : r = a + b,  c = 0 if no overflow, 1 on overflow. 
    199    
    200    We currently don't make use of the r value if c is != 0 (i.e.  
    201    overflow), we just convert to big integers and try again.  This 
    202    could be improved by making r and c the correct values for 
    203    plugging into a new J#.   
    204     
    205    { r = ((I_)(a)) + ((I_)(b));                                 \ 
    206      c = ((StgWord)(~(((I_)(a))^((I_)(b))) & (((I_)(a))^r)))    \ 
    207          >> (BITS_IN (I_) - 1);                                 \ 
    208    }  
    209    Wading through the mass of bracketry, it seems to reduce to: 
    210    c = ( (~(a^b)) & (a^r) ) >>unsigned (BITS_IN(I_)-1) 
    211  
    212 -} 
    213    = stmtsC [ 
    214         CmmAssign res_r (CmmMachOp mo_wordAdd [aa,bb]), 
    215         CmmAssign res_c $ 
    216           CmmMachOp mo_wordUShr [ 
    217                 CmmMachOp mo_wordAnd [ 
    218                     CmmMachOp mo_wordNot [CmmMachOp mo_wordXor [aa,bb]], 
    219                     CmmMachOp mo_wordXor [aa, CmmReg res_r] 
    220                 ],  
    221                 CmmLit (mkIntCLit (wORD_SIZE_IN_BITS - 1)) 
    222           ] 
    223      ] 
     191#!html 
     192<pre><font color=Orange>emitPrimOp</font> <font color=Blue>[</font><font color=Black>res_r</font><font color=Blue>,</font><font color=Black>res_c</font><font color=Blue>]</font> <font color=Green>IntAddCOp</font> <font color=Blue>[</font><font color=Black>aa</font><font color=Blue>,</font><font color=Black>bb</font><font color=Blue>]</font> <font color=Black>live</font> 
     193<font color=Red>{-                                                                               
     194   With some bit-twiddling, we can define int{Add,Sub}Czh portably in            
     195   C, and without needing any comparisons.  This may not be the                  
     196   fastest way to do it - if you have better code, please send it! --SDM         
     197                                                                                 
     198   Return : r = a + b,  c = 0 if no overflow, 1 on overflow.                     
     199                                                                                 
     200   We currently don't make use of the r value if c is != 0 (i.e.                 
     201   overflow), we just convert to big integers and try again.  This               
     202   could be improved by making r and c the correct values for                    
     203   plugging into a new J#.                                                       
     204                                                                                 
     205        { r = ((I_)(a)) + ((I_)(b));\                                            
     206        c = ((StgWord)(~(((I_)(a))^((I_)(b))) &amp; (((I_)(a))^r)))\                 
     207        &gt;&gt; (BITS_IN (I_) - 1);\                                                  
     208   }                                                                             
     209   Wading through the mass of bracketry, it seems to reduce to:                  
     210   c = ( (~(a^b)) &amp; (a^r) ) &gt;&gt;unsigned (BITS_IN(I_)-1)                           
     211                                                                                 
     212-}</font> 
     213   <font color=Blue>=</font> <font color=Black>stmtsC</font> <font color=Blue>[</font> 
     214        <font color=Green>CmmAssign</font> <font color=Black>res_r</font> <font color=Blue>(</font><font color=Green>CmmMachOp</font> <font color=Black>mo_wordAdd</font> <font color=Blue>[</font><font color=Black>aa</font><font color=Blue>,</font><font color=Black>bb</font><font color=Blue>]</font><font color=Blue>)</font><font color=Blue>,</font> 
     215        <font color=Green>CmmAssign</font> <font color=Black>res_c</font> <font color=Green>$</font> 
     216          <font color=Green>CmmMachOp</font> <font color=Black>mo_wordUShr</font> <font color=Blue>[</font> 
     217                        <font color=Green>CmmMachOp</font> <font color=Black>mo_wordAnd</font> <font color=Blue>[</font> 
     218                          <font color=Green>CmmMachOp</font> <font color=Black>mo_wordNot</font> <font color=Blue>[</font><font color=Green>CmmMachOp</font> <font color=Black>mo_wordXor</font> <font color=Blue>[</font><font color=Black>aa</font><font color=Blue>,</font><font color=Black>bb</font><font color=Blue>]</font><font color=Blue>]</font><font color=Blue>,</font> 
     219                          <font color=Green>CmmMachOp</font> <font color=Black>mo_wordXor</font> <font color=Blue>[</font><font color=Black>aa</font><font color=Blue>,</font> <font color=Green>CmmReg</font> <font color=Black>res_r</font><font color=Blue>]</font> 
     220                                             <font color=Blue>]</font><font color=Blue>,</font>  
     221                        <font color=Green>CmmLit</font> <font color=Blue>(</font><font color=Black>mkIntCLit</font> <font color=Blue>(</font><font color=Black>wORD_SIZE_IN_BITS</font> <font color=Red>-</font> <font color=Cyan>1</font><font color=Blue>)</font><font color=Blue>)</font> 
     222                                <font color=Blue>]</font> 
     223           <font color=Blue>]</font></pre> 
    224224}}} 
    225225If an integer add were to overflow here, the addition operation would be performed ''twice''; even if the integer add did not overflow one extra operation is performed.  Is this an acceptable price for no comparisons?