1226645Sattilio/* Lambda matrix transformations.
2246726Sattilio   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3226930Sjeff   Contributed by Daniel Berlin <dberlin@dberlin.org>.
4226645Sattilio
5226645SattilioThis file is part of GCC.
6226645Sattilio
7226645SattilioGCC is free software; you can redistribute it and/or modify it under
8226645Sattiliothe terms of the GNU General Public License as published by the Free
9226645SattilioSoftware Foundation; either version 2, or (at your option) any later
10226645Sattilioversion.
11226645Sattilio
12226645SattilioGCC is distributed in the hope that it will be useful, but WITHOUT ANY
13226645SattilioWARRANTY; without even the implied warranty of MERCHANTABILITY or
14226645SattilioFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15226645Sattiliofor more details.
16226645Sattilio
17226645SattilioYou should have received a copy of the GNU General Public License
18226645Sattilioalong with GCC; see the file COPYING.  If not, write to the Free
19226645SattilioSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20226645Sattilio02110-1301, USA.  */
21226645Sattilio
22226645Sattilio#include "config.h"
23226645Sattilio#include "system.h"
24226645Sattilio#include "coretypes.h"
25226645Sattilio#include "tm.h"
26226645Sattilio#include "ggc.h"
27226645Sattilio#include "tree.h"
28226645Sattilio#include "target.h"
29226645Sattilio#include "lambda.h"
30226645Sattilio
31246726Sattilio/* Allocate a new transformation matrix.  */
32246726Sattilio
33246726Sattiliolambda_trans_matrix
34246726Sattiliolambda_trans_matrix_new (int colsize, int rowsize)
35246726Sattilio{
36246726Sattilio  lambda_trans_matrix ret;
37246726Sattilio
38248424Sattilio  ret = ggc_alloc (sizeof (*ret));
39248424Sattilio  LTM_MATRIX (ret) = lambda_matrix_new (rowsize, colsize);
40248424Sattilio  LTM_ROWSIZE (ret) = rowsize;
41248424Sattilio  LTM_COLSIZE (ret) = colsize;
42248424Sattilio  LTM_DENOMINATOR (ret) = 1;
43248424Sattilio  return ret;
44248424Sattilio}
45248424Sattilio
46248424Sattilio/* Return true if MAT is an identity matrix.  */
47248424Sattilio
48248424Sattiliobool
49226645Sattiliolambda_trans_matrix_id_p (lambda_trans_matrix mat)
50226645Sattilio{
51226645Sattilio  if (LTM_ROWSIZE (mat) != LTM_COLSIZE (mat))
52248448Sattilio    return false;
53226645Sattilio  return lambda_matrix_id_p (LTM_MATRIX (mat), LTM_ROWSIZE (mat));
54246726Sattilio}
55246726Sattilio
56226645Sattilio
57226645Sattilio/* Compute the inverse of the transformation matrix MAT.  */
58226645Sattilio
59246840Sattiliolambda_trans_matrix
60246726Sattiliolambda_trans_matrix_inverse (lambda_trans_matrix mat)
61226873Sattilio{
62226645Sattilio  lambda_trans_matrix inverse;
63226876Sjeff  int determinant;
64226873Sattilio
65226645Sattilio  inverse = lambda_trans_matrix_new (LTM_ROWSIZE (mat), LTM_COLSIZE (mat));
66226645Sattilio  determinant = lambda_matrix_inverse (LTM_MATRIX (mat), LTM_MATRIX (inverse),
67246726Sattilio				       LTM_ROWSIZE (mat));
68246726Sattilio  LTM_DENOMINATOR (inverse) = determinant;
69246726Sattilio  return inverse;
70226645Sattilio}
71233034Sattilio
72247771Salc
73247771Salc/* Print out a transformation matrix.  */
74247771Salc
75233034Sattiliovoid
76246726Sattilioprint_lambda_trans_matrix (FILE *outfile, lambda_trans_matrix mat)
77246726Sattilio{
78233034Sattilio  print_lambda_matrix (outfile, LTM_MATRIX (mat), LTM_ROWSIZE (mat),
79246726Sattilio		       LTM_COLSIZE (mat));
80233034Sattilio}
81233034Sattilio