815 public void mneg(int size, Register dst, Register src1, Register src2) { |
815 public void mneg(int size, Register dst, Register src1, Register src2) { |
816 super.msub(size, dst, src1, src2, zr); |
816 super.msub(size, dst, src1, src2, zr); |
817 } |
817 } |
818 |
818 |
819 /** |
819 /** |
820 * unsigned multiply high. dst = (src1 * src2) >> size |
820 * Unsigned multiply high. dst = (src1 * src2) >> size |
821 * |
821 * |
822 * @param size register size. Has to be 32 or 64. |
822 * @param size register size. Has to be 32 or 64. |
823 * @param dst general purpose register. May not be null or the stackpointer. |
823 * @param dst general purpose register. May not be null or the stackpointer. |
824 * @param src1 general purpose register. May not be null or the stackpointer. |
824 * @param src1 general purpose register. May not be null or the stackpointer. |
825 * @param src2 general purpose register. May not be null or the stackpointer. |
825 * @param src2 general purpose register. May not be null or the stackpointer. |
836 lshr(64, dst, dst, 32); |
836 lshr(64, dst, dst, 32); |
837 } |
837 } |
838 } |
838 } |
839 |
839 |
840 /** |
840 /** |
841 * signed multiply high. dst = (src1 * src2) >> size |
841 * Signed multiply high. dst = (src1 * src2) >> size |
842 * |
842 * |
843 * @param size register size. Has to be 32 or 64. |
843 * @param size register size. Has to be 32 or 64. |
844 * @param dst general purpose register. May not be null or the stackpointer. |
844 * @param dst general purpose register. May not be null or the stackpointer. |
845 * @param src1 general purpose register. May not be null or the stackpointer. |
845 * @param src1 general purpose register. May not be null or the stackpointer. |
846 * @param src2 general purpose register. May not be null or the stackpointer. |
846 * @param src2 general purpose register. May not be null or the stackpointer. |
854 // xDst = wSrc1 * wSrc2 |
854 // xDst = wSrc1 * wSrc2 |
855 super.smaddl(dst, src1, src2, zr); |
855 super.smaddl(dst, src1, src2, zr); |
856 // xDst = xDst >> 32 |
856 // xDst = xDst >> 32 |
857 lshr(64, dst, dst, 32); |
857 lshr(64, dst, dst, 32); |
858 } |
858 } |
|
859 } |
|
860 |
|
861 /** |
|
862 * Signed multiply long. xDst = wSrc1 * wSrc2 |
|
863 * |
|
864 * @param size destination register size. Has to be 64. |
|
865 * @param dst 64-bit general purpose register. May not be null or the stackpointer. |
|
866 * @param src1 32-bit general purpose register. May not be null or the stackpointer. |
|
867 * @param src2 32-bit general purpose register. May not be null or the stackpointer. |
|
868 */ |
|
869 public void smull(int size, Register dst, Register src1, Register src2) { |
|
870 this.smaddl(size, dst, src1, src2, zr); |
|
871 } |
|
872 |
|
873 /** |
|
874 * Signed multiply-negate long. xDst = -(wSrc1 * wSrc2) |
|
875 * |
|
876 * @param size destination register size. Has to be 64. |
|
877 * @param dst 64-bit general purpose register. May not be null or the stackpointer. |
|
878 * @param src1 32-bit general purpose register. May not be null or the stackpointer. |
|
879 * @param src2 32-bit general purpose register. May not be null or the stackpointer. |
|
880 */ |
|
881 public void smnegl(int size, Register dst, Register src1, Register src2) { |
|
882 this.smsubl(size, dst, src1, src2, zr); |
|
883 } |
|
884 |
|
885 /** |
|
886 * Signed multiply-add long. xDst = xSrc3 + (wSrc1 * wSrc2) |
|
887 * |
|
888 * @param size destination register size. Has to be 64. |
|
889 * @param dst 64-bit general purpose register. May not be null or the stackpointer. |
|
890 * @param src1 32-bit general purpose register. May not be null or the stackpointer. |
|
891 * @param src2 32-bit general purpose register. May not be null or the stackpointer. |
|
892 * @param src3 64-bit general purpose register. May not be null or the stackpointer. |
|
893 */ |
|
894 public void smaddl(int size, Register dst, Register src1, Register src2, Register src3) { |
|
895 assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp) && !src3.equals(sp)); |
|
896 assert size == 64; |
|
897 super.smaddl(dst, src1, src2, src3); |
|
898 } |
|
899 |
|
900 /** |
|
901 * Signed multiply-sub long. xDst = xSrc3 - (wSrc1 * wSrc2) |
|
902 * |
|
903 * @param size destination register size. Has to be 64. |
|
904 * @param dst 64-bit general purpose register. May not be null or the stackpointer. |
|
905 * @param src1 32-bit general purpose register. May not be null or the stackpointer. |
|
906 * @param src2 32-bit general purpose register. May not be null or the stackpointer. |
|
907 * @param src3 64-bit general purpose register. May not be null or the stackpointer. |
|
908 */ |
|
909 public void smsubl(int size, Register dst, Register src1, Register src2, Register src3) { |
|
910 assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp) && !src3.equals(sp)); |
|
911 assert size == 64; |
|
912 super.smsubl(dst, src1, src2, src3); |
859 } |
913 } |
860 |
914 |
861 /** |
915 /** |
862 * dst = src1 % src2. Signed. |
916 * dst = src1 % src2. Signed. |
863 * |
917 * |