Changes between Version 29 and Version 30 of ReplacingGMPNotes


Ignore:
Timestamp:
Sep 20, 2006 7:15:21 PM (8 years ago)
Author:
guest
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ReplacingGMPNotes

    v29 v30  
    114114} 
    115115#endif 
     116 
     117/* skip some code */ 
     118 
     119 
     120#ifdef THREADED_RTS 
     121#define FETCH_MP_TEMP(X) \ 
     122W_ X; \ 
     123X = BaseReg + (OFFSET_StgRegTable_r ## X); 
     124#else 
     125#define FETCH_MP_TEMP(X) /* Nothing */ 
     126#endif 
     127 
     128#define GMP_TAKE2_RET1(name,mp_fun)                                     \ 
     129name                                                                    \ 
     130{                                                                       \ 
     131  CInt s1, s2;                                                          \ 
     132  W_ d1, d2;                                                            \ 
     133  FETCH_MP_TEMP(mp_tmp1);                                               \ 
     134  FETCH_MP_TEMP(mp_tmp2);                                               \ 
     135  FETCH_MP_TEMP(mp_result1)                                             \ 
     136  FETCH_MP_TEMP(mp_result2);                                            \ 
     137                                                                        \ 
     138  /* call doYouWantToGC() */                                            \ 
     139  MAYBE_GC(R2_PTR & R4_PTR, name);                                      \ 
     140                                                                        \ 
     141  s1 = W_TO_INT(R1);                                                    \ 
     142  d1 = R2;                                                              \ 
     143  s2 = W_TO_INT(R3);                                                    \ 
     144  d2 = R4;                                                              \ 
     145                                                                        \ 
     146  MP_INT__mp_alloc(mp_tmp1) = W_TO_INT(StgArrWords_words(d1));          \ 
     147  MP_INT__mp_size(mp_tmp1)  = (s1);                                     \ 
     148  MP_INT__mp_d(mp_tmp1)     = BYTE_ARR_CTS(d1);                         \ 
     149  MP_INT__mp_alloc(mp_tmp2) = W_TO_INT(StgArrWords_words(d2));          \ 
     150  MP_INT__mp_size(mp_tmp2)  = (s2);                                     \ 
     151  MP_INT__mp_d(mp_tmp2)     = BYTE_ARR_CTS(d2);                         \ 
     152                                                                        \ 
     153  foreign "C" __gmpz_init(mp_result1 "ptr") [];                            \ 
     154                                                                        \ 
     155  /* Perform the operation */                                           \ 
     156  foreign "C" mp_fun(mp_result1 "ptr",mp_tmp1  "ptr",mp_tmp2  "ptr") []; \ 
     157                                                                        \ 
     158  RET_NP(TO_W_(MP_INT__mp_size(mp_result1)),                            \ 
     159         MP_INT__mp_d(mp_result1) - SIZEOF_StgArrWords);                \ 
     160} 
    116161}}} 
    117 should be obvious.  There are at least two possible alternatives to this: 
     162results from initialising each struct ({{{mp_tmp2}}}, etc.) on each call, in order to convert the data from the {{{J# Int# ByteArray#}}} in the RTS to the GMP structure before passing it to GMP.  There are at least two possible alternatives to this: 
    118163   (a) wrap the replacement MP-library array/structure for arbitrary precision integers in a closure so you do not have to rebuild the struct from on each MP-library call; or 
    119164