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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "defs.h"
00062 #include "errors.h"
00063 #include "util.h"
00064 #include "tracing.h"
00065 #include "topcode.h"
00066 #include "wn.h"
00067 #include "opcode.h"
00068 #include "config_targ.h"
00069 #include "targ_isa_lits.h"
00070 #include "betarget.h"
00071 #include "w2op.h"
00072 #include "config_wopt.h"
00073
00074 BOOL Targ_Lower_Float_To_Unsigned = FALSE;
00075 BOOL Targ_Lower_Unsigned_To_Float = FALSE;
00076
00077
00078 INT Max_Small_Frame_Offset = 0x7fffffff;
00079
00080
00081
00082 TOP
00083 OPCODE_To_TOP (OPCODE opcode)
00084 {
00085 OPERATOR opr = OPCODE_operator (opcode);
00086 TYPE_ID rtype = OPCODE_rtype (opcode);
00087 TYPE_ID desc = OPCODE_desc (opcode);
00088
00089 switch (opr) {
00090 case OPR_PARM:
00091 return TOP_noop;
00092 default:
00093 return TOP_UNDEFINED;
00094 }
00095 }
00096
00097
00098
00099 TOP
00100 TAS_To_TOP (WN *tas_wn)
00101 {
00102 TYPE_ID kid_mtype = WN_rtype(WN_kid0(tas_wn));
00103
00104 switch (WN_opcode(tas_wn)) {
00105 case OPC_I8TAS:
00106 case OPC_U8TAS:
00107 return MTYPE_float(kid_mtype) ? TOP_mov_b64_f2i : TOP_nop;
00108 case OPC_I4TAS:
00109 case OPC_U4TAS:
00110 return MTYPE_float(kid_mtype) ? TOP_mov_b32_f2i : TOP_nop;
00111 case OPC_F8TAS:
00112 return MTYPE_float(kid_mtype) ? TOP_nop : TOP_mov_b64_i2f;
00113 case OPC_F4TAS:
00114 return MTYPE_float(kid_mtype) ? TOP_nop : TOP_mov_b32_i2f;
00115 default:
00116 return TOP_UNDEFINED;
00117 }
00118 }
00119
00120
00121
00122 #define IS_POWER_OF_2(val) ((val != 0) && ((val & (val-1)) == 0))
00123
00124 static BOOL Is_Power_Of_2(INT64 val, TYPE_ID mtype)
00125 {
00126 if (MTYPE_is_signed(mtype) && val < 0)
00127 val= -val;
00128
00129 if (mtype == MTYPE_U4)
00130 val &= 0xffffffffull;
00131
00132 return IS_POWER_OF_2(val);
00133 }
00134
00135
00136 extern BOOL
00137 Can_Do_Fast_Divide (TYPE_ID mtype, INT64 dividend)
00138 {
00139 if (Is_Power_Of_2(dividend, mtype)) {
00140 return TRUE;
00141 }
00142 return FALSE;
00143 }
00144
00145
00146 extern BOOL
00147 Can_Do_Fast_Remainder (TYPE_ID mtype, INT64 dividend)
00148 {
00149 if (Is_Power_Of_2(dividend, mtype)) {
00150 return TRUE;
00151 }
00152 return FALSE;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 extern INT
00170 Multiply_Limit( BOOL is_64bit, INT64 val)
00171 {
00172 INT limit = 0;
00173
00174 return limit;
00175 }
00176
00177 extern INT
00178 Divide_Limit ( BOOL is_64bit)
00179 {
00180 INT limit = 0;
00181 return ( limit );
00182 }
00183
00184
00185
00186
00187 static INT
00188 Count_Multiply_Shifts (TARG_UINT constant)
00189 {
00190 switch (constant) {
00191 case 0:
00192 case 1:
00193 case 2:
00194 return 1;
00195 default:
00196 if ((constant % 2) == 1) {
00197 if ((constant & 2) != 0)
00198 return 1 + Count_Multiply_Shifts (constant+1);
00199 else
00200 return 1 + Count_Multiply_Shifts (constant-1);
00201 }
00202 else {
00203 while ((constant % 2) == 0) {
00204 constant = (TARG_UINT)constant >> 1;
00205 }
00206 if (constant == 1)
00207 return 1;
00208 else
00209 return 1 + Count_Multiply_Shifts (constant);
00210 }
00211 }
00212 }
00213
00214
00215
00216 extern BOOL
00217 Can_Do_Fast_Multiply (TYPE_ID mtype, INT64 val)
00218 {
00219 #define MULTIPLICATION_LATENCY_32_BIT 2
00220 #define MULTIPLICATION_LATENCY_64_BIT 3
00221
00222 INT num_ops = 4;
00223 BOOL neg = FALSE;
00224
00225 if (OPT_Space) return FALSE;
00226
00227 return FALSE;
00228 }
00229
00230
00231
00232
00233 INT Copy_Quantum_Ratio(void)
00234 {
00235 INT32 ratio;
00236
00237
00238
00239 switch(Target) {
00240 case TARGET_opteron: ratio= 4; break;
00241 default: ratio= 4; break;
00242 }
00243
00244 return ratio;
00245 }
00246
00247
00248
00249 inline BOOL Is_Signed_Bits(INT64 val, INT bits)
00250 {
00251 INT64 hibit = 1LL << (bits - 1);
00252 return val >= -hibit && val <= (hibit - 1);
00253 }
00254
00255
00256
00257
00258 inline BOOL Is_Unsigned_Bits(UINT64 val, INT bits)
00259 {
00260 return val < (1ULL << bits);
00261 }
00262
00263
00264
00265
00266 BOOL Can_Be_Immediate(OPERATOR opr,
00267 INT64 val,
00268 TYPE_ID dtype,
00269 INT whichkid,
00270 ST *stid_st)
00271 {
00272
00273 return TRUE;
00274 }
00275
00276 #ifdef TARG_NVISA
00277
00278
00279 BOOL Can_Be_Float_Immediate(TYPE_ID mtype)
00280 {
00281 if (MTYPE_bit_size(mtype) >= WOPT_Const_PRE_Float_Size)
00282 return FALSE;
00283
00284 return TRUE;
00285 }
00286 #endif