/*
 * 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);
    }
}
