blob: 7dba7d043746ca04c8f60926e249e4cc431f228a [file] [log] [blame]
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.asm.amd64;
import jdk.vm.ci.amd64.AMD64;
import jdk.vm.ci.amd64.AMD64.CPUFeature;
import jdk.vm.ci.code.TargetDescription;
/**
* Attributes for instructions for SSE through EVEX, also including address components.
*/
public class AMD64InstructionAttr {
AMD64InstructionAttr(
int inVectorLen,
boolean inRexVexW,
boolean inLegacyMode,
boolean inNoRegMask,
boolean inUsesVl,
TargetDescription target) {
avxVectorLen = inVectorLen;
rexVexW = inRexVexW;
this.target = target;
legacyMode = (!supports(CPUFeature.AVX512F)) ? true : inLegacyMode;
noRegMask = inNoRegMask;
usesVl = inUsesVl;
rexVexWReverted = false;
tupleType = 0;
inputSizeInBits = 0;
isEvexInstruction = false;
evexEncoding = 0;
isClearContext = false;
isExtendedContext = false;
}
private TargetDescription target;
private int avxVectorLen;
private boolean rexVexW;
private boolean rexVexWReverted;
private boolean legacyMode;
private boolean noRegMask;
private boolean usesVl;
private int tupleType;
private int inputSizeInBits;
private boolean isEvexInstruction;
private int evexEncoding;
private boolean isClearContext;
private boolean isExtendedContext;
public int getVectorLen() {
return avxVectorLen;
}
public boolean isRexVexW() {
return rexVexW;
}
public boolean isRexVexWReverted() {
return rexVexWReverted;
}
public boolean isLegacyMode() {
return legacyMode;
}
public boolean isNoRegMask() {
return noRegMask;
}
public boolean usesVl() {
return usesVl;
}
public int getTupleType() {
return tupleType;
}
public int getInputSize() {
return inputSizeInBits;
}
public boolean isEvexInstruction() {
return isEvexInstruction;
}
public int getEvexEncoding() {
return evexEncoding;
}
public boolean isClearContext() {
return isClearContext;
}
public boolean isExtendedContext() {
return isExtendedContext;
}
/**
* Set the vector length of a given instruction.
*
* @param vectorLen
*/
public void setVectorLen(int vectorLen) {
avxVectorLen = vectorLen;
}
/**
* In EVEX it is possible in blended code generation to revert the encoding width for AVX.
*/
public void setRexVexWReverted() {
rexVexWReverted = true;
}
/**
* Alter the current encoding width.
*
* @param state
*/
public void setRexVexW(boolean state) {
rexVexW = state;
}
/**
* Alter the current instructions legacy mode. Blended code generation will use this.
*/
public void setLegacyMode() {
legacyMode = true;
}
/**
* During emit or during definition of an instruction, mark if it is EVEX.
*/
public void setIsEvexInstruction() {
isEvexInstruction = true;
}
/**
* Set the current encoding attributes to be used in address calculations for EVEX.
*
* @param value
*/
public void setEvexEncoding(int value) {
evexEncoding = value;
}
/**
* Use clear context for this instruction in EVEX, defaults is merge(false).
*/
public void setIsClearContext() {
isClearContext = true;
}
/**
* Set the address attributes for configuring displacement calculations in EVEX.
*/
public void setAddressAttributes(int inTupleType, int inInputSizeInBits) {
if (supports(CPUFeature.AVX512F)) {
tupleType = inTupleType;
inputSizeInBits = inInputSizeInBits;
}
}
private boolean supports(CPUFeature feature) {
return ((AMD64) target.arch).getFeatures().contains(feature);
}
}