Changes between Version 29 and Version 30 of ReplacingGMPNotes


Ignore:
Timestamp:
Sep 20, 2006 7:15:21 PM (9 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