660 }
661
662 void clear_memory_doubleword(Register base_ptr, Register cnt_dwords, Register tmp = R0);
663
664 // Needle of length 1.
665 void string_indexof_1(Register result, Register haystack, Register haycnt,
666 Register needle, jchar needleChar,
667 Register tmp1, Register tmp2);
668 // General indexof, eventually with constant needle length.
669 void string_indexof(Register result, Register haystack, Register haycnt,
670 Register needle, ciTypeArray* needle_values, Register needlecnt, int needlecntval,
671 Register tmp1, Register tmp2, Register tmp3, Register tmp4);
672 void string_compare(Register str1_reg, Register str2_reg, Register cnt1_reg, Register cnt2_reg,
673 Register result_reg, Register tmp_reg);
674 void char_arrays_equals(Register str1_reg, Register str2_reg, Register cnt_reg, Register result_reg,
675 Register tmp1_reg, Register tmp2_reg, Register tmp3_reg, Register tmp4_reg,
676 Register tmp5_reg);
677 void char_arrays_equalsImm(Register str1_reg, Register str2_reg, int cntval, Register result_reg,
678 Register tmp1_reg, Register tmp2_reg);
679
680 //
681 // Debugging
682 //
683
684 // assert on cr0
685 void asm_assert(bool check_equal, const char* msg, int id);
686 void asm_assert_eq(const char* msg, int id) { asm_assert(true, msg, id); }
687 void asm_assert_ne(const char* msg, int id) { asm_assert(false, msg, id); }
688
689 private:
690 void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base,
691 const char* msg, int id);
692
693 public:
694
695 void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg, int id) {
696 asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg, id);
697 }
698 void asm_assert_mem8_isnot_zero(int mem_offset, Register mem_base, const char* msg, int id) {
699 asm_assert_mems_zero(false, 8, mem_offset, mem_base, msg, id);
|
660 }
661
662 void clear_memory_doubleword(Register base_ptr, Register cnt_dwords, Register tmp = R0);
663
664 // Needle of length 1.
665 void string_indexof_1(Register result, Register haystack, Register haycnt,
666 Register needle, jchar needleChar,
667 Register tmp1, Register tmp2);
668 // General indexof, eventually with constant needle length.
669 void string_indexof(Register result, Register haystack, Register haycnt,
670 Register needle, ciTypeArray* needle_values, Register needlecnt, int needlecntval,
671 Register tmp1, Register tmp2, Register tmp3, Register tmp4);
672 void string_compare(Register str1_reg, Register str2_reg, Register cnt1_reg, Register cnt2_reg,
673 Register result_reg, Register tmp_reg);
674 void char_arrays_equals(Register str1_reg, Register str2_reg, Register cnt_reg, Register result_reg,
675 Register tmp1_reg, Register tmp2_reg, Register tmp3_reg, Register tmp4_reg,
676 Register tmp5_reg);
677 void char_arrays_equalsImm(Register str1_reg, Register str2_reg, int cntval, Register result_reg,
678 Register tmp1_reg, Register tmp2_reg);
679
680 // Emitters for BigInteger.multiplyToLen intrinsic.
681 inline void multiply64(Register dest_hi, Register dest_lo,
682 Register x, Register y);
683 void add2_with_carry(Register dest_hi, Register dest_lo,
684 Register src1, Register src2);
685 void multiply_64_x_64_loop(Register x, Register xstart, Register x_xstart,
686 Register y, Register y_idx, Register z,
687 Register carry, Register product_high, Register product,
688 Register idx, Register kdx, Register tmp);
689 void multiply_add_128_x_128(Register x_xstart, Register y, Register z,
690 Register yz_idx, Register idx, Register carry,
691 Register product_high, Register product, Register tmp,
692 int offset);
693 void multiply_128_x_128_loop(Register x_xstart,
694 Register y, Register z,
695 Register yz_idx, Register idx, Register carry,
696 Register product_high, Register product,
697 Register carry2, Register tmp);
698 void multiply_to_len(Register x, Register xlen,
699 Register y, Register ylen,
700 Register z, Register zlen,
701 Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5,
702 Register tmp6, Register tmp7, Register tmp8, Register tmp9, Register tmp10,
703 Register tmp11, Register tmp12, Register tmp13);
704
705 //
706 // Debugging
707 //
708
709 // assert on cr0
710 void asm_assert(bool check_equal, const char* msg, int id);
711 void asm_assert_eq(const char* msg, int id) { asm_assert(true, msg, id); }
712 void asm_assert_ne(const char* msg, int id) { asm_assert(false, msg, id); }
713
714 private:
715 void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base,
716 const char* msg, int id);
717
718 public:
719
720 void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg, int id) {
721 asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg, id);
722 }
723 void asm_assert_mem8_isnot_zero(int mem_offset, Register mem_base, const char* msg, int id) {
724 asm_assert_mems_zero(false, 8, mem_offset, mem_base, msg, id);
|