mirror of
https://review.haiku-os.org/buildtools
synced 2025-01-18 20:38:39 +01:00
5873a060ca
* these are dependencies for gcc 4 Graphite engine build. * CLooG 0.18.0 includes ISL 0.11.1 which is the backend that the build script enables. * PPL is needed by GCC build even if it isn't the chosen backend.
214 lines
5.8 KiB
C
214 lines
5.8 KiB
C
/**-------------------------------------------------------------------**
|
|
** CLooG **
|
|
**-------------------------------------------------------------------**
|
|
** cloogmatrix.c **
|
|
**-------------------------------------------------------------------**/
|
|
|
|
|
|
/******************************************************************************
|
|
* CLooG : the Chunky Loop Generator (experimental) *
|
|
******************************************************************************
|
|
* *
|
|
* Copyright (C) 2001-2005 Cedric Bastoul *
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Lesser General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2.1 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* Lesser General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Lesser General Public *
|
|
* License along with this library; if not, write to the Free Software *
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
|
|
* Boston, MA 02110-1301 USA *
|
|
* *
|
|
* CLooG, the Chunky Loop Generator *
|
|
* Written by Cedric Bastoul, Cedric.Bastoul@inria.fr *
|
|
* *
|
|
******************************************************************************/
|
|
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "../include/cloog/cloog.h"
|
|
|
|
/**
|
|
* cloog_matrix_alloc:
|
|
* Allocate a CloogMatrix data structure with NbRows rows and NbColumns columns.
|
|
* All values are initialized to 0.
|
|
* This method returns a pointer to the data structure if successful or a NULL
|
|
* pointer otherwise.
|
|
*/
|
|
CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns)
|
|
{
|
|
CloogMatrix *matrix;
|
|
cloog_int_t **p, *q;
|
|
int i, j;
|
|
|
|
matrix = (CloogMatrix *)malloc(sizeof(CloogMatrix));
|
|
|
|
if (!matrix)
|
|
return NULL;
|
|
|
|
matrix->NbRows = NbRows;
|
|
matrix->NbColumns = NbColumns;
|
|
|
|
if (!NbRows || !NbColumns) {
|
|
matrix->p = NULL;
|
|
matrix->p_Init = NULL;
|
|
return matrix;
|
|
}
|
|
|
|
p = (cloog_int_t **)malloc(NbRows * sizeof(cloog_int_t *));
|
|
|
|
if (p == NULL) {
|
|
free (matrix);
|
|
return NULL;
|
|
}
|
|
|
|
q = (cloog_int_t *)malloc(NbRows * NbColumns * sizeof(cloog_int_t));
|
|
|
|
if (q == NULL) {
|
|
free (matrix);
|
|
free (p);
|
|
return NULL;
|
|
}
|
|
|
|
matrix->p = p;
|
|
matrix->p_Init = q;
|
|
|
|
for (i = 0; i < NbRows; i++) {
|
|
*p++ = q;
|
|
for (j = 0; j < NbColumns; j++) {
|
|
cloog_int_init(*(q+j));
|
|
cloog_int_set_si(*(q+j), 0);
|
|
}
|
|
q += NbColumns;
|
|
}
|
|
|
|
return matrix;
|
|
}
|
|
|
|
/**
|
|
* cloog_matrix_free:
|
|
* Free matrix.
|
|
*/
|
|
void cloog_matrix_free(CloogMatrix * matrix)
|
|
{
|
|
int i;
|
|
cloog_int_t *p;
|
|
int size = matrix->NbRows * matrix->NbColumns;
|
|
|
|
p = matrix->p_Init;
|
|
|
|
for (i = 0; i < size; i++)
|
|
cloog_int_clear(*p++);
|
|
|
|
if (matrix) {
|
|
free(matrix->p_Init);
|
|
free(matrix->p);
|
|
free(matrix);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Print the elements of CloogMatrix M to file, with each row prefixed
|
|
* by prefix and suffixed by suffix.
|
|
*/
|
|
void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
|
|
const char *prefix, const char *suffix)
|
|
{
|
|
int i, j;
|
|
|
|
for (i = 0; i < M->NbRows; ++i) {
|
|
fprintf(file, "%s", prefix);
|
|
for (j = 0; j < M->NbColumns; ++j) {
|
|
cloog_int_print(file, M->p[i][j]);
|
|
fprintf(file, " ");
|
|
}
|
|
fprintf(file, "%s\n", suffix);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* cloog_matrix_print function:
|
|
* This function prints the content of a CloogMatrix structure (matrix) into a
|
|
* file (foo, possibly stdout).
|
|
*/
|
|
void cloog_matrix_print(FILE* foo, CloogMatrix* m)
|
|
{
|
|
if (!m)
|
|
fprintf(foo, "(null)\n");
|
|
|
|
fprintf(foo, "%d %d\n", m->NbRows, m->NbColumns);
|
|
cloog_matrix_print_structure(foo, m, "", "");
|
|
fflush(foo);
|
|
}
|
|
|
|
|
|
static char *next_line(FILE *input, char *line, unsigned len)
|
|
{
|
|
char *p;
|
|
|
|
do {
|
|
if (!(p = fgets(line, len, input)))
|
|
return NULL;
|
|
while (isspace(*p) && *p != '\n')
|
|
++p;
|
|
} while (*p == '#' || *p == '\n');
|
|
|
|
return p;
|
|
}
|
|
|
|
CloogMatrix *cloog_matrix_read(FILE *input)
|
|
{
|
|
unsigned n_row, n_col;
|
|
char line[1024];
|
|
|
|
if (!next_line(input, line, sizeof(line)))
|
|
cloog_die("Input error.\n");
|
|
if (sscanf(line, "%u %u", &n_row, &n_col) != 2)
|
|
cloog_die("Input error.\n");
|
|
|
|
return cloog_matrix_read_of_size(input, n_row, n_col);
|
|
}
|
|
|
|
/**
|
|
* Read a matrix in PolyLib format from input.
|
|
*/
|
|
CloogMatrix *cloog_matrix_read_of_size(FILE *input,
|
|
unsigned n_row, unsigned n_col)
|
|
{
|
|
CloogMatrix *M;
|
|
int i, j;
|
|
char line[1024];
|
|
char val[1024];
|
|
char *p;
|
|
|
|
M = cloog_matrix_alloc(n_row, n_col);
|
|
if (!M)
|
|
cloog_die("memory overflow.\n");
|
|
for (i = 0; i < n_row; ++i) {
|
|
int offset;
|
|
int n;
|
|
|
|
p = next_line(input, line, sizeof(line));
|
|
if (!p)
|
|
cloog_die("Input error.\n");
|
|
for (j = 0; j < n_col; ++j) {
|
|
n = sscanf(p, "%s%n", val, &offset);
|
|
if (!n)
|
|
cloog_die("Input error.\n");
|
|
cloog_int_read(M->p[i][j], val);
|
|
p += offset;
|
|
}
|
|
}
|
|
|
|
return M;
|
|
}
|