256 }
257
258 void rf(Register r, int lsb) {
259 f(r->encoding_nocheck(), lsb + 4, lsb);
260 }
261
262 // reg|ZR
263 void zrf(Register r, int lsb) {
264 f(r->encoding_nocheck() - (r == zr), lsb + 4, lsb);
265 }
266
267 // reg|SP
268 void srf(Register r, int lsb) {
269 f(r == sp ? 31 : r->encoding_nocheck(), lsb + 4, lsb);
270 }
271
272 void rf(FloatRegister r, int lsb) {
273 f(r->encoding_nocheck(), lsb + 4, lsb);
274 }
275
276 unsigned get(int msb = 31, int lsb = 0) {
277 int nbits = msb - lsb + 1;
278 unsigned mask = ((1U << nbits) - 1) << lsb;
279 assert_cond((bits & mask) == mask);
280 return (insn & mask) >> lsb;
281 }
282
283 void fixed(unsigned value, unsigned mask) {
284 assert_cond ((mask & bits) == 0);
285 #ifdef ASSERT
286 bits |= mask;
287 #endif
288 insn |= value;
289 }
290 };
291
292 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
293
294 class PrePost {
295 int _offset;
661 current->f(val, msb, lsb);
662 }
663 void f(unsigned val, int msb) {
664 current->f(val, msb, msb);
665 }
666 void sf(int64_t val, int msb, int lsb) {
667 current->sf(val, msb, lsb);
668 }
669 void rf(Register reg, int lsb) {
670 current->rf(reg, lsb);
671 }
672 void srf(Register reg, int lsb) {
673 current->srf(reg, lsb);
674 }
675 void zrf(Register reg, int lsb) {
676 current->zrf(reg, lsb);
677 }
678 void rf(FloatRegister reg, int lsb) {
679 current->rf(reg, lsb);
680 }
681 void fixed(unsigned value, unsigned mask) {
682 current->fixed(value, mask);
683 }
684
685 void emit() {
686 emit_long(current->get_insn());
687 assert_cond(current->get_bits() == 0xffffffff);
688 current = NULL;
689 }
690
691 typedef void (Assembler::* uncond_branch_insn)(address dest);
692 typedef void (Assembler::* compare_and_branch_insn)(Register Rt, address dest);
693 typedef void (Assembler::* test_and_branch_insn)(Register Rt, int bitpos, address dest);
694 typedef void (Assembler::* prefetch_insn)(address target, prfop);
695
696 void wrap_label(Label &L, uncond_branch_insn insn);
697 void wrap_label(Register r, Label &L, compare_and_branch_insn insn);
698 void wrap_label(Register r, int bitpos, Label &L, test_and_branch_insn insn);
699 void wrap_label(Label &L, prfop, prefetch_insn insn);
700
|
256 }
257
258 void rf(Register r, int lsb) {
259 f(r->encoding_nocheck(), lsb + 4, lsb);
260 }
261
262 // reg|ZR
263 void zrf(Register r, int lsb) {
264 f(r->encoding_nocheck() - (r == zr), lsb + 4, lsb);
265 }
266
267 // reg|SP
268 void srf(Register r, int lsb) {
269 f(r == sp ? 31 : r->encoding_nocheck(), lsb + 4, lsb);
270 }
271
272 void rf(FloatRegister r, int lsb) {
273 f(r->encoding_nocheck(), lsb + 4, lsb);
274 }
275
276 void prf(PRegister r, int lsb) {
277 f(r->encoding_nocheck(), lsb + 3, lsb);
278 }
279
280 void pgrf(PRegister r, int lsb) {
281 f(r->encoding_nocheck(), lsb + 2, lsb);
282 }
283
284 unsigned get(int msb = 31, int lsb = 0) {
285 int nbits = msb - lsb + 1;
286 unsigned mask = ((1U << nbits) - 1) << lsb;
287 assert_cond((bits & mask) == mask);
288 return (insn & mask) >> lsb;
289 }
290
291 void fixed(unsigned value, unsigned mask) {
292 assert_cond ((mask & bits) == 0);
293 #ifdef ASSERT
294 bits |= mask;
295 #endif
296 insn |= value;
297 }
298 };
299
300 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
301
302 class PrePost {
303 int _offset;
669 current->f(val, msb, lsb);
670 }
671 void f(unsigned val, int msb) {
672 current->f(val, msb, msb);
673 }
674 void sf(int64_t val, int msb, int lsb) {
675 current->sf(val, msb, lsb);
676 }
677 void rf(Register reg, int lsb) {
678 current->rf(reg, lsb);
679 }
680 void srf(Register reg, int lsb) {
681 current->srf(reg, lsb);
682 }
683 void zrf(Register reg, int lsb) {
684 current->zrf(reg, lsb);
685 }
686 void rf(FloatRegister reg, int lsb) {
687 current->rf(reg, lsb);
688 }
689 void prf(PRegister reg, int lsb) {
690 current->prf(reg, lsb);
691 }
692 void pgrf(PRegister reg, int lsb) {
693 current->pgrf(reg, lsb);
694 }
695 void fixed(unsigned value, unsigned mask) {
696 current->fixed(value, mask);
697 }
698
699 void emit() {
700 emit_long(current->get_insn());
701 assert_cond(current->get_bits() == 0xffffffff);
702 current = NULL;
703 }
704
705 typedef void (Assembler::* uncond_branch_insn)(address dest);
706 typedef void (Assembler::* compare_and_branch_insn)(Register Rt, address dest);
707 typedef void (Assembler::* test_and_branch_insn)(Register Rt, int bitpos, address dest);
708 typedef void (Assembler::* prefetch_insn)(address target, prfop);
709
710 void wrap_label(Label &L, uncond_branch_insn insn);
711 void wrap_label(Register r, Label &L, compare_and_branch_insn insn);
712 void wrap_label(Register r, int bitpos, Label &L, test_and_branch_insn insn);
713 void wrap_label(Label &L, prfop, prefetch_insn insn);
714
|