119 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Opfs.Movxtod;
120 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Opfs.UMulxhi;
121 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Ops.ArithOp;
122 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Ops.LdstOp;
123 import static java.lang.String.format;
124 import static jdk.vm.ci.sparc.SPARC.CPU;
125 import static jdk.vm.ci.sparc.SPARC.FPUd;
126 import static jdk.vm.ci.sparc.SPARC.FPUs;
127 import static jdk.vm.ci.sparc.SPARC.g0;
128 import static jdk.vm.ci.sparc.SPARC.g2;
129 import static jdk.vm.ci.sparc.SPARC.g5;
130 import static jdk.vm.ci.sparc.SPARC.g7;
131 import static jdk.vm.ci.sparc.SPARC.o7;
132
133 import java.util.ArrayList;
134 import java.util.HashMap;
135 import java.util.List;
136 import java.util.Map;
137
138 import org.graalvm.compiler.asm.Assembler;
139 import org.graalvm.compiler.asm.Label;
140 import org.graalvm.compiler.core.common.NumUtil;
141 import org.graalvm.compiler.core.common.PermanentBailoutException;
142 import org.graalvm.compiler.debug.GraalError;
143
144 import jdk.vm.ci.code.Register;
145 import jdk.vm.ci.code.TargetDescription;
146 import jdk.vm.ci.meta.JavaConstant;
147 import jdk.vm.ci.meta.PlatformKind;
148 import jdk.vm.ci.sparc.SPARC;
149 import jdk.vm.ci.sparc.SPARC.CPUFeature;
150 import jdk.vm.ci.sparc.SPARCKind;
151
152 /**
153 * This class implements an assembler that can encode most SPARC instructions.
154 */
155 public abstract class SPARCAssembler extends Assembler {
156
157 /**
158 * Constructs an assembler for the SPARC architecture.
159 */
160 public SPARCAssembler(TargetDescription target) {
161 super(target);
1264 }
1265
1266 @Override
1267 protected int setBits(int word) {
1268 return BitSpec.op2.setBits(super.setBits(word), op2.value);
1269 }
1270
1271 protected int setDisp(int inst, SPARCMacroAssembler masm, Label lab) {
1272 if (lab.isBound()) {
1273 int d = (lab.position() - masm.position()) / 4;
1274 return setDisp(inst, d);
1275 } else {
1276 masm.patchUnbound(lab);
1277 return inst;
1278 }
1279 }
1280
1281 public int setDisp(int inst, int d) {
1282 assert this.match(inst);
1283 if (!isValidDisp(d)) {
1284 throw new PermanentBailoutException("Too large displacement 0x%x in field %s in instruction %s", d, this.disp, this);
1285 }
1286 return this.disp.setBits(inst, d);
1287 }
1288
1289 public boolean isValidDisp(int d) {
1290 return this.disp.valueFits(d);
1291 }
1292
1293 public int setAnnul(int inst, boolean a) {
1294 return BitSpec.a.setBits(inst, a ? 1 : 0);
1295 }
1296
1297 @Override
1298 protected List<BitKey[]> getKeys() {
1299 List<BitKey[]> keys = super.getKeys();
1300 keys.add(op2Key);
1301 return keys;
1302 }
1303
1304 public int getDisp(int inst) {
|
119 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Opfs.Movxtod;
120 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Opfs.UMulxhi;
121 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Ops.ArithOp;
122 import static org.graalvm.compiler.asm.sparc.SPARCAssembler.Ops.LdstOp;
123 import static java.lang.String.format;
124 import static jdk.vm.ci.sparc.SPARC.CPU;
125 import static jdk.vm.ci.sparc.SPARC.FPUd;
126 import static jdk.vm.ci.sparc.SPARC.FPUs;
127 import static jdk.vm.ci.sparc.SPARC.g0;
128 import static jdk.vm.ci.sparc.SPARC.g2;
129 import static jdk.vm.ci.sparc.SPARC.g5;
130 import static jdk.vm.ci.sparc.SPARC.g7;
131 import static jdk.vm.ci.sparc.SPARC.o7;
132
133 import java.util.ArrayList;
134 import java.util.HashMap;
135 import java.util.List;
136 import java.util.Map;
137
138 import org.graalvm.compiler.asm.Assembler;
139 import org.graalvm.compiler.asm.BranchTargetOutOfBoundsException;
140 import org.graalvm.compiler.asm.Label;
141 import org.graalvm.compiler.core.common.NumUtil;
142 import org.graalvm.compiler.debug.GraalError;
143
144 import jdk.vm.ci.code.Register;
145 import jdk.vm.ci.code.TargetDescription;
146 import jdk.vm.ci.meta.JavaConstant;
147 import jdk.vm.ci.meta.PlatformKind;
148 import jdk.vm.ci.sparc.SPARC;
149 import jdk.vm.ci.sparc.SPARC.CPUFeature;
150 import jdk.vm.ci.sparc.SPARCKind;
151
152 /**
153 * This class implements an assembler that can encode most SPARC instructions.
154 */
155 public abstract class SPARCAssembler extends Assembler {
156
157 /**
158 * Constructs an assembler for the SPARC architecture.
159 */
160 public SPARCAssembler(TargetDescription target) {
161 super(target);
1264 }
1265
1266 @Override
1267 protected int setBits(int word) {
1268 return BitSpec.op2.setBits(super.setBits(word), op2.value);
1269 }
1270
1271 protected int setDisp(int inst, SPARCMacroAssembler masm, Label lab) {
1272 if (lab.isBound()) {
1273 int d = (lab.position() - masm.position()) / 4;
1274 return setDisp(inst, d);
1275 } else {
1276 masm.patchUnbound(lab);
1277 return inst;
1278 }
1279 }
1280
1281 public int setDisp(int inst, int d) {
1282 assert this.match(inst);
1283 if (!isValidDisp(d)) {
1284 throw new BranchTargetOutOfBoundsException(true, "Too large displacement 0x%x in field %s in instruction %s", d, this.disp, this);
1285 }
1286 return this.disp.setBits(inst, d);
1287 }
1288
1289 public boolean isValidDisp(int d) {
1290 return this.disp.valueFits(d);
1291 }
1292
1293 public int setAnnul(int inst, boolean a) {
1294 return BitSpec.a.setBits(inst, a ? 1 : 0);
1295 }
1296
1297 @Override
1298 protected List<BitKey[]> getKeys() {
1299 List<BitKey[]> keys = super.getKeys();
1300 keys.add(op2Key);
1301 return keys;
1302 }
1303
1304 public int getDisp(int inst) {
|