File: GB_macrofy_masker.c

package info (click to toggle)
suitesparse 1%3A7.10.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 254,920 kB
  • sloc: ansic: 1,134,743; cpp: 46,133; makefile: 4,875; fortran: 2,087; java: 1,826; sh: 996; ruby: 725; python: 495; asm: 371; sed: 166; awk: 44
file content (157 lines) | stat: -rw-r--r-- 6,353 bytes parent folder | download
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//------------------------------------------------------------------------------
// GB_macrofy_masker: construct all macros for masker methods
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//------------------------------------------------------------------------------

#include "GB.h"
#include "jitifyer/GB_stringify.h"

void GB_macrofy_masker          // construct all macros for GrB_eWise
(
    // output:
    FILE *fp,                   // target file to write, already open
    // input:
    uint64_t method_code,
    GrB_Type rtype
)
{

    //--------------------------------------------------------------------------
    // extract the masker method_code
    //--------------------------------------------------------------------------

    // R, C, M, Z: 32/64 bits (3 hex digits)
    bool Rp_is_32   = GB_RSHIFT (method_code, 31, 1) ;
    bool Rj_is_32   = GB_RSHIFT (method_code, 30, 1) ;
    bool Ri_is_32   = GB_RSHIFT (method_code, 29, 1) ;

    bool Cp_is_32   = GB_RSHIFT (method_code, 28, 1) ;
    bool Cj_is_32   = GB_RSHIFT (method_code, 27, 1) ;
    bool Ci_is_32   = GB_RSHIFT (method_code, 26, 1) ;

    bool Mp_is_32   = GB_RSHIFT (method_code, 25, 1) ;
    bool Mj_is_32   = GB_RSHIFT (method_code, 24, 1) ;
    bool Mi_is_32   = GB_RSHIFT (method_code, 23, 1) ;

    bool Zp_is_32   = GB_RSHIFT (method_code, 22, 1) ;
    bool Zj_is_32   = GB_RSHIFT (method_code, 21, 1) ;
    bool Zi_is_32   = GB_RSHIFT (method_code, 20, 1) ;

    // C and Z iso properties (1 hex digit)
    // unused: 2 bits
    int C_iso       = GB_RSHIFT (method_code, 17, 1) ;
    int Z_iso       = GB_RSHIFT (method_code, 16, 1) ;

    // mask (1 hex digit)
    int mask_ecode  = GB_RSHIFT (method_code, 12, 4) ;

    // type of R (1 hex digit)
//  int rcode       = GB_RSHIFT (method_code,  8, 4) ;

    // formats of R, M, C, and Z (2 hex digits)
    int rsparsity   = GB_RSHIFT (method_code,  6, 2) ;
    int csparsity   = GB_RSHIFT (method_code,  4, 2) ;
    int msparsity   = GB_RSHIFT (method_code,  2, 2) ;
    int zsparsity   = GB_RSHIFT (method_code,  0, 2) ;

    //--------------------------------------------------------------------------
    // construct the macros for the values of R
    //--------------------------------------------------------------------------

    fprintf (fp, "// masker: %s\n", (rtype == NULL) ? "" : rtype->name) ;
    if (rtype != NULL)
    { 

        //----------------------------------------------------------------------
        // construct the typedefs
        //----------------------------------------------------------------------

        GB_macrofy_typedefs (fp, rtype, NULL, NULL, NULL, NULL, NULL) ;
        GB_macrofy_type (fp, "R", "_", rtype->name) ;

        //----------------------------------------------------------------------
        // macros for copying entries into R
        //----------------------------------------------------------------------

        // copy a single value from C to R
        fprintf (fp, "#define GB_COPY_C_TO_R(Rx,pR,Cx,pC,C_iso,rsize) "
            "Rx [pR] = Cx [%s]\n", C_iso ? "0" : "pC") ;

        // copy a single value from Z to R
        fprintf (fp, "#define GB_COPY_Z_TO_R(Rx,pR,Zx,pZ,Z_iso,rsize) "
            "Rx [pR] = Zx [%s]\n", Z_iso ? "0" : "pZ") ;

        // copy a range of values from C to R
        fprintf (fp,
            "#define GB_COPY_C_TO_R_RANGE(Rx,pR,Cx,pC,C_iso,rsize,cjnz) \\\n"
            "{                                                          \\\n") ;
        if (C_iso)
        { 
            fprintf (fp,
            "    for (int64_t k = 0 ; k < cjnz ; k++)                   \\\n"
            "    {                                                      \\\n"
            "        Rx [pR+k] = Cx [0] ;                               \\\n"
            "    }                                                      \\\n") ;
        }
        else
        { 
            fprintf (fp,
            "    /* Rx [pR:pR+cjnz-1] = Cx [pC:pC+cjnz-1] */            \\\n"
            "    memcpy (Rx +(pR), Cx +(pC), (cjnz)*rsize) ;            \\\n") ;
        }
        fprintf (fp, "}\n") ;

        // copy a range of values from Z to R
        fprintf (fp,
            "#define GB_COPY_Z_TO_R_RANGE(Rx,pR,Zx,pZ,Z_iso,rsize,zjnz) \\\n"
            "{                                                          \\\n") ;
        if (Z_iso)
        { 
            fprintf (fp,
            "    for (int64_t k = 0 ; k < zjnz ; k++)                   \\\n"
            "    {                                                      \\\n"
            "        Rx [pR+k] = Zx [0] ;                               \\\n"
            "    }                                                      \\\n") ;
        }
        else
        { 
            fprintf (fp,
            "    /* Rx [pR:pR+zjnz-1] = Zx [pZ:pZ+zjnz-1] */            \\\n"
            "    memcpy (Rx +(pR), Zx +(pZ), (zjnz)*rsize) ;            \\\n") ;
        }
        fprintf (fp, "}\n") ;
    }

    GB_macrofy_sparsity (fp, "R", rsparsity) ;
    GB_macrofy_nvals (fp, "R", rsparsity, false) ;
    fprintf (fp, "#define GB_R_ISO 0\n") ;
    GB_macrofy_bits (fp, "R", Rp_is_32, Rj_is_32, Ri_is_32) ;

    //--------------------------------------------------------------------------
    // construct the macros for C, M, and Z
    //--------------------------------------------------------------------------

    GB_macrofy_sparsity (fp, "C", csparsity) ;
    GB_macrofy_nvals (fp, "C", csparsity, C_iso) ;
    fprintf (fp, "#define GB_C_ISO %d\n", C_iso) ;
    GB_macrofy_bits (fp, "C", Cp_is_32, Cj_is_32, Ci_is_32) ;

    GB_macrofy_mask (fp, mask_ecode, "M", msparsity,
        Mp_is_32, Mj_is_32, Mi_is_32) ;

    GB_macrofy_sparsity (fp, "Z", zsparsity) ;
    GB_macrofy_nvals (fp, "Z", zsparsity, Z_iso) ;
    fprintf (fp, "#define GB_Z_ISO %d\n", Z_iso) ;
    GB_macrofy_bits (fp, "Z", Zp_is_32, Zj_is_32, Zi_is_32) ;

    //--------------------------------------------------------------------------
    // include the final default definitions
    //--------------------------------------------------------------------------

    fprintf (fp, "\n#include \"include/GB_masker_shared_definitions.h\"\n") ;
}