Deleted Added
sdiff udiff text old ( 5091:662c1d7b4795 ) new ( 5093:7f20bc69fda5 )
full compact
1// Copyright (c) 2006-2007 The Regents of The University of Michigan
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met: redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer;
8// redistributions in binary form must reproduce the above copyright

--- 179 unchanged lines hidden (view full) ---

188 Rd.udw = 0x7FFFFFFF;
189 else if((int64_t)Rd.udw <= std::numeric_limits<int32_t>::min())
190 Rd.udw = ULL(0xFFFFFFFF80000000);
191 }
192 }});
193 }
194 format IntOpCc {
195 0x10: addcc({{
196 int64_t resTemp, val2 = Rs2_or_imm13;
197 Rd = resTemp = Rs1 + val2;}},
198 {{(Rs1<31:0> + val2<31:0>)<32:>}},
199 {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
200 {{(Rs1<63:1> + val2<63:1> + (Rs1 & val2)<0:>)<63:>}},
201 {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
202 );
203 0x11: IntOpCcRes::andcc({{Rd = Rs1 & Rs2_or_imm13;}});
204 0x12: IntOpCcRes::orcc({{Rd = Rs1 | Rs2_or_imm13;}});
205 0x13: IntOpCcRes::xorcc({{Rd = Rs1 ^ Rs2_or_imm13;}});
206 0x14: subcc({{
207 int64_t val2 = Rs2_or_imm13;
208 Rd = Rs1 - val2;}},
209 {{(~(Rs1<31:0> + (~val2)<31:0> + 1))<32:>}},
210 {{(Rs1<31:> != val2<31:>) && (Rs1<31:> != Rd<31:>)}},
211 {{(~(Rs1<63:1> + (~val2)<63:1> +
212 (Rs1 | ~val2)<0:>))<63:>}},
213 {{Rs1<63:> != val2<63:> && Rs1<63:> != Rd<63:>}}
214 );
215 0x15: IntOpCcRes::andncc({{Rd = Rs1 & ~Rs2_or_imm13;}});
216 0x16: IntOpCcRes::orncc({{Rd = Rs1 | ~Rs2_or_imm13;}});
217 0x17: IntOpCcRes::xnorcc({{Rd = ~(Rs1 ^ Rs2_or_imm13);}});
218 0x18: addccc({{
219 int64_t resTemp, val2 = Rs2_or_imm13;
220 int64_t carryin = Ccr<0:0>;
221 Rd = resTemp = Rs1 + val2 + carryin;}},
222 {{(Rs1<31:0> + val2<31:0> + carryin)<32:>}},
223 {{Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>}},
224 {{((Rs1 & val2) | (~resTemp & (Rs1 | val2)))<63:>}},
225 {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
226 );
227 0x1A: IntOpCcRes::umulcc({{
228 uint64_t resTemp;
229 Rd = resTemp = Rs1.udw<31:0> * Rs2_or_imm13.udw<31:0>;
230 Y = resTemp<63:32>;}});
231 0x1B: IntOpCcRes::smulcc({{
232 int64_t resTemp;
233 Rd = resTemp = sext<32>(Rs1.sdw<31:0>) * sext<32>(Rs2_or_imm13<31:0>);
234 Y = resTemp<63:32>;}});
235 0x1C: subccc({{
236 int64_t resTemp, val2 = Rs2_or_imm13;
237 int64_t carryin = Ccr<0:0>;
238 Rd = resTemp = Rs1 + ~val2 + 1 - carryin;}},
239 {{((~Rs1 & val2) | (resTemp & (~Rs1 | val2)))<31:>}},
240 {{Rs1<31:> != val2<31:> && Rs1<31:> != resTemp<31:>}},
241 {{((~Rs1 & val2) | (resTemp & (~Rs1 | val2)))<63:>}},
242 {{Rs1<63:> != val2<63:> && Rs1<63:> != resTemp<63:>}}
243 );
244 0x1D: IntOpCcRes::udivxcc({{
245 if(Rs2_or_imm13.udw == 0) fault = new DivisionByZero;
246 else Rd = Rs1.udw / Rs2_or_imm13.udw;}});
247 0x1E: udivcc({{
248 uint32_t resTemp, val2 = Rs2_or_imm13.udw;
249 int32_t overflow = 0;
250 if(val2 == 0) fault = new DivisionByZero;
251 else
252 {
253 resTemp = (uint64_t)((Y << 32) | Rs1.udw<31:0>) / val2;
254 overflow = (resTemp<63:32> != 0);
255 if(overflow) Rd = resTemp = 0xFFFFFFFF;
256 else Rd = resTemp;
257 } }},
258 {{0}},
259 {{overflow}},
260 {{0}},
261 {{0}}
262 );
263 0x1F: sdivcc({{
264 int64_t val2 = Rs2_or_imm13.sdw<31:0>;
265 bool overflow = false, underflow = false;
266 if(val2 == 0) fault = new DivisionByZero;
267 else
268 {
269 Rd = (int64_t)((Y << 32) | Rs1.sdw<31:0>) / val2;
270 overflow = ((int64_t)Rd >= std::numeric_limits<int32_t>::max());
271 underflow = ((int64_t)Rd <= std::numeric_limits<int32_t>::min());
272 if(overflow) Rd = 0x7FFFFFFF;
273 else if(underflow) Rd = ULL(0xFFFFFFFF80000000);
274 } }},
275 {{0}},
276 {{overflow || underflow}},
277 {{0}},
278 {{0}}
279 );
280 0x20: taddcc({{
281 int64_t resTemp, val2 = Rs2_or_imm13;
282 Rd = resTemp = Rs1 + val2;
283 int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
284 {{((Rs1<31:0> + val2<31:0>)<32:0>)}},
285 {{overflow}},
286 {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
287 {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
288 );
289 0x21: tsubcc({{
290 int64_t resTemp, val2 = Rs2_or_imm13;
291 Rd = resTemp = Rs1 + val2;
292 int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);}},
293 {{(Rs1<31:0> + val2<31:0>)<32:0>}},
294 {{overflow}},
295 {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
296 {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
297 );
298 0x22: taddcctv({{
299 int64_t val2 = Rs2_or_imm13;
300 Rd = Rs1 + val2;
301 int32_t overflow = Rs1<1:0> || val2<1:0> ||
302 (Rs1<31:> == val2<31:> && val2<31:> != Rd<31:>);
303 if(overflow) fault = new TagOverflow;}},
304 {{((Rs1<31:0> + val2<31:0>)<32:0>)}},
305 {{overflow}},
306 {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
307 {{Rs1<63:> == val2<63:> && val2<63:> != Rd<63:>}}
308 );
309 0x23: tsubcctv({{
310 int64_t resTemp, val2 = Rs2_or_imm13;
311 Rd = resTemp = Rs1 + val2;
312 int32_t overflow = Rs1<1:0> || val2<1:0> || (Rs1<31:> == val2<31:> && val2<31:> != resTemp<31:>);
313 if(overflow) fault = new TagOverflow;}},
314 {{((Rs1<31:0> + val2<31:0>)<32:0>)}},
315 {{overflow}},
316 {{((Rs1 >> 1) + (val2 >> 1) + (Rs1 & val2 & 0x1))<63:>}},
317 {{Rs1<63:> == val2<63:> && val2<63:> != resTemp<63:>}}
318 );
319 0x24: mulscc({{
320 int32_t savedLSB = Rs1<0:>;
321
322 //Step 1
323 int64_t multiplicand = Rs2_or_imm13;
324 //Step 2
325 int32_t partialP = Rs1<31:1> |
326 ((Ccr<3:3> ^ Ccr<1:1>) << 31);
327 //Step 3
328 int32_t added = Y<0:> ? multiplicand : 0;
329 Rd = partialP + added;
330 //Steps 4 & 5
331 Y = Y<31:1> | (savedLSB << 31);}},
332 {{((partialP<31:0> + added<31:0>)<32:0>)}},
333 {{partialP<31:> == added<31:> && added<31:> != Rd<31:>}},
334 {{((partialP >> 1) + (added >> 1) + (partialP & added & 0x1))<63:>}},
335 {{partialP<63:> == added<63:> && partialP<63:> != Rd<63:>}}
336 );
337 }
338 format IntOp
339 {
340 0x25: decode X {
341 0x0: sll({{Rd = Rs1 << (I ? SHCNT32 : Rs2<4:0>);}});
342 0x1: sllx({{Rd = Rs1 << (I ? SHCNT64 : Rs2<5:0>);}});
343 }
344 0x26: decode X {

--- 1212 unchanged lines hidden ---