1169689Skan/* Lambda matrix transformations. 2169689Skan Copyright (C) 2003, 2004 Free Software Foundation, Inc. 3169689Skan Contributed by Daniel Berlin <dberlin@dberlin.org>. 4169689Skan 5169689SkanThis file is part of GCC. 6169689Skan 7169689SkanGCC is free software; you can redistribute it and/or modify it under 8169689Skanthe terms of the GNU General Public License as published by the Free 9169689SkanSoftware Foundation; either version 2, or (at your option) any later 10169689Skanversion. 11169689Skan 12169689SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY 13169689SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or 14169689SkanFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15169689Skanfor more details. 16169689Skan 17169689SkanYou should have received a copy of the GNU General Public License 18169689Skanalong with GCC; see the file COPYING. If not, write to the Free 19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan02110-1301, USA. */ 21169689Skan 22169689Skan#include "config.h" 23169689Skan#include "system.h" 24169689Skan#include "coretypes.h" 25169689Skan#include "tm.h" 26169689Skan#include "ggc.h" 27169689Skan#include "tree.h" 28169689Skan#include "target.h" 29169689Skan#include "lambda.h" 30169689Skan 31169689Skan/* Allocate a new transformation matrix. */ 32169689Skan 33169689Skanlambda_trans_matrix 34169689Skanlambda_trans_matrix_new (int colsize, int rowsize) 35169689Skan{ 36169689Skan lambda_trans_matrix ret; 37169689Skan 38169689Skan ret = ggc_alloc (sizeof (*ret)); 39169689Skan LTM_MATRIX (ret) = lambda_matrix_new (rowsize, colsize); 40169689Skan LTM_ROWSIZE (ret) = rowsize; 41169689Skan LTM_COLSIZE (ret) = colsize; 42169689Skan LTM_DENOMINATOR (ret) = 1; 43169689Skan return ret; 44169689Skan} 45169689Skan 46169689Skan/* Return true if MAT is an identity matrix. */ 47169689Skan 48169689Skanbool 49169689Skanlambda_trans_matrix_id_p (lambda_trans_matrix mat) 50169689Skan{ 51169689Skan if (LTM_ROWSIZE (mat) != LTM_COLSIZE (mat)) 52169689Skan return false; 53169689Skan return lambda_matrix_id_p (LTM_MATRIX (mat), LTM_ROWSIZE (mat)); 54169689Skan} 55169689Skan 56169689Skan 57169689Skan/* Compute the inverse of the transformation matrix MAT. */ 58169689Skan 59169689Skanlambda_trans_matrix 60169689Skanlambda_trans_matrix_inverse (lambda_trans_matrix mat) 61169689Skan{ 62169689Skan lambda_trans_matrix inverse; 63169689Skan int determinant; 64169689Skan 65169689Skan inverse = lambda_trans_matrix_new (LTM_ROWSIZE (mat), LTM_COLSIZE (mat)); 66169689Skan determinant = lambda_matrix_inverse (LTM_MATRIX (mat), LTM_MATRIX (inverse), 67169689Skan LTM_ROWSIZE (mat)); 68169689Skan LTM_DENOMINATOR (inverse) = determinant; 69169689Skan return inverse; 70169689Skan} 71169689Skan 72169689Skan 73169689Skan/* Print out a transformation matrix. */ 74169689Skan 75169689Skanvoid 76169689Skanprint_lambda_trans_matrix (FILE *outfile, lambda_trans_matrix mat) 77169689Skan{ 78169689Skan print_lambda_matrix (outfile, LTM_MATRIX (mat), LTM_ROWSIZE (mat), 79169689Skan LTM_COLSIZE (mat)); 80169689Skan} 81