< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java

Print this page
rev 52889 : 8214023: Update Graal
   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.


< prev index next >