Bonjour à tous et à toutes,

J'ai actuellement besoin d'une fonction qui me permette de remplir un bloc mémoire avec des entiers de type int.

Étant un habitué de la SDL, je connaissait l'existence de la fonction SDL_FillRect, pour colorier un rectangle et je me suis dit que ce code source de cette fonction m'apporterais peut-être quelquechose.

Après de nombreuses recherches, je suis tombé sur la fonction memset, mais qui ne permet de faire ceci qu'avec des char.

Mais sur le code source de la SDL, je suis tombé sur la fonction SDL_memset4 qui permet de faire exactement ce que je veux.

Je vous livre le code issu des sources de la SDL :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
#ifdef __cplusplus
#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression)
#define SDL_static_cast(type, expression) static_cast<type>(expression)
#else
#define SDL_reinterpret_cast(type, expression) ((type)(expression))
#define SDL_static_cast(type, expression) ((type)(expression))
#endif
 
typedef uint32_t    Uint32;
 
#if defined(__GNUC__) && defined(i386)
#define SDL_memset4(dst, val, len)              \
do {                                \
    int u0, u1, u2;                     \
    __asm__ __volatile__ (                  \
        "cld\n\t"                   \
        "rep ; stosl\n\t"               \
        : "=&D" (u0), "=&a" (u1), "=&c" (u2)        \
        : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len))  \
        : "memory" );                   \
} while(0)
#endif
#ifndef SDL_memset4
#define SDL_memset4(dst, val, len)      \
do {                        \
    unsigned _count = (len);        \
    unsigned _n = (_count + 3) / 4;     \
    Uint32 *_p = SDL_static_cast(Uint32 *, dst);    \
    Uint32 _val = (val);            \
    if (len == 0) break;            \
        switch (_count % 4) {           \
        case 0: do {    *_p++ = _val;       \
        case 3:         *_p++ = _val;       \
        case 2:         *_p++ = _val;       \
        case 1:         *_p++ = _val;       \
        } while ( --_n );       \
    }                   \
} while(0)
#endif
Et je vous donne le code que j'ai fabriqué avec ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
void memset4(int *dst, int val, int len)
{
     __asm__ __volatile__ (
       "cld\n\t"
        "rep ; stosl\n\t"
    : "=&D" (val), "=&a" (val), "=&c" (val)
            : "0" (dst), "1" (val), "2" (len)
            : "memory" );
}

Donc la question est : mon code marche et même très bien, mais je voudrais savoir si les deux codes sont globalement équivalent ou non.

De plus les quelques modifications sont elles justes ? (supprimer u0, u1 et u2, modifier des types, supprimer les defines, le while(0))

De plus si quelqu'un peut m'expliquer quelque peu ce code...

Enfin, ais-je le droit de le réutiliser librement ?

Merci d'avance pour vos réponses