00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <alloca.h>
00039 #include "ipa_section.h"
00040 #include "ipa_lno_file.h"
00041 #include "ipa_lno_util.h"
00042 #include "be_util.h"
00043 #include "opt_du.h"
00044
00045 inline mINT32 myabs(mINT32 i)
00046 {
00047 return i < 0 ? -i : i;
00048 }
00049
00050 inline mINT64 myabs(mINT64 i)
00051 {
00052 return i < 0 ? -i : i;
00053 }
00054
00055 INT32 Gcd(mINT32 i, mINT32 j)
00056 {
00057 i = myabs(i);
00058 j = myabs(j);
00059
00060 if (i == 0)
00061 return j;
00062 if (j == 0)
00063 return i;
00064
00065 if (i > j) {
00066 INT32 t = i;
00067 i = j;
00068 j = t;
00069 }
00070
00071 do {
00072 INT32 t = i;
00073 i = j%i;
00074 j = t;
00075 } while (i);
00076
00077 return j;
00078 }
00079
00080 INT64 Gcd(mINT64 i, mINT64 j)
00081 {
00082 i = myabs(i);
00083 j = myabs(j);
00084
00085 if (i == 0)
00086 return j;
00087 if (j == 0)
00088 return i;
00089
00090 if (i > j) {
00091 INT64 t = i;
00092 i = j;
00093 j = t;
00094 }
00095
00096 do {
00097 INT64 t = i;
00098 i = j%i;
00099 j = t;
00100 } while (i);
00101
00102 return j;
00103 }
00104
00105 INT32 Gcd(const mINT32* i, INT cnt)
00106 {
00107 FmtAssert(cnt >= 1, ("vector Gcd() with no args"));
00108
00109 INT32 g = Gcd(mINT32(0), i[0]);
00110 for (INT32 j = 1; j < cnt; j++)
00111 g = Gcd(g, i[j]);
00112 return g;
00113 }
00114
00115 INT64 Gcd(const mINT64* i, INT cnt)
00116 {
00117 FmtAssert(cnt >= 1, ("vector Gcd() with no args"));
00118
00119 INT64 g = Gcd(mINT64(0), i[0]);
00120 for (INT32 j = 1; j < cnt; j++)
00121 g = Gcd(g, i[j]);
00122 return g;
00123 }
00124
00125 INT32 Lcm(mINT32 i, mINT32 j)
00126 {
00127 INT32 g = Gcd(i, j);
00128 return g == 0 ? 0 : myabs(i/g * j);
00129 }
00130
00131 INT64 Lcm(mINT64 i, mINT64 j)
00132 {
00133 INT64 g = Gcd(i, j);
00134 return g == 0 ? 0 : myabs(i/g * j);
00135 }
00136
00137 INT32 Lcm(const mINT32* i, INT cnt)
00138 {
00139 FmtAssert(cnt >= 1, ("vector Lcm() with no args"));
00140
00141 INT32 l = i[0];
00142 for (INT32 j = 1; j < cnt; j++) {
00143 INT32 g = Gcd(l, i[j]);
00144 INT32 tmp = l/g * i[j];
00145 FmtAssert(tmp/i[j] == l/g, ("overflow in Lcm()"));
00146 l = tmp;
00147 }
00148 return myabs(l);
00149 }
00150
00151 INT64 Lcm(const mINT64* i, INT cnt)
00152 {
00153 FmtAssert(cnt >= 1, ("vector Lcm() with no args"));
00154
00155 INT64 l = i[0];
00156 for (INT32 j = 1; j < cnt; j++) {
00157 INT64 g = Gcd(l, i[j]);
00158 INT64 tmp = l/g * i[j];
00159 FmtAssert(tmp/i[j] == l/g, ("overflow in Lcm()"));
00160 l = tmp;
00161 }
00162 return myabs(l);
00163 }
00164