blob: de2219c964fe291e88636486f4b6cec26208569d [file] [log] [blame]
Carl Shapiroa5d5cfd2011-06-21 12:46:59 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#include <string.h>
4#include "src/assembler.h"
5#include "src/casts.h"
6#include "src/globals.h"
7#include "src/assembler.h"
8#include "src/memory_region.h"
9
10namespace android {
11namespace runtime {
12
13class DirectCallRelocation : public AssemblerFixup {
14 public:
15 void Process(const MemoryRegion& region, int position) {
16 // Direct calls are relative to the following instruction on x86.
17 int32_t pointer = region.Load<int32_t>(position);
18 int32_t start = reinterpret_cast<int32_t>(region.start());
19 int32_t delta = start + position + sizeof(int32_t);
20 region.Store<int32_t>(position, pointer - delta);
21 }
22};
23
24
25void Assembler::InitializeMemoryWithBreakpoints(byte* data, size_t length) {
26 memset(reinterpret_cast<void*>(data), Instr::kBreakPointInstruction, length);
27}
28
29
30void Assembler::call(Register reg) {
31 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
32 EmitUint8(0xFF);
33 EmitRegisterOperand(2, reg);
34}
35
36
37void Assembler::call(const Address& address) {
38 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
39 EmitUint8(0xFF);
40 EmitOperand(2, address);
41}
42
43
44void Assembler::call(Label* label) {
45 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
46 EmitUint8(0xE8);
47 static const int kSize = 5;
48 EmitLabel(label, kSize);
49}
50
51
52void Assembler::pushl(Register reg) {
53 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
54 EmitUint8(0x50 + reg);
55}
56
57
58void Assembler::pushl(const Address& address) {
59 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
60 EmitUint8(0xFF);
61 EmitOperand(6, address);
62}
63
64
65void Assembler::pushl(const Immediate& imm) {
66 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
67 EmitUint8(0x68);
68 EmitImmediate(imm);
69}
70
71
72void Assembler::popl(Register reg) {
73 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
74 EmitUint8(0x58 + reg);
75}
76
77
78void Assembler::popl(const Address& address) {
79 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
80 EmitUint8(0x8F);
81 EmitOperand(0, address);
82}
83
84
85void Assembler::movl(Register dst, const Immediate& imm) {
86 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
87 EmitUint8(0xB8 + dst);
88 EmitImmediate(imm);
89}
90
91
92void Assembler::movl(Register dst, Register src) {
93 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
94 EmitUint8(0x89);
95 EmitRegisterOperand(src, dst);
96}
97
98
99void Assembler::movl(Register dst, const Address& src) {
100 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
101 EmitUint8(0x8B);
102 EmitOperand(dst, src);
103}
104
105
106void Assembler::movl(const Address& dst, Register src) {
107 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
108 EmitUint8(0x89);
109 EmitOperand(src, dst);
110}
111
112
113void Assembler::movl(const Address& dst, const Immediate& imm) {
114 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
115 EmitUint8(0xC7);
116 EmitOperand(0, dst);
117 EmitImmediate(imm);
118}
119
120
121void Assembler::movzxb(Register dst, ByteRegister src) {
122 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
123 EmitUint8(0x0F);
124 EmitUint8(0xB6);
125 EmitRegisterOperand(dst, src);
126}
127
128
129void Assembler::movzxb(Register dst, const Address& src) {
130 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
131 EmitUint8(0x0F);
132 EmitUint8(0xB6);
133 EmitOperand(dst, src);
134}
135
136
137void Assembler::movsxb(Register dst, ByteRegister src) {
138 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
139 EmitUint8(0x0F);
140 EmitUint8(0xBE);
141 EmitRegisterOperand(dst, src);
142}
143
144
145void Assembler::movsxb(Register dst, const Address& src) {
146 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
147 EmitUint8(0x0F);
148 EmitUint8(0xBE);
149 EmitOperand(dst, src);
150}
151
152
153void Assembler::movb(Register dst, const Address& src) {
154 LOG(FATAL) << "Use movzxb or movsxb instead.";
155}
156
157
158void Assembler::movb(const Address& dst, ByteRegister src) {
159 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
160 EmitUint8(0x88);
161 EmitOperand(src, dst);
162}
163
164
165void Assembler::movb(const Address& dst, const Immediate& imm) {
166 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
167 EmitUint8(0xC6);
168 EmitOperand(EAX, dst);
169 CHECK(imm.is_int8());
170 EmitUint8(imm.value() & 0xFF);
171}
172
173
174void Assembler::movzxw(Register dst, Register src) {
175 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
176 EmitUint8(0x0F);
177 EmitUint8(0xB7);
178 EmitRegisterOperand(dst, src);
179}
180
181
182void Assembler::movzxw(Register dst, const Address& src) {
183 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
184 EmitUint8(0x0F);
185 EmitUint8(0xB7);
186 EmitOperand(dst, src);
187}
188
189
190void Assembler::movsxw(Register dst, Register src) {
191 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
192 EmitUint8(0x0F);
193 EmitUint8(0xBF);
194 EmitRegisterOperand(dst, src);
195}
196
197
198void Assembler::movsxw(Register dst, const Address& src) {
199 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
200 EmitUint8(0x0F);
201 EmitUint8(0xBF);
202 EmitOperand(dst, src);
203}
204
205
206void Assembler::movw(Register dst, const Address& src) {
207 LOG(FATAL) << "Use movzxw or movsxw instead.";
208}
209
210
211void Assembler::movw(const Address& dst, Register src) {
212 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
213 EmitOperandSizeOverride();
214 EmitUint8(0x89);
215 EmitOperand(src, dst);
216}
217
218
219void Assembler::leal(Register dst, const Address& src) {
220 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
221 EmitUint8(0x8D);
222 EmitOperand(dst, src);
223}
224
225
226void Assembler::cmovs(Register dst, Register src) {
227 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
228 EmitUint8(0x0F);
229 EmitUint8(0x48);
230 EmitRegisterOperand(dst, src);
231}
232
233
234void Assembler::cmovns(Register dst, Register src) {
235 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
236 EmitUint8(0x0F);
237 EmitUint8(0x49);
238 EmitRegisterOperand(dst, src);
239}
240
241
242void Assembler::movss(XmmRegister dst, const Address& src) {
243 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
244 EmitUint8(0xF3);
245 EmitUint8(0x0F);
246 EmitUint8(0x10);
247 EmitOperand(dst, src);
248}
249
250
251void Assembler::movss(const Address& dst, XmmRegister src) {
252 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
253 EmitUint8(0xF3);
254 EmitUint8(0x0F);
255 EmitUint8(0x11);
256 EmitOperand(src, dst);
257}
258
259
260void Assembler::movss(XmmRegister dst, XmmRegister src) {
261 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
262 EmitUint8(0xF3);
263 EmitUint8(0x0F);
264 EmitUint8(0x11);
265 EmitXmmRegisterOperand(src, dst);
266}
267
268
269void Assembler::movd(XmmRegister dst, Register src) {
270 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
271 EmitUint8(0x66);
272 EmitUint8(0x0F);
273 EmitUint8(0x6E);
274 EmitOperand(dst, Operand(src));
275}
276
277
278void Assembler::movd(Register dst, XmmRegister src) {
279 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
280 EmitUint8(0x66);
281 EmitUint8(0x0F);
282 EmitUint8(0x7E);
283 EmitOperand(src, Operand(dst));
284}
285
286
287void Assembler::addss(XmmRegister dst, XmmRegister src) {
288 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
289 EmitUint8(0xF3);
290 EmitUint8(0x0F);
291 EmitUint8(0x58);
292 EmitXmmRegisterOperand(dst, src);
293}
294
295
296void Assembler::addss(XmmRegister dst, const Address& src) {
297 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
298 EmitUint8(0xF3);
299 EmitUint8(0x0F);
300 EmitUint8(0x58);
301 EmitOperand(dst, src);
302}
303
304
305void Assembler::subss(XmmRegister dst, XmmRegister src) {
306 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
307 EmitUint8(0xF3);
308 EmitUint8(0x0F);
309 EmitUint8(0x5C);
310 EmitXmmRegisterOperand(dst, src);
311}
312
313
314void Assembler::subss(XmmRegister dst, const Address& src) {
315 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
316 EmitUint8(0xF3);
317 EmitUint8(0x0F);
318 EmitUint8(0x5C);
319 EmitOperand(dst, src);
320}
321
322
323void Assembler::mulss(XmmRegister dst, XmmRegister src) {
324 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
325 EmitUint8(0xF3);
326 EmitUint8(0x0F);
327 EmitUint8(0x59);
328 EmitXmmRegisterOperand(dst, src);
329}
330
331
332void Assembler::mulss(XmmRegister dst, const Address& src) {
333 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
334 EmitUint8(0xF3);
335 EmitUint8(0x0F);
336 EmitUint8(0x59);
337 EmitOperand(dst, src);
338}
339
340
341void Assembler::divss(XmmRegister dst, XmmRegister src) {
342 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
343 EmitUint8(0xF3);
344 EmitUint8(0x0F);
345 EmitUint8(0x5E);
346 EmitXmmRegisterOperand(dst, src);
347}
348
349
350void Assembler::divss(XmmRegister dst, const Address& src) {
351 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
352 EmitUint8(0xF3);
353 EmitUint8(0x0F);
354 EmitUint8(0x5E);
355 EmitOperand(dst, src);
356}
357
358
359void Assembler::flds(const Address& src) {
360 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
361 EmitUint8(0xD9);
362 EmitOperand(0, src);
363}
364
365
366void Assembler::fstps(const Address& dst) {
367 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
368 EmitUint8(0xD9);
369 EmitOperand(3, dst);
370}
371
372
373void Assembler::movsd(XmmRegister dst, const Address& src) {
374 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
375 EmitUint8(0xF2);
376 EmitUint8(0x0F);
377 EmitUint8(0x10);
378 EmitOperand(dst, src);
379}
380
381
382void Assembler::movsd(const Address& dst, XmmRegister src) {
383 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
384 EmitUint8(0xF2);
385 EmitUint8(0x0F);
386 EmitUint8(0x11);
387 EmitOperand(src, dst);
388}
389
390
391void Assembler::movsd(XmmRegister dst, XmmRegister src) {
392 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
393 EmitUint8(0xF2);
394 EmitUint8(0x0F);
395 EmitUint8(0x11);
396 EmitXmmRegisterOperand(src, dst);
397}
398
399
400void Assembler::addsd(XmmRegister dst, XmmRegister src) {
401 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
402 EmitUint8(0xF2);
403 EmitUint8(0x0F);
404 EmitUint8(0x58);
405 EmitXmmRegisterOperand(dst, src);
406}
407
408
409void Assembler::addsd(XmmRegister dst, const Address& src) {
410 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
411 EmitUint8(0xF2);
412 EmitUint8(0x0F);
413 EmitUint8(0x58);
414 EmitOperand(dst, src);
415}
416
417
418void Assembler::subsd(XmmRegister dst, XmmRegister src) {
419 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
420 EmitUint8(0xF2);
421 EmitUint8(0x0F);
422 EmitUint8(0x5C);
423 EmitXmmRegisterOperand(dst, src);
424}
425
426
427void Assembler::subsd(XmmRegister dst, const Address& src) {
428 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
429 EmitUint8(0xF2);
430 EmitUint8(0x0F);
431 EmitUint8(0x5C);
432 EmitOperand(dst, src);
433}
434
435
436void Assembler::mulsd(XmmRegister dst, XmmRegister src) {
437 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
438 EmitUint8(0xF2);
439 EmitUint8(0x0F);
440 EmitUint8(0x59);
441 EmitXmmRegisterOperand(dst, src);
442}
443
444
445void Assembler::mulsd(XmmRegister dst, const Address& src) {
446 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
447 EmitUint8(0xF2);
448 EmitUint8(0x0F);
449 EmitUint8(0x59);
450 EmitOperand(dst, src);
451}
452
453
454void Assembler::divsd(XmmRegister dst, XmmRegister src) {
455 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
456 EmitUint8(0xF2);
457 EmitUint8(0x0F);
458 EmitUint8(0x5E);
459 EmitXmmRegisterOperand(dst, src);
460}
461
462
463void Assembler::divsd(XmmRegister dst, const Address& src) {
464 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
465 EmitUint8(0xF2);
466 EmitUint8(0x0F);
467 EmitUint8(0x5E);
468 EmitOperand(dst, src);
469}
470
471
472void Assembler::cvtsi2ss(XmmRegister dst, Register src) {
473 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
474 EmitUint8(0xF3);
475 EmitUint8(0x0F);
476 EmitUint8(0x2A);
477 EmitOperand(dst, Operand(src));
478}
479
480
481void Assembler::cvtsi2sd(XmmRegister dst, Register src) {
482 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
483 EmitUint8(0xF2);
484 EmitUint8(0x0F);
485 EmitUint8(0x2A);
486 EmitOperand(dst, Operand(src));
487}
488
489
490void Assembler::cvtss2si(Register dst, XmmRegister src) {
491 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
492 EmitUint8(0xF3);
493 EmitUint8(0x0F);
494 EmitUint8(0x2D);
495 EmitXmmRegisterOperand(dst, src);
496}
497
498
499void Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
500 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
501 EmitUint8(0xF3);
502 EmitUint8(0x0F);
503 EmitUint8(0x5A);
504 EmitXmmRegisterOperand(dst, src);
505}
506
507
508void Assembler::cvtsd2si(Register dst, XmmRegister src) {
509 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
510 EmitUint8(0xF2);
511 EmitUint8(0x0F);
512 EmitUint8(0x2D);
513 EmitXmmRegisterOperand(dst, src);
514}
515
516
517void Assembler::cvttss2si(Register dst, XmmRegister src) {
518 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
519 EmitUint8(0xF3);
520 EmitUint8(0x0F);
521 EmitUint8(0x2C);
522 EmitXmmRegisterOperand(dst, src);
523}
524
525
526void Assembler::cvttsd2si(Register dst, XmmRegister src) {
527 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
528 EmitUint8(0xF2);
529 EmitUint8(0x0F);
530 EmitUint8(0x2C);
531 EmitXmmRegisterOperand(dst, src);
532}
533
534
535void Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
536 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
537 EmitUint8(0xF2);
538 EmitUint8(0x0F);
539 EmitUint8(0x5A);
540 EmitXmmRegisterOperand(dst, src);
541}
542
543
544void Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) {
545 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
546 EmitUint8(0xF3);
547 EmitUint8(0x0F);
548 EmitUint8(0xE6);
549 EmitXmmRegisterOperand(dst, src);
550}
551
552
553void Assembler::comiss(XmmRegister a, XmmRegister b) {
554 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
555 EmitUint8(0x0F);
556 EmitUint8(0x2F);
557 EmitXmmRegisterOperand(a, b);
558}
559
560
561void Assembler::comisd(XmmRegister a, XmmRegister b) {
562 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
563 EmitUint8(0x66);
564 EmitUint8(0x0F);
565 EmitUint8(0x2F);
566 EmitXmmRegisterOperand(a, b);
567}
568
569
570void Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
571 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
572 EmitUint8(0xF2);
573 EmitUint8(0x0F);
574 EmitUint8(0x51);
575 EmitXmmRegisterOperand(dst, src);
576}
577
578
579void Assembler::sqrtss(XmmRegister dst, XmmRegister src) {
580 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
581 EmitUint8(0xF3);
582 EmitUint8(0x0F);
583 EmitUint8(0x51);
584 EmitXmmRegisterOperand(dst, src);
585}
586
587
588void Assembler::xorpd(XmmRegister dst, const Address& src) {
589 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
590 EmitUint8(0x66);
591 EmitUint8(0x0F);
592 EmitUint8(0x57);
593 EmitOperand(dst, src);
594}
595
596
597void Assembler::xorpd(XmmRegister dst, XmmRegister src) {
598 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
599 EmitUint8(0x66);
600 EmitUint8(0x0F);
601 EmitUint8(0x57);
602 EmitXmmRegisterOperand(dst, src);
603}
604
605
606void Assembler::xorps(XmmRegister dst, const Address& src) {
607 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
608 EmitUint8(0x0F);
609 EmitUint8(0x57);
610 EmitOperand(dst, src);
611}
612
613
614void Assembler::xorps(XmmRegister dst, XmmRegister src) {
615 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
616 EmitUint8(0x0F);
617 EmitUint8(0x57);
618 EmitXmmRegisterOperand(dst, src);
619}
620
621
622void Assembler::andpd(XmmRegister dst, const Address& src) {
623 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
624 EmitUint8(0x66);
625 EmitUint8(0x0F);
626 EmitUint8(0x54);
627 EmitOperand(dst, src);
628}
629
630
631void Assembler::fldl(const Address& src) {
632 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
633 EmitUint8(0xDD);
634 EmitOperand(0, src);
635}
636
637
638void Assembler::fstpl(const Address& dst) {
639 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
640 EmitUint8(0xDD);
641 EmitOperand(3, dst);
642}
643
644
645void Assembler::fnstcw(const Address& dst) {
646 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
647 EmitUint8(0xD9);
648 EmitOperand(7, dst);
649}
650
651
652void Assembler::fldcw(const Address& src) {
653 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
654 EmitUint8(0xD9);
655 EmitOperand(5, src);
656}
657
658
659void Assembler::fistpl(const Address& dst) {
660 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
661 EmitUint8(0xDF);
662 EmitOperand(7, dst);
663}
664
665
666void Assembler::fistps(const Address& dst) {
667 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
668 EmitUint8(0xDB);
669 EmitOperand(3, dst);
670}
671
672
673void Assembler::fildl(const Address& src) {
674 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
675 EmitUint8(0xDF);
676 EmitOperand(5, src);
677}
678
679
680void Assembler::fincstp() {
681 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
682 EmitUint8(0xD9);
683 EmitUint8(0xF7);
684}
685
686
687void Assembler::ffree(const Immediate& index) {
688 CHECK_LT(index.value(), 7);
689 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
690 EmitUint8(0xDD);
691 EmitUint8(0xC0 + index.value());
692}
693
694
695void Assembler::fsin() {
696 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
697 EmitUint8(0xD9);
698 EmitUint8(0xFE);
699}
700
701
702void Assembler::fcos() {
703 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
704 EmitUint8(0xD9);
705 EmitUint8(0xFF);
706}
707
708
709void Assembler::fptan() {
710 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
711 EmitUint8(0xD9);
712 EmitUint8(0xF2);
713}
714
715
716void Assembler::xchgl(Register dst, Register src) {
717 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
718 EmitUint8(0x87);
719 EmitRegisterOperand(dst, src);
720}
721
722
723void Assembler::cmpl(Register reg, const Immediate& imm) {
724 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
725 EmitComplex(7, Operand(reg), imm);
726}
727
728
729void Assembler::cmpl(Register reg0, Register reg1) {
730 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
731 EmitUint8(0x3B);
732 EmitOperand(reg0, Operand(reg1));
733}
734
735
736void Assembler::cmpl(Register reg, const Address& address) {
737 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
738 EmitUint8(0x3B);
739 EmitOperand(reg, address);
740}
741
742
743void Assembler::addl(Register dst, Register src) {
744 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
745 EmitUint8(0x03);
746 EmitRegisterOperand(dst, src);
747}
748
749
750void Assembler::addl(Register reg, const Address& address) {
751 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
752 EmitUint8(0x03);
753 EmitOperand(reg, address);
754}
755
756
757void Assembler::cmpl(const Address& address, Register reg) {
758 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
759 EmitUint8(0x39);
760 EmitOperand(reg, address);
761}
762
763
764void Assembler::cmpl(const Address& address, const Immediate& imm) {
765 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
766 EmitComplex(7, address, imm);
767}
768
769
770void Assembler::testl(Register reg1, Register reg2) {
771 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
772 EmitUint8(0x85);
773 EmitRegisterOperand(reg1, reg2);
774}
775
776
777void Assembler::testl(Register reg, const Immediate& immediate) {
778 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
779 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
780 // we only test the byte register to keep the encoding short.
781 if (immediate.is_uint8() && reg < 4) {
782 // Use zero-extended 8-bit immediate.
783 if (reg == EAX) {
784 EmitUint8(0xA8);
785 } else {
786 EmitUint8(0xF6);
787 EmitUint8(0xC0 + reg);
788 }
789 EmitUint8(immediate.value() & 0xFF);
790 } else if (reg == EAX) {
791 // Use short form if the destination is EAX.
792 EmitUint8(0xA9);
793 EmitImmediate(immediate);
794 } else {
795 EmitUint8(0xF7);
796 EmitOperand(0, Operand(reg));
797 EmitImmediate(immediate);
798 }
799}
800
801
802void Assembler::andl(Register dst, Register src) {
803 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
804 EmitUint8(0x23);
805 EmitOperand(dst, Operand(src));
806}
807
808
809void Assembler::andl(Register dst, const Immediate& imm) {
810 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
811 EmitComplex(4, Operand(dst), imm);
812}
813
814
815void Assembler::orl(Register dst, Register src) {
816 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
817 EmitUint8(0x0B);
818 EmitOperand(dst, Operand(src));
819}
820
821
822void Assembler::orl(Register dst, const Immediate& imm) {
823 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
824 EmitComplex(1, Operand(dst), imm);
825}
826
827
828void Assembler::xorl(Register dst, Register src) {
829 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
830 EmitUint8(0x33);
831 EmitOperand(dst, Operand(src));
832}
833
834
835void Assembler::addl(Register reg, const Immediate& imm) {
836 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
837 EmitComplex(0, Operand(reg), imm);
838}
839
840
841void Assembler::addl(const Address& address, Register reg) {
842 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
843 EmitUint8(0x01);
844 EmitOperand(reg, address);
845}
846
847
848void Assembler::addl(const Address& address, const Immediate& imm) {
849 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
850 EmitComplex(0, address, imm);
851}
852
853
854void Assembler::adcl(Register reg, const Immediate& imm) {
855 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
856 EmitComplex(2, Operand(reg), imm);
857}
858
859
860void Assembler::adcl(Register dst, Register src) {
861 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
862 EmitUint8(0x13);
863 EmitOperand(dst, Operand(src));
864}
865
866
867void Assembler::adcl(Register dst, const Address& address) {
868 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
869 EmitUint8(0x13);
870 EmitOperand(dst, address);
871}
872
873
874void Assembler::subl(Register dst, Register src) {
875 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
876 EmitUint8(0x2B);
877 EmitOperand(dst, Operand(src));
878}
879
880
881void Assembler::subl(Register reg, const Immediate& imm) {
882 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
883 EmitComplex(5, Operand(reg), imm);
884}
885
886
887void Assembler::subl(Register reg, const Address& address) {
888 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
889 EmitUint8(0x2B);
890 EmitOperand(reg, address);
891}
892
893
894void Assembler::cdq() {
895 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
896 EmitUint8(0x99);
897}
898
899
900void Assembler::idivl(Register reg) {
901 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
902 EmitUint8(0xF7);
903 EmitUint8(0xF8 | reg);
904}
905
906
907void Assembler::imull(Register dst, Register src) {
908 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
909 EmitUint8(0x0F);
910 EmitUint8(0xAF);
911 EmitOperand(dst, Operand(src));
912}
913
914
915void Assembler::imull(Register reg, const Immediate& imm) {
916 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
917 EmitUint8(0x69);
918 EmitOperand(reg, Operand(reg));
919 EmitImmediate(imm);
920}
921
922
923void Assembler::imull(Register reg, const Address& address) {
924 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
925 EmitUint8(0x0F);
926 EmitUint8(0xAF);
927 EmitOperand(reg, address);
928}
929
930
931void Assembler::imull(Register reg) {
932 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
933 EmitUint8(0xF7);
934 EmitOperand(5, Operand(reg));
935}
936
937
938void Assembler::imull(const Address& address) {
939 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
940 EmitUint8(0xF7);
941 EmitOperand(5, address);
942}
943
944
945void Assembler::mull(Register reg) {
946 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
947 EmitUint8(0xF7);
948 EmitOperand(4, Operand(reg));
949}
950
951
952void Assembler::mull(const Address& address) {
953 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
954 EmitUint8(0xF7);
955 EmitOperand(4, address);
956}
957
958
959void Assembler::sbbl(Register dst, Register src) {
960 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
961 EmitUint8(0x1B);
962 EmitOperand(dst, Operand(src));
963}
964
965
966void Assembler::sbbl(Register reg, const Immediate& imm) {
967 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
968 EmitComplex(3, Operand(reg), imm);
969}
970
971
972void Assembler::sbbl(Register dst, const Address& address) {
973 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
974 EmitUint8(0x1B);
975 EmitOperand(dst, address);
976}
977
978
979void Assembler::incl(Register reg) {
980 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
981 EmitUint8(0x40 + reg);
982}
983
984
985void Assembler::incl(const Address& address) {
986 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
987 EmitUint8(0xFF);
988 EmitOperand(0, address);
989}
990
991
992void Assembler::decl(Register reg) {
993 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
994 EmitUint8(0x48 + reg);
995}
996
997
998void Assembler::decl(const Address& address) {
999 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1000 EmitUint8(0xFF);
1001 EmitOperand(1, address);
1002}
1003
1004
1005void Assembler::shll(Register reg, const Immediate& imm) {
1006 EmitGenericShift(4, reg, imm);
1007}
1008
1009
1010void Assembler::shll(Register operand, Register shifter) {
1011 EmitGenericShift(4, operand, shifter);
1012}
1013
1014
1015void Assembler::shrl(Register reg, const Immediate& imm) {
1016 EmitGenericShift(5, reg, imm);
1017}
1018
1019
1020void Assembler::shrl(Register operand, Register shifter) {
1021 EmitGenericShift(5, operand, shifter);
1022}
1023
1024
1025void Assembler::sarl(Register reg, const Immediate& imm) {
1026 EmitGenericShift(7, reg, imm);
1027}
1028
1029
1030void Assembler::sarl(Register operand, Register shifter) {
1031 EmitGenericShift(7, operand, shifter);
1032}
1033
1034
1035void Assembler::shld(Register dst, Register src) {
1036 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1037 EmitUint8(0x0F);
1038 EmitUint8(0xA5);
1039 EmitRegisterOperand(src, dst);
1040}
1041
1042
1043void Assembler::negl(Register reg) {
1044 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1045 EmitUint8(0xF7);
1046 EmitOperand(3, Operand(reg));
1047}
1048
1049
1050void Assembler::notl(Register reg) {
1051 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1052 EmitUint8(0xF7);
1053 EmitUint8(0xD0 | reg);
1054}
1055
1056
1057void Assembler::enter(const Immediate& imm) {
1058 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1059 EmitUint8(0xC8);
1060 CHECK(imm.is_uint16());
1061 EmitUint8(imm.value() & 0xFF);
1062 EmitUint8((imm.value() >> 8) & 0xFF);
1063 EmitUint8(0x00);
1064}
1065
1066
1067void Assembler::leave() {
1068 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1069 EmitUint8(0xC9);
1070}
1071
1072
1073void Assembler::ret() {
1074 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1075 EmitUint8(0xC3);
1076}
1077
1078
1079void Assembler::ret(const Immediate& imm) {
1080 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1081 EmitUint8(0xC2);
1082 CHECK(imm.is_uint16());
1083 EmitUint8(imm.value() & 0xFF);
1084 EmitUint8((imm.value() >> 8) & 0xFF);
1085}
1086
1087
1088
1089void Assembler::nop() {
1090 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1091 EmitUint8(0x90);
1092}
1093
1094
1095void Assembler::int3() {
1096 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1097 EmitUint8(0xCC);
1098}
1099
1100
1101void Assembler::hlt() {
1102 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1103 EmitUint8(0xF4);
1104}
1105
1106
1107void Assembler::j(Condition condition, Label* label) {
1108 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1109 if (label->IsBound()) {
1110 static const int kShortSize = 2;
1111 static const int kLongSize = 6;
1112 int offset = label->Position() - buffer_.Size();
1113 CHECK_LE(offset, 0);
1114 if (IsInt(8, offset - kShortSize)) {
1115 EmitUint8(0x70 + condition);
1116 EmitUint8((offset - kShortSize) & 0xFF);
1117 } else {
1118 EmitUint8(0x0F);
1119 EmitUint8(0x80 + condition);
1120 EmitInt32(offset - kLongSize);
1121 }
1122 } else {
1123 EmitUint8(0x0F);
1124 EmitUint8(0x80 + condition);
1125 EmitLabelLink(label);
1126 }
1127}
1128
1129
1130void Assembler::jmp(Register reg) {
1131 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1132 EmitUint8(0xFF);
1133 EmitRegisterOperand(4, reg);
1134}
1135
1136
1137void Assembler::jmp(Label* label) {
1138 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1139 if (label->IsBound()) {
1140 static const int kShortSize = 2;
1141 static const int kLongSize = 5;
1142 int offset = label->Position() - buffer_.Size();
1143 CHECK_LE(offset, 0);
1144 if (IsInt(8, offset - kShortSize)) {
1145 EmitUint8(0xEB);
1146 EmitUint8((offset - kShortSize) & 0xFF);
1147 } else {
1148 EmitUint8(0xE9);
1149 EmitInt32(offset - kLongSize);
1150 }
1151 } else {
1152 EmitUint8(0xE9);
1153 EmitLabelLink(label);
1154 }
1155}
1156
1157
1158void Assembler::lock() {
1159 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1160 EmitUint8(0xF0);
1161}
1162
1163
1164void Assembler::cmpxchgl(const Address& address, Register reg) {
1165 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1166 EmitUint8(0x0F);
1167 EmitUint8(0xB1);
1168 EmitOperand(reg, address);
1169}
1170
1171
1172void Assembler::AddImmediate(Register reg, const Immediate& imm) {
1173 int value = imm.value();
1174 if (value > 0) {
1175 if (value == 1) {
1176 incl(reg);
1177 } else if (value != 0) {
1178 addl(reg, imm);
1179 }
1180 } else if (value < 0) {
1181 value = -value;
1182 if (value == 1) {
1183 decl(reg);
1184 } else if (value != 0) {
1185 subl(reg, Immediate(value));
1186 }
1187 }
1188}
1189
1190
1191void Assembler::LoadDoubleConstant(XmmRegister dst, double value) {
1192 // TODO: Need to have a code constants table.
1193 int64_t constant = bit_cast<int64_t, double>(value);
1194 pushl(Immediate(High32Bits(constant)));
1195 pushl(Immediate(Low32Bits(constant)));
1196 movsd(dst, Address(ESP, 0));
1197 addl(ESP, Immediate(2 * kWordSize));
1198}
1199
1200
1201void Assembler::FloatNegate(XmmRegister f) {
1202 static const struct {
1203 uint32_t a;
1204 uint32_t b;
1205 uint32_t c;
1206 uint32_t d;
1207 } float_negate_constant __attribute__((aligned(16))) =
1208 { 0x80000000, 0x00000000, 0x80000000, 0x00000000 };
1209 xorps(f, Address::Absolute(reinterpret_cast<uword>(&float_negate_constant)));
1210}
1211
1212
1213void Assembler::DoubleNegate(XmmRegister d) {
1214 static const struct {
1215 uint64_t a;
1216 uint64_t b;
1217 } double_negate_constant __attribute__((aligned(16))) =
1218 {0x8000000000000000LL, 0x8000000000000000LL};
1219 xorpd(d, Address::Absolute(reinterpret_cast<uword>(&double_negate_constant)));
1220}
1221
1222
1223void Assembler::DoubleAbs(XmmRegister reg) {
1224 static const struct {
1225 uint64_t a;
1226 uint64_t b;
1227 } double_abs_constant __attribute__((aligned(16))) =
1228 {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
1229 andpd(reg, Address::Absolute(reinterpret_cast<uword>(&double_abs_constant)));
1230}
1231
1232
1233void Assembler::Align(int alignment, int offset) {
1234 CHECK(IsPowerOfTwo(alignment));
1235 // Emit nop instruction until the real position is aligned.
1236 while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) {
1237 nop();
1238 }
1239}
1240
1241
1242void Assembler::Bind(Label* label) {
1243 int bound = buffer_.Size();
1244 CHECK(!label->IsBound()); // Labels can only be bound once.
1245 while (label->IsLinked()) {
1246 int position = label->LinkPosition();
1247 int next = buffer_.Load<int32_t>(position);
1248 buffer_.Store<int32_t>(position, bound - (position + 4));
1249 label->position_ = next;
1250 }
1251 label->BindTo(bound);
1252}
1253
1254
1255void Assembler::Stop(const char* message) {
1256 // Emit the message address as immediate operand in the test rax instruction,
1257 // followed by the int3 instruction.
1258 // Execution can be resumed with the 'cont' command in gdb.
1259 testl(EAX, Immediate(reinterpret_cast<int32_t>(message)));
1260 int3();
1261}
1262
1263
1264void Assembler::EmitOperand(int rm, const Operand& operand) {
1265 CHECK_GE(rm, 0);
1266 CHECK_LT(rm, 8);
1267 const int length = operand.length_;
1268 CHECK_GT(length, 0);
1269 // Emit the ModRM byte updated with the given RM value.
1270 CHECK_EQ(operand.encoding_[0] & 0x38, 0);
1271 EmitUint8(operand.encoding_[0] + (rm << 3));
1272 // Emit the rest of the encoded operand.
1273 for (int i = 1; i < length; i++) {
1274 EmitUint8(operand.encoding_[i]);
1275 }
1276}
1277
1278
1279void Assembler::EmitImmediate(const Immediate& imm) {
1280 EmitInt32(imm.value());
1281}
1282
1283
1284void Assembler::EmitComplex(int rm,
1285 const Operand& operand,
1286 const Immediate& immediate) {
1287 CHECK_GE(rm, 0);
1288 CHECK_LT(rm, 8);
1289 if (immediate.is_int8()) {
1290 // Use sign-extended 8-bit immediate.
1291 EmitUint8(0x83);
1292 EmitOperand(rm, operand);
1293 EmitUint8(immediate.value() & 0xFF);
1294 } else if (operand.IsRegister(EAX)) {
1295 // Use short form if the destination is eax.
1296 EmitUint8(0x05 + (rm << 3));
1297 EmitImmediate(immediate);
1298 } else {
1299 EmitUint8(0x81);
1300 EmitOperand(rm, operand);
1301 EmitImmediate(immediate);
1302 }
1303}
1304
1305
1306void Assembler::EmitLabel(Label* label, int instruction_size) {
1307 if (label->IsBound()) {
1308 int offset = label->Position() - buffer_.Size();
1309 CHECK_LE(offset, 0);
1310 EmitInt32(offset - instruction_size);
1311 } else {
1312 EmitLabelLink(label);
1313 }
1314}
1315
1316
1317void Assembler::EmitLabelLink(Label* label) {
1318 CHECK(!label->IsBound());
1319 int position = buffer_.Size();
1320 EmitInt32(label->position_);
1321 label->LinkTo(position);
1322}
1323
1324
1325void Assembler::EmitGenericShift(int rm,
1326 Register reg,
1327 const Immediate& imm) {
1328 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1329 CHECK(imm.is_int8());
1330 if (imm.value() == 1) {
1331 EmitUint8(0xD1);
1332 EmitOperand(rm, Operand(reg));
1333 } else {
1334 EmitUint8(0xC1);
1335 EmitOperand(rm, Operand(reg));
1336 EmitUint8(imm.value() & 0xFF);
1337 }
1338}
1339
1340
1341void Assembler::EmitGenericShift(int rm,
1342 Register operand,
1343 Register shifter) {
1344 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1345 CHECK_EQ(shifter, ECX);
1346 EmitUint8(0xD3);
1347 EmitOperand(rm, Operand(operand));
1348}
1349
1350} } // namespace android::runtime