1 /*
2 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
487
488 /**
489 * Conditional move. dst = src1 if condition else src2.
490 *
491 * @param size register size. Has to be 32 or 64.
492 * @param result general purpose register. May not be null or the stackpointer.
493 * @param trueValue general purpose register. May not be null or the stackpointer.
494 * @param falseValue general purpose register. May not be null or the stackpointer.
495 * @param cond any condition flag. May not be null.
496 */
497 public void cmov(int size, Register result, Register trueValue, Register falseValue, ConditionFlag cond) {
498 super.csel(size, result, trueValue, falseValue, cond);
499 }
500
501 /**
502 * Conditional set. dst = 1 if condition else 0.
503 *
504 * @param dst general purpose register. May not be null or stackpointer.
505 * @param condition any condition. May not be null.
506 */
507 public void cset(Register dst, ConditionFlag condition) {
508 super.csinc(32, dst, zr, zr, condition.negate());
509 }
510
511 /**
512 * dst = src1 + src2.
513 *
514 * @param size register size. Has to be 32 or 64.
515 * @param dst general purpose register. May not be null.
516 * @param src1 general purpose register. May not be null.
517 * @param src2 general purpose register. May not be null or stackpointer.
518 */
519 public void add(int size, Register dst, Register src1, Register src2) {
520 if (dst.equals(sp) || src1.equals(sp)) {
521 super.add(size, dst, src1, src2, ExtendType.UXTX, 0);
522 } else {
523 super.add(size, dst, src1, src2, ShiftType.LSL, 0);
524 }
525 }
526
527 /**
528 * dst = src1 + src2 and sets condition flags.
721 if (immediate < 0) {
722 adds(size, dst, src, -immediate);
723 } else if (!dst.equals(src) || immediate != 0) {
724 super.subs(size, dst, src, immediate);
725 }
726 }
727
728 /**
729 * dst = src1 * src2.
730 *
731 * @param size register size. Has to be 32 or 64.
732 * @param dst general purpose register. May not be null or the stackpointer.
733 * @param src1 general purpose register. May not be null or the stackpointer.
734 * @param src2 general purpose register. May not be null or the stackpointer.
735 */
736 public void mul(int size, Register dst, Register src1, Register src2) {
737 super.madd(size, dst, src1, src2, zr);
738 }
739
740 /**
741 * unsigned multiply high. dst = (src1 * src2) >> size
742 *
743 * @param size register size. Has to be 32 or 64.
744 * @param dst general purpose register. May not be null or the stackpointer.
745 * @param src1 general purpose register. May not be null or the stackpointer.
746 * @param src2 general purpose register. May not be null or the stackpointer.
747 */
748 public void umulh(int size, Register dst, Register src1, Register src2) {
749 assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp));
750 assert size == 32 || size == 64;
751 if (size == 64) {
752 super.umulh(dst, src1, src2);
753 } else {
754 // xDst = wSrc1 * wSrc2
755 super.umaddl(dst, src1, src2, zr);
756 // xDst = xDst >> 32
757 lshr(64, dst, dst, 32);
758 }
759 }
760
992 *
993 * @param size register size. Has to be 32 or 64.
994 * @param dst general purpose register. May not be null or zero-register.
995 * @param src general purpose register. May not be null or stack-pointer.
996 * @param bimm logical immediate. See {@link AArch64Assembler.LogicalImmediateTable} for exact
997 * definition.
998 */
999 public void or(int size, Register dst, Register src, long bimm) {
1000 super.orr(size, dst, src, bimm);
1001 }
1002
1003 /**
1004 * dst = ~src.
1005 *
1006 * @param size register size. Has to be 32 or 64.
1007 * @param dst general purpose register. May not be null or stackpointer.
1008 * @param src general purpose register. May not be null or stackpointer.
1009 */
1010 public void not(int size, Register dst, Register src) {
1011 super.orn(size, dst, zr, src, ShiftType.LSL, 0);
1012 }
1013
1014 /**
1015 * Sign-extend value from src into dst.
1016 *
1017 * @param destSize destination register size. Must be 32 or 64.
1018 * @param srcSize source register size. Must be smaller than destSize.
1019 * @param dst general purpose register. May not be null, stackpointer or zero-register.
1020 * @param src general purpose register. May not be null, stackpointer or zero-register.
1021 */
1022 public void sxt(int destSize, int srcSize, Register dst, Register src) {
1023 assert (srcSize < destSize && srcSize > 0);
1024 super.sbfm(destSize, dst, src, 0, srcSize - 1);
1025 }
1026
1027 /**
1028 * dst = src if condition else -src.
1029 *
1030 * @param size register size. Must be 32 or 64.
1031 * @param dst general purpose register. May not be null or the stackpointer.
|
1 /*
2 * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
487
488 /**
489 * Conditional move. dst = src1 if condition else src2.
490 *
491 * @param size register size. Has to be 32 or 64.
492 * @param result general purpose register. May not be null or the stackpointer.
493 * @param trueValue general purpose register. May not be null or the stackpointer.
494 * @param falseValue general purpose register. May not be null or the stackpointer.
495 * @param cond any condition flag. May not be null.
496 */
497 public void cmov(int size, Register result, Register trueValue, Register falseValue, ConditionFlag cond) {
498 super.csel(size, result, trueValue, falseValue, cond);
499 }
500
501 /**
502 * Conditional set. dst = 1 if condition else 0.
503 *
504 * @param dst general purpose register. May not be null or stackpointer.
505 * @param condition any condition. May not be null.
506 */
507 public void cset(int size, Register dst, ConditionFlag condition) {
508 super.csinc(size, dst, zr, zr, condition.negate());
509 }
510
511 /**
512 * dst = src1 + src2.
513 *
514 * @param size register size. Has to be 32 or 64.
515 * @param dst general purpose register. May not be null.
516 * @param src1 general purpose register. May not be null.
517 * @param src2 general purpose register. May not be null or stackpointer.
518 */
519 public void add(int size, Register dst, Register src1, Register src2) {
520 if (dst.equals(sp) || src1.equals(sp)) {
521 super.add(size, dst, src1, src2, ExtendType.UXTX, 0);
522 } else {
523 super.add(size, dst, src1, src2, ShiftType.LSL, 0);
524 }
525 }
526
527 /**
528 * dst = src1 + src2 and sets condition flags.
721 if (immediate < 0) {
722 adds(size, dst, src, -immediate);
723 } else if (!dst.equals(src) || immediate != 0) {
724 super.subs(size, dst, src, immediate);
725 }
726 }
727
728 /**
729 * dst = src1 * src2.
730 *
731 * @param size register size. Has to be 32 or 64.
732 * @param dst general purpose register. May not be null or the stackpointer.
733 * @param src1 general purpose register. May not be null or the stackpointer.
734 * @param src2 general purpose register. May not be null or the stackpointer.
735 */
736 public void mul(int size, Register dst, Register src1, Register src2) {
737 super.madd(size, dst, src1, src2, zr);
738 }
739
740 /**
741 * dst = src3 + src1 * src2.
742 *
743 * @param size register size. Has to be 32 or 64.
744 * @param dst general purpose register. May not be null or the stackpointer.
745 * @param src1 general purpose register. May not be null or the stackpointer.
746 * @param src2 general purpose register. May not be null or the stackpointer.
747 * @param src3 general purpose register. May not be null or the stackpointer.
748 */
749 @Override
750 public void madd(int size, Register dst, Register src1, Register src2, Register src3) {
751 super.madd(size, dst, src1, src2, src3);
752 }
753
754 /**
755 * dst = src3 - src1 * src2.
756 *
757 * @param size register size. Has to be 32 or 64.
758 * @param dst general purpose register. May not be null or the stackpointer.
759 * @param src1 general purpose register. May not be null or the stackpointer.
760 * @param src2 general purpose register. May not be null or the stackpointer.
761 * @param src3 general purpose register. May not be null or the stackpointer.
762 */
763 @Override
764 public void msub(int size, Register dst, Register src1, Register src2, Register src3) {
765 super.msub(size, dst, src1, src2, src3);
766 }
767
768 /**
769 * dst = 0 - src1 * src2.
770 *
771 * @param size register size. Has to be 32 or 64.
772 * @param dst general purpose register. May not be null or the stackpointer.
773 * @param src1 general purpose register. May not be null or the stackpointer.
774 * @param src2 general purpose register. May not be null or the stackpointer.
775 */
776 public void mneg(int size, Register dst, Register src1, Register src2) {
777 super.msub(size, dst, src1, src2, zr);
778 }
779
780 /**
781 * unsigned multiply high. dst = (src1 * src2) >> size
782 *
783 * @param size register size. Has to be 32 or 64.
784 * @param dst general purpose register. May not be null or the stackpointer.
785 * @param src1 general purpose register. May not be null or the stackpointer.
786 * @param src2 general purpose register. May not be null or the stackpointer.
787 */
788 public void umulh(int size, Register dst, Register src1, Register src2) {
789 assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp));
790 assert size == 32 || size == 64;
791 if (size == 64) {
792 super.umulh(dst, src1, src2);
793 } else {
794 // xDst = wSrc1 * wSrc2
795 super.umaddl(dst, src1, src2, zr);
796 // xDst = xDst >> 32
797 lshr(64, dst, dst, 32);
798 }
799 }
800
1032 *
1033 * @param size register size. Has to be 32 or 64.
1034 * @param dst general purpose register. May not be null or zero-register.
1035 * @param src general purpose register. May not be null or stack-pointer.
1036 * @param bimm logical immediate. See {@link AArch64Assembler.LogicalImmediateTable} for exact
1037 * definition.
1038 */
1039 public void or(int size, Register dst, Register src, long bimm) {
1040 super.orr(size, dst, src, bimm);
1041 }
1042
1043 /**
1044 * dst = ~src.
1045 *
1046 * @param size register size. Has to be 32 or 64.
1047 * @param dst general purpose register. May not be null or stackpointer.
1048 * @param src general purpose register. May not be null or stackpointer.
1049 */
1050 public void not(int size, Register dst, Register src) {
1051 super.orn(size, dst, zr, src, ShiftType.LSL, 0);
1052 }
1053
1054 /**
1055 * dst = src1 & shiftType(src2, imm).
1056 *
1057 * @param size register size. Has to be 32 or 64.
1058 * @param dst general purpose register. May not be null or stackpointer.
1059 * @param src1 general purpose register. May not be null or stackpointer.
1060 * @param src2 general purpose register. May not be null or stackpointer.
1061 * @param shiftType all types allowed, may not be null.
1062 * @param shiftAmt must be in range 0 to size - 1.
1063 */
1064 @Override
1065 public void and(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1066 super.and(size, dst, src1, src2, shiftType, shiftAmt);
1067 }
1068
1069 /**
1070 * dst = src1 ^ shiftType(src2, imm).
1071 *
1072 * @param size register size. Has to be 32 or 64.
1073 * @param dst general purpose register. May not be null or stackpointer.
1074 * @param src1 general purpose register. May not be null or stackpointer.
1075 * @param src2 general purpose register. May not be null or stackpointer.
1076 * @param shiftType all types allowed, may not be null.
1077 * @param shiftAmt must be in range 0 to size - 1.
1078 */
1079 @Override
1080 public void eor(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1081 super.eor(size, dst, src1, src2, shiftType, shiftAmt);
1082 }
1083
1084 /**
1085 * dst = src1 | shiftType(src2, imm).
1086 *
1087 * @param size register size. Has to be 32 or 64.
1088 * @param dst general purpose register. May not be null or stackpointer.
1089 * @param src1 general purpose register. May not be null or stackpointer.
1090 * @param src2 general purpose register. May not be null or stackpointer.
1091 * @param shiftType all types allowed, may not be null.
1092 * @param shiftAmt must be in range 0 to size - 1.
1093 */
1094 public void or(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1095 super.orr(size, dst, src1, src2, shiftType, shiftAmt);
1096 }
1097
1098 /**
1099 * dst = src1 & ~(shiftType(src2, imm)).
1100 *
1101 * @param size register size. Has to be 32 or 64.
1102 * @param dst general purpose register. May not be null or stackpointer.
1103 * @param src1 general purpose register. May not be null or stackpointer.
1104 * @param src2 general purpose register. May not be null or stackpointer.
1105 * @param shiftType all types allowed, may not be null.
1106 * @param shiftAmt must be in range 0 to size - 1.
1107 */
1108 @Override
1109 public void bic(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1110 super.bic(size, dst, src1, src2, shiftType, shiftAmt);
1111 }
1112
1113 /**
1114 * dst = src1 ^ ~(shiftType(src2, imm)).
1115 *
1116 * @param size register size. Has to be 32 or 64.
1117 * @param dst general purpose register. May not be null or stackpointer.
1118 * @param src1 general purpose register. May not be null or stackpointer.
1119 * @param src2 general purpose register. May not be null or stackpointer.
1120 * @param shiftType all types allowed, may not be null.
1121 * @param shiftAmt must be in range 0 to size - 1.
1122 */
1123 @Override
1124 public void eon(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1125 super.eon(size, dst, src1, src2, shiftType, shiftAmt);
1126 }
1127
1128 /**
1129 * dst = src1 | ~(shiftType(src2, imm)).
1130 *
1131 * @param size register size. Has to be 32 or 64.
1132 * @param dst general purpose register. May not be null or stackpointer.
1133 * @param src1 general purpose register. May not be null or stackpointer.
1134 * @param src2 general purpose register. May not be null or stackpointer.
1135 * @param shiftType all types allowed, may not be null.
1136 * @param shiftAmt must be in range 0 to size - 1.
1137 */
1138 @Override
1139 public void orn(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1140 super.orn(size, dst, src1, src2, shiftType, shiftAmt);
1141 }
1142
1143 /**
1144 * Sign-extend value from src into dst.
1145 *
1146 * @param destSize destination register size. Must be 32 or 64.
1147 * @param srcSize source register size. Must be smaller than destSize.
1148 * @param dst general purpose register. May not be null, stackpointer or zero-register.
1149 * @param src general purpose register. May not be null, stackpointer or zero-register.
1150 */
1151 public void sxt(int destSize, int srcSize, Register dst, Register src) {
1152 assert (srcSize < destSize && srcSize > 0);
1153 super.sbfm(destSize, dst, src, 0, srcSize - 1);
1154 }
1155
1156 /**
1157 * dst = src if condition else -src.
1158 *
1159 * @param size register size. Must be 32 or 64.
1160 * @param dst general purpose register. May not be null or the stackpointer.
|