/*
 * 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.
/** * 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.
Params:
  • vectorLen –
/** * 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.
/** * 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.
Params:
  • state –
/** * 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.
/** * 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.
/** * 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.
Params:
  • value –
/** * 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).
/** * 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.
/** * 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); } }