Mercurial > hg > graal-compiler
comparison graal/com.oracle.max.asm/src/com/oracle/max/asm/target/amd64/AMD64MacroAssembler.java @ 5547:b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 09 Jun 2012 20:10:05 +0200 |
parents | a891c53a295b |
children | 69a8969dbf40 |
comparison
equal
deleted
inserted
replaced
5546:e42c0df7212a | 5547:b6617d13ea44 |
---|---|
29 /** | 29 /** |
30 * This class implements commonly used X86 code patterns. | 30 * This class implements commonly used X86 code patterns. |
31 */ | 31 */ |
32 public class AMD64MacroAssembler extends AMD64Assembler { | 32 public class AMD64MacroAssembler extends AMD64Assembler { |
33 | 33 |
34 public AMD64MacroAssembler(CiTarget target, CiRegisterConfig registerConfig) { | 34 public AMD64MacroAssembler(TargetDescription target, RegisterConfig registerConfig) { |
35 super(target, registerConfig); | 35 super(target, registerConfig); |
36 } | 36 } |
37 | 37 |
38 public void pushptr(CiAddress src) { | 38 public void pushptr(Address src) { |
39 pushq(src); | 39 pushq(src); |
40 } | 40 } |
41 | 41 |
42 public void popptr(CiAddress src) { | 42 public void popptr(Address src) { |
43 popq(src); | 43 popq(src); |
44 } | 44 } |
45 | 45 |
46 public void xorptr(CiRegister dst, CiRegister src) { | 46 public void xorptr(Register dst, Register src) { |
47 xorq(dst, src); | 47 xorq(dst, src); |
48 } | 48 } |
49 | 49 |
50 public void xorptr(CiRegister dst, CiAddress src) { | 50 public void xorptr(Register dst, Address src) { |
51 xorq(dst, src); | 51 xorq(dst, src); |
52 } | 52 } |
53 | 53 |
54 // 64 bit versions | 54 // 64 bit versions |
55 | 55 |
56 | 56 |
57 public void decrementq(CiRegister reg, int value) { | 57 public void decrementq(Register reg, int value) { |
58 if (value == Integer.MIN_VALUE) { | 58 if (value == Integer.MIN_VALUE) { |
59 subq(reg, value); | 59 subq(reg, value); |
60 return; | 60 return; |
61 } | 61 } |
62 if (value < 0) { | 62 if (value < 0) { |
71 } else { | 71 } else { |
72 subq(reg, value); | 72 subq(reg, value); |
73 } | 73 } |
74 } | 74 } |
75 | 75 |
76 public void incrementq(CiRegister reg, int value) { | 76 public void incrementq(Register reg, int value) { |
77 if (value == Integer.MIN_VALUE) { | 77 if (value == Integer.MIN_VALUE) { |
78 addq(reg, value); | 78 addq(reg, value); |
79 return; | 79 return; |
80 } | 80 } |
81 if (value < 0) { | 81 if (value < 0) { |
91 addq(reg, value); | 91 addq(reg, value); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 // These are mostly for initializing null | 95 // These are mostly for initializing null |
96 public void movptr(CiAddress dst, int src) { | 96 public void movptr(Address dst, int src) { |
97 movslq(dst, src); | 97 movslq(dst, src); |
98 } | 98 } |
99 | 99 |
100 public final void cmp32(CiRegister src1, int imm) { | 100 public final void cmp32(Register src1, int imm) { |
101 cmpl(src1, imm); | 101 cmpl(src1, imm); |
102 } | 102 } |
103 | 103 |
104 public final void cmp32(CiRegister src1, CiAddress src2) { | 104 public final void cmp32(Register src1, Address src2) { |
105 cmpl(src1, src2); | 105 cmpl(src1, src2); |
106 } | 106 } |
107 | 107 |
108 public void cmpsd2int(CiRegister opr1, CiRegister opr2, CiRegister dst, boolean unorderedIsLess) { | 108 public void cmpsd2int(Register opr1, Register opr2, Register dst, boolean unorderedIsLess) { |
109 assert opr1.isFpu() && opr2.isFpu(); | 109 assert opr1.isFpu() && opr2.isFpu(); |
110 ucomisd(opr1, opr2); | 110 ucomisd(opr1, opr2); |
111 | 111 |
112 Label l = new Label(); | 112 Label l = new Label(); |
113 if (unorderedIsLess) { | 113 if (unorderedIsLess) { |
126 decrementl(dst, 1); | 126 decrementl(dst, 1); |
127 } | 127 } |
128 bind(l); | 128 bind(l); |
129 } | 129 } |
130 | 130 |
131 public void cmpss2int(CiRegister opr1, CiRegister opr2, CiRegister dst, boolean unorderedIsLess) { | 131 public void cmpss2int(Register opr1, Register opr2, Register dst, boolean unorderedIsLess) { |
132 assert opr1.isFpu(); | 132 assert opr1.isFpu(); |
133 assert opr2.isFpu(); | 133 assert opr2.isFpu(); |
134 ucomiss(opr1, opr2); | 134 ucomiss(opr1, opr2); |
135 | 135 |
136 Label l = new Label(); | 136 Label l = new Label(); |
150 decrementl(dst, 1); | 150 decrementl(dst, 1); |
151 } | 151 } |
152 bind(l); | 152 bind(l); |
153 } | 153 } |
154 | 154 |
155 public void cmpptr(CiRegister src1, CiRegister src2) { | 155 public void cmpptr(Register src1, Register src2) { |
156 cmpq(src1, src2); | 156 cmpq(src1, src2); |
157 } | 157 } |
158 | 158 |
159 public void cmpptr(CiRegister src1, CiAddress src2) { | 159 public void cmpptr(Register src1, Address src2) { |
160 cmpq(src1, src2); | 160 cmpq(src1, src2); |
161 } | 161 } |
162 | 162 |
163 public void cmpptr(CiRegister src1, int src2) { | 163 public void cmpptr(Register src1, int src2) { |
164 cmpq(src1, src2); | 164 cmpq(src1, src2); |
165 } | 165 } |
166 | 166 |
167 public void cmpptr(CiAddress src1, int src2) { | 167 public void cmpptr(Address src1, int src2) { |
168 cmpq(src1, src2); | 168 cmpq(src1, src2); |
169 } | 169 } |
170 | 170 |
171 public void decrementl(CiRegister reg, int value) { | 171 public void decrementl(Register reg, int value) { |
172 if (value == Integer.MIN_VALUE) { | 172 if (value == Integer.MIN_VALUE) { |
173 subl(reg, value); | 173 subl(reg, value); |
174 return; | 174 return; |
175 } | 175 } |
176 if (value < 0) { | 176 if (value < 0) { |
185 } else { | 185 } else { |
186 subl(reg, value); | 186 subl(reg, value); |
187 } | 187 } |
188 } | 188 } |
189 | 189 |
190 public void decrementl(CiAddress dst, int value) { | 190 public void decrementl(Address dst, int value) { |
191 if (value == Integer.MIN_VALUE) { | 191 if (value == Integer.MIN_VALUE) { |
192 subl(dst, value); | 192 subl(dst, value); |
193 return; | 193 return; |
194 } | 194 } |
195 if (value < 0) { | 195 if (value < 0) { |
204 } else { | 204 } else { |
205 subl(dst, value); | 205 subl(dst, value); |
206 } | 206 } |
207 } | 207 } |
208 | 208 |
209 public void incrementl(CiRegister reg, int value) { | 209 public void incrementl(Register reg, int value) { |
210 if (value == Integer.MIN_VALUE) { | 210 if (value == Integer.MIN_VALUE) { |
211 addl(reg, value); | 211 addl(reg, value); |
212 return; | 212 return; |
213 } | 213 } |
214 if (value < 0) { | 214 if (value < 0) { |
223 } else { | 223 } else { |
224 addl(reg, value); | 224 addl(reg, value); |
225 } | 225 } |
226 } | 226 } |
227 | 227 |
228 public void incrementl(CiAddress dst, int value) { | 228 public void incrementl(Address dst, int value) { |
229 if (value == Integer.MIN_VALUE) { | 229 if (value == Integer.MIN_VALUE) { |
230 addl(dst, value); | 230 addl(dst, value); |
231 return; | 231 return; |
232 } | 232 } |
233 if (value < 0) { | 233 if (value < 0) { |
242 } else { | 242 } else { |
243 addl(dst, value); | 243 addl(dst, value); |
244 } | 244 } |
245 } | 245 } |
246 | 246 |
247 public void signExtendByte(CiRegister reg) { | 247 public void signExtendByte(Register reg) { |
248 if (reg.isByte()) { | 248 if (reg.isByte()) { |
249 movsxb(reg, reg); // movsxb | 249 movsxb(reg, reg); // movsxb |
250 } else { | 250 } else { |
251 shll(reg, 24); | 251 shll(reg, 24); |
252 sarl(reg, 24); | 252 sarl(reg, 24); |
253 } | 253 } |
254 } | 254 } |
255 | 255 |
256 public void signExtendShort(CiRegister reg) { | 256 public void signExtendShort(Register reg) { |
257 movsxw(reg, reg); // movsxw | 257 movsxw(reg, reg); // movsxw |
258 } | 258 } |
259 | 259 |
260 // Support optimal SSE move instructions. | 260 // Support optimal SSE move instructions. |
261 public void movflt(CiRegister dst, CiRegister src) { | 261 public void movflt(Register dst, Register src) { |
262 assert dst.isFpu() && src.isFpu(); | 262 assert dst.isFpu() && src.isFpu(); |
263 if (AsmOptions.UseXmmRegToRegMoveAll) { | 263 if (AsmOptions.UseXmmRegToRegMoveAll) { |
264 movaps(dst, src); | 264 movaps(dst, src); |
265 } else { | 265 } else { |
266 movss(dst, src); | 266 movss(dst, src); |
267 } | 267 } |
268 } | 268 } |
269 | 269 |
270 public void movflt(CiRegister dst, CiAddress src) { | 270 public void movflt(Register dst, Address src) { |
271 assert dst.isFpu(); | 271 assert dst.isFpu(); |
272 movss(dst, src); | 272 movss(dst, src); |
273 } | 273 } |
274 | 274 |
275 public void movflt(CiAddress dst, CiRegister src) { | 275 public void movflt(Address dst, Register src) { |
276 assert src.isFpu(); | 276 assert src.isFpu(); |
277 movss(dst, src); | 277 movss(dst, src); |
278 } | 278 } |
279 | 279 |
280 public void movdbl(CiRegister dst, CiRegister src) { | 280 public void movdbl(Register dst, Register src) { |
281 assert dst.isFpu() && src.isFpu(); | 281 assert dst.isFpu() && src.isFpu(); |
282 if (AsmOptions.UseXmmRegToRegMoveAll) { | 282 if (AsmOptions.UseXmmRegToRegMoveAll) { |
283 movapd(dst, src); | 283 movapd(dst, src); |
284 } else { | 284 } else { |
285 movsd(dst, src); | 285 movsd(dst, src); |
286 } | 286 } |
287 } | 287 } |
288 | 288 |
289 public void movdbl(CiRegister dst, CiAddress src) { | 289 public void movdbl(Register dst, Address src) { |
290 assert dst.isFpu(); | 290 assert dst.isFpu(); |
291 if (AsmOptions.UseXmmLoadAndClearUpper) { | 291 if (AsmOptions.UseXmmLoadAndClearUpper) { |
292 movsd(dst, src); | 292 movsd(dst, src); |
293 } else { | 293 } else { |
294 movlpd(dst, src); | 294 movlpd(dst, src); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 public void movdbl(CiAddress dst, CiRegister src) { | 298 public void movdbl(Address dst, Register src) { |
299 assert src.isFpu(); | 299 assert src.isFpu(); |
300 movsd(dst, src); | 300 movsd(dst, src); |
301 } | 301 } |
302 | 302 |
303 /** | 303 /** |
304 * Non-atomic write of a 64-bit constant to memory. Do not use | 304 * Non-atomic write of a 64-bit constant to memory. Do not use |
305 * if the address might be a volatile field! | 305 * if the address might be a volatile field! |
306 */ | 306 */ |
307 public void movlong(CiAddress dst, long src) { | 307 public void movlong(Address dst, long src) { |
308 CiAddress high = new CiAddress(dst.kind, dst.base, dst.index, dst.scale, dst.displacement + 4); | 308 Address high = new Address(dst.kind, dst.base, dst.index, dst.scale, dst.displacement + 4); |
309 movl(dst, (int) (src & 0xFFFFFFFF)); | 309 movl(dst, (int) (src & 0xFFFFFFFF)); |
310 movl(high, (int) (src >> 32)); | 310 movl(high, (int) (src >> 32)); |
311 } | 311 } |
312 | 312 |
313 public void xchgptr(CiRegister src1, CiRegister src2) { | 313 public void xchgptr(Register src1, Register src2) { |
314 xchgq(src1, src2); | 314 xchgq(src1, src2); |
315 } | 315 } |
316 | 316 |
317 public void flog(CiRegister dest, CiRegister value, boolean base10) { | 317 public void flog(Register dest, Register value, boolean base10) { |
318 assert value.spillSlotSize == dest.spillSlotSize; | 318 assert value.spillSlotSize == dest.spillSlotSize; |
319 | 319 |
320 CiAddress tmp = new CiAddress(Kind.Double, AMD64.RSP); | 320 Address tmp = new Address(Kind.Double, AMD64.RSP); |
321 if (base10) { | 321 if (base10) { |
322 fldlg2(); | 322 fldlg2(); |
323 } else { | 323 } else { |
324 fldln2(); | 324 fldln2(); |
325 } | 325 } |
330 fstp(tmp); | 330 fstp(tmp); |
331 movsd(dest, tmp); | 331 movsd(dest, tmp); |
332 addq(AMD64.rsp, dest.spillSlotSize); | 332 addq(AMD64.rsp, dest.spillSlotSize); |
333 } | 333 } |
334 | 334 |
335 public void fsin(CiRegister dest, CiRegister value) { | 335 public void fsin(Register dest, Register value) { |
336 ftrig(dest, value, 's'); | 336 ftrig(dest, value, 's'); |
337 } | 337 } |
338 | 338 |
339 public void fcos(CiRegister dest, CiRegister value) { | 339 public void fcos(Register dest, Register value) { |
340 ftrig(dest, value, 'c'); | 340 ftrig(dest, value, 'c'); |
341 } | 341 } |
342 | 342 |
343 public void ftan(CiRegister dest, CiRegister value) { | 343 public void ftan(Register dest, Register value) { |
344 ftrig(dest, value, 't'); | 344 ftrig(dest, value, 't'); |
345 } | 345 } |
346 | 346 |
347 private void ftrig(CiRegister dest, CiRegister value, char op) { | 347 private void ftrig(Register dest, Register value, char op) { |
348 assert value.spillSlotSize == dest.spillSlotSize; | 348 assert value.spillSlotSize == dest.spillSlotSize; |
349 | 349 |
350 CiAddress tmp = new CiAddress(Kind.Double, AMD64.RSP); | 350 Address tmp = new Address(Kind.Double, AMD64.RSP); |
351 subq(AMD64.rsp, value.spillSlotSize); | 351 subq(AMD64.rsp, value.spillSlotSize); |
352 movsd(tmp, value); | 352 movsd(tmp, value); |
353 fld(tmp); | 353 fld(tmp); |
354 if (op == 's') { | 354 if (op == 's') { |
355 fsin(); | 355 fsin(); |
366 addq(AMD64.rsp, dest.spillSlotSize); | 366 addq(AMD64.rsp, dest.spillSlotSize); |
367 } | 367 } |
368 | 368 |
369 /** | 369 /** |
370 * Emit code to save a given set of callee save registers in the | 370 * Emit code to save a given set of callee save registers in the |
371 * {@linkplain CiCalleeSaveLayout CSA} within the frame. | 371 * {@linkplain CalleeSaveLayout CSA} within the frame. |
372 * @param csl the description of the CSA | 372 * @param csl the description of the CSA |
373 * @param frameToCSA offset from the frame pointer to the CSA | 373 * @param frameToCSA offset from the frame pointer to the CSA |
374 */ | 374 */ |
375 public void save(CiCalleeSaveLayout csl, int frameToCSA) { | 375 public void save(CalleeSaveLayout csl, int frameToCSA) { |
376 CiRegisterValue frame = frameRegister.asValue(); | 376 RegisterValue frame = frameRegister.asValue(); |
377 for (CiRegister r : csl.registers) { | 377 for (Register r : csl.registers) { |
378 int offset = csl.offsetOf(r); | 378 int offset = csl.offsetOf(r); |
379 movq(new CiAddress(target.wordKind, frame, frameToCSA + offset), r); | 379 movq(new Address(target.wordKind, frame, frameToCSA + offset), r); |
380 } | 380 } |
381 } | 381 } |
382 | 382 |
383 public void restore(CiCalleeSaveLayout csl, int frameToCSA) { | 383 public void restore(CalleeSaveLayout csl, int frameToCSA) { |
384 CiRegisterValue frame = frameRegister.asValue(); | 384 RegisterValue frame = frameRegister.asValue(); |
385 for (CiRegister r : csl.registers) { | 385 for (Register r : csl.registers) { |
386 int offset = csl.offsetOf(r); | 386 int offset = csl.offsetOf(r); |
387 movq(r, new CiAddress(target.wordKind, frame, frameToCSA + offset)); | 387 movq(r, new Address(target.wordKind, frame, frameToCSA + offset)); |
388 } | 388 } |
389 } | 389 } |
390 } | 390 } |