view graal/com.oracle.max.asmdis/src/com/sun/max/asm/gen/risc/ppc/PPCFields.java @ 4142:bc8527f3071c

Adjust code base to new level of warnings.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 18 Dec 2011 05:24:06 +0100
parents e233f5660da4
children
line wrap: on
line source

/*
 * Copyright (c) 2007, 2011, 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 com.sun.max.asm.gen.risc.ppc;

import static com.sun.max.asm.gen.InstructionConstraint.Static.*;
import static com.sun.max.asm.ppc.BOOperand.*;

import com.sun.max.asm.gen.*;
import com.sun.max.asm.gen.risc.*;
import com.sun.max.asm.gen.risc.bitRange.*;
import com.sun.max.asm.gen.risc.field.*;
import com.sun.max.asm.ppc.*;
import com.sun.max.lang.*;

/**
 * The fields used in defining the PowerPC instruction templates.
 */
final class PPCFields {

    private PPCFields() {
    }

    /**
     * RA field that can also accept the constant 0.
     */
    public static final SymbolicOperandField<ZeroOrRegister> ra0 = SymbolicOperandField.createAscending(ZeroOrRegister.symbolizer(), 11, 15).setVariableName("ra");

    public static RiscConstant ra0(ZeroOrRegister value) {
        return ra0.constant(value);
    }

    /**
     * RA field that can only accept GPR symbols.
     */
    public static final SymbolicOperandField<GPR> ra = SymbolicOperandField.createAscending(GPR.GPR_SYMBOLIZER, 11, 15);

    public static RiscConstant ra(GPR value) {
        return ra.constant(value);
    }

    /**
     * GPR symbol RA field with constraint: RA != GPR.R0.
     */
    public static final Object[] ra_notR0 = {ra, ne(ra, GPR.R0)};

    /**
     * GPR symbol or 0 RA field with constraint: RA != GPR.R0.
     */
    public static final Object[] ra0_notR0 = {ra0, ne(ra0, GPR.R0)};

    public static final SymbolicOperandField<GPR> rb = SymbolicOperandField.createAscending(GPR.GPR_SYMBOLIZER, 16, 20);

    public static RiscConstant rb(GPR value) {
        return rb.constant(value);
    }

    public static RiscConstant rs(GPR value) {
        return rs.constant(value);
    }

    public static SymbolicOperandField<GPR> rs(Expression expression) {
        return rs.bindTo(expression);
    }

    public static final SymbolicOperandField<GPR> rs = SymbolicOperandField.createAscending(GPR.GPR_SYMBOLIZER, 6, 10);
    public static final SymbolicOperandField<GPR> rt = SymbolicOperandField.createAscending(GPR.GPR_SYMBOLIZER, 6, 10);

    /**
     * GPR symbol RA field with constraint: RA != GPR.R0 && RA != RT.
     */
    public static final Object[] ra_notR0_notRT = {ra, ne(ra, GPR.R0), ne(ra, rt)};

    /**
     * GCP symbol or 0 RA field with constraint: RA != GPR.R0 && RA < RT.
     */
    public static final Object[] ra0_notR0_ltRT = {ra0, ne(ra0, GPR.R0), lt(ra0, rt)};

    public static final SymbolicOperandField<CRF> bf = SymbolicOperandField.createAscending(CRF.ENUMERATOR, 6, 8);

    public static RiscConstant bf(CRF value) {
        return bf.constant(value);
    }

    public static final SymbolicOperandField<CRF> bfa = SymbolicOperandField.createAscending(CRF.ENUMERATOR, 11, 13);
    public static final SymbolicOperandField<CRF> br_crf = SymbolicOperandField.createAscending(CRF.ENUMERATOR, 11, 13).setVariableName("crf");

    public static final ImmediateOperandField spr = ImmediateOperandField.createAscending(16, 20, 11, 15);

    public static final SymbolicOperandField<FPR> frt = SymbolicOperandField.createAscending(FPR.ENUMERATOR, 6, 10);
    public static final SymbolicOperandField<FPR> frs = SymbolicOperandField.createAscending(FPR.ENUMERATOR, 6, 10);
    public static final SymbolicOperandField<FPR> fra = SymbolicOperandField.createAscending(FPR.ENUMERATOR, 11, 15);
    public static final SymbolicOperandField<FPR> frb = SymbolicOperandField.createAscending(FPR.ENUMERATOR, 16, 20);
    public static final SymbolicOperandField<FPR> frc = SymbolicOperandField.createAscending(FPR.ENUMERATOR, 21, 25);

    public static final SymbolicOperandField<BOOperand> bo = SymbolicOperandField.createAscending(BOOperand.SYMBOLIZER, 6, 10);

    public static RiscConstant bo(BOOperand value) {
        return bo.constant(value);
    }

    public static final ImmediateOperandField d = ImmediateOperandField.createAscending(16, 31).beSigned();
    public static final ImmediateOperandField ds = new AlignedImmediateOperandField(new AscendingBitRange(16, 29), 2).beSigned();
    public static final ImmediateOperandField si = ImmediateOperandField.createAscending(16, 31).beSigned();
    public static final ImmediateOperandField sis = ImmediateOperandField.createAscending(16, 31).beSignedOrUnsigned();
    public static final ImmediateOperandField ui = ImmediateOperandField.createAscending(16, 31);
    public static final ImmediateOperandField to = ImmediateOperandField.createAscending(6, 10);
    public static final ImmediateOperandField sh64 = ImmediateOperandField.createAscending(30, 30, 16, 20).setVariableName("sh");
    public static final ImmediateOperandField mb64 = ImmediateOperandField.createAscending(26, 26, 21, 25).setVariableName("mb");
    public static final ImmediateOperandField me64 = ImmediateOperandField.createAscending(26, 26, 21, 25).setVariableName("me");
    public static final ImmediateOperandField sh = ImmediateOperandField.createAscending(16, 20);
    public static final ImmediateOperandField mb = ImmediateOperandField.createAscending(21, 25);
    public static final ImmediateOperandField me = ImmediateOperandField.createAscending(26, 30);
    public static final ImmediateOperandField fxm = ImmediateOperandField.createAscending(12, 19);
    public static final ImmediateOperandField bi = ImmediateOperandField.createAscending(11, 15);
    public static final ImmediateOperandField bt = ImmediateOperandField.createAscending(6, 10);
    public static final ImmediateOperandField ba = ImmediateOperandField.createAscending(11, 15);
    public static final ImmediateOperandField bb = ImmediateOperandField.createAscending(16, 20);
    public static final ImmediateOperandField u = ImmediateOperandField.createAscending(16, 19);
    public static final ImmediateOperandField flm = ImmediateOperandField.createAscending(7, 14);
    public static final ImmediateOperandField l = ImmediateOperandField.createAscending(10, 10);

    private static final ImmediateOperandField bh_raw = ImmediateOperandField.createAscending(19, 20).setVariableName("bh");
    public static final Object[] bh = {bh_raw, InstructionConstraint.Static.ne(bh_raw, 2)};

    public static final ImmediateOperandField nb = ImmediateOperandField.createAscending(16, 20);
    public static final ImmediateOperandField numBits64 = ImmediateOperandField.createAscending(0, 5);
    public static final ImmediateOperandField numBits32 = ImmediateOperandField.createAscending(0, 4);

    public static final ImmediateOperandField byte0 = ImmediateOperandField.createAscending(0, 7);
    public static final ImmediateOperandField byte1 = ImmediateOperandField.createAscending(8, 15);
    public static final ImmediateOperandField byte2 = ImmediateOperandField.createAscending(16, 23);
    public static final ImmediateOperandField byte3 = ImmediateOperandField.createAscending(24, 31);

    public static final InputOperandField val = InputOperandField.create(si);
    public static final InputOperandField n = InputOperandField.create(sh);
    public static final InputOperandField b = InputOperandField.create(sh);
    public static final InputOperandField n64 = InputOperandField.create(sh64).setVariableName("n");
    public static final InputOperandField b64 = InputOperandField.create(sh64).setVariableName("b");

    public static RiscConstant to(int value) {
        return to.constant(value);
    }

    public static RiscConstant sh(int value) {
        return sh.constant(value);
    }

    public static RiscConstant mb(int value) {
        return mb.constant(value);
    }

    public static RiscConstant me(int value) {
        return me.constant(value);
    }

    public static RiscConstant sh64(int value) {
        return sh64.constant(value);
    }

    public static RiscConstant mb64(int value) {
        return mb64.constant(value);
    }

    public static RiscConstant me64(int value) {
        return me64.constant(value);
    }

    public static RiscConstant fxm(int value) {
        return fxm.constant(value);
    }

    public static RiscConstant bi(int value) {
        return bi.constant(value);
    }

    public static RiscConstant ui(int value) {
        return ui.constant(value);
    }

    public static RiscConstant si(int value) {
        return si.constant(value);
    }

    public static RiscConstant sis(int value) {
        return sis.constant(value);
    }

    public static RiscConstant bh(int value) {
        return bh_raw.constant(value);
    }

    public static RiscConstant l(int value) {
        return l.constant(value);
    }

    public static ImmediateOperandField bb(Expression expression) {
        return bb.bindTo(expression);
    }

    public static ImmediateOperandField bt(Expression expression) {
        return bt.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> si(Expression expression) {
        return si.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> sh(Expression expression) {
        return sh.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> me(Expression expression) {
        return me.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> mb(Expression expression) {
        return mb.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> sh64(Expression expression) {
        return sh64.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> me64(Expression expression) {
        return me64.bindTo(expression);
    }

    public static OperandField<ImmediateArgument> mb64(Expression expression) {
        return mb64.bindTo(expression);
    }

    public static final BranchDisplacementOperandField li = BranchDisplacementOperandField.createAscendingBranchDisplacementOperandField(6, 29);
    public static final BranchDisplacementOperandField bd = BranchDisplacementOperandField.createAscendingBranchDisplacementOperandField(16, 29);

    private static final ConstantField bit_11 = ConstantField.createAscending(11, 11);

    public static RiscConstant bit_11(int value) {
        return bit_11.constant(value);
    }

    private static final ConstantField bit_30 = ConstantField.createAscending(30, 30);

    public static RiscConstant bit_30(int value) {
        return bit_30.constant(value);
    }

    private static final ConstantField bit_31 = ConstantField.createAscending(31, 31);

    public static RiscConstant bit_31(int value) {
        return bit_31.constant(value);
    }

    private static final ConstantField opcd = ConstantField.createAscending(0,  5);

    public static RiscConstant opcd(int value) {
        return opcd.constant(value);
    }

    private static final ConstantField xo_21_29 = ConstantField.createAscending(21, 29);

    public static RiscConstant xo_21_29(int value) {
        return xo_21_29.constant(value);
    }

    private static final ConstantField xo_21_30 = ConstantField.createAscending(21, 30);

    public static RiscConstant xo_21_30(int value) {
        return xo_21_30.constant(value);
    }

    private static final ConstantField xo_22_30 = ConstantField.createAscending(22, 30);

    public static RiscConstant xo_22_30(int value) {
        return xo_22_30.constant(value);
    }

    private static final ConstantField xo_27_29 = ConstantField.createAscending(27, 29);

    public static RiscConstant xo_27_29(int value) {
        return xo_27_29.constant(value);
    }

    private static final ConstantField xo_26_30 = ConstantField.createAscending(26, 30);

    public static RiscConstant xo_26_30(int value) {
        return xo_26_30.constant(value);
    }

    private static final ConstantField xo_27_30 = ConstantField.createAscending(27, 30);

    public static RiscConstant xo_27_30(int value) {
        return xo_27_30.constant(value);
    }

    private static final ConstantField xo_30_31 = ConstantField.createAscending(30, 31);

    public static RiscConstant xo_30_31(int value) {
        return xo_30_31.constant(value);
    }

    public static final ReservedField res_6 = ReservedField.createAscending(6,  6);
    public static final ReservedField res_6_10 = ReservedField.createAscending(6, 10);
    public static final ReservedField res_9 = ReservedField.createAscending(9,  9);
    public static final ReservedField res_9_10 = ReservedField.createAscending(9, 10);
    public static final ReservedField res_11 = ReservedField.createAscending(11, 11);
    public static final ReservedField res_11_15 = ReservedField.createAscending(11, 15);
    public static final ReservedField res_12_20 = ReservedField.createAscending(12, 20);
    public static final ReservedField res_14_15 = ReservedField.createAscending(14, 15);
    public static final ReservedField res_15 = ReservedField.createAscending(15, 15);
    public static final ReservedField res_16_20 = ReservedField.createAscending(16, 20);
    public static final ReservedField res_16_18 = ReservedField.createAscending(16, 18);
    public static final ReservedField res_16_29 = ReservedField.createAscending(16, 29);
    public static final ReservedField res_20 = ReservedField.createAscending(20, 20);
    public static final ReservedField res_21 = ReservedField.createAscending(21, 21);
    public static final ReservedField res_21_25 = ReservedField.createAscending(21, 25);
    public static final ReservedField res_31 = ReservedField.createAscending(31, 31);

    public static final OptionField oe = OptionField.createAscending(21, 21).withOption("", 0).withOption("o", 1);
    public static final OptionField rc = OptionField.createAscending(31, 31).withOption("", 0).withOption("_", 1, ".");
    public static final OptionField lk = OptionField.createAscending(31, 31).withOption("", 0).withOption("l", 1);
    public static final OptionField aa = OptionField.createAscending(30, 30).withOption("", 0).withOption("a", 1);

    public static RiscConstant lk(int value) {
        return lk.constant(value);
    }

    public static final OptionField to_option = OptionField.createAscending(6, 10).
        withOption("lt", 16).
        withOption("le", 20).
        withOption("eq", 4).
        withOption("ge", 12).
        withOption("gt", 8).
        withOption("nl", 12).
        withOption("ne", 24).
        withOption("ng", 20).
        withOption("llt", 2).
        withOption("lle", 6).
        withOption("lge", 5).
        withOption("lgt", 1).
        withOption("lnl", 5).
        withOption("lng", 6);

    public static final OptionField spr_option = OptionField.createAscending(16, 20, 11, 15).
        withOption("xer", SPR.XER).
        withOption("lr", SPR.LR).
        withOption("ctr", SPR.CTR);

    private static OptionField createSuffixField(String suffix) {
        // When using option fields, we sometimes need a suffix in the mnemonic AFTER the option field.
        // We can construct this using option field with one option and no bits in it.
        return OptionField.createAscending(-1).withOption(suffix, 0);
    }

    public static final OptionField put_i_in_name = createSuffixField("i");
    public static final OptionField put_lr_in_name = createSuffixField("lr");
    public static final OptionField put_ctr_in_name = createSuffixField("ctr");

    private static int boTrue(int crValue) {
        return CRTrue.value() | crValue;
    }

    private static int boFalse(int crValue) {
        return CRFalse.value() | crValue;
    }

    public static final OptionField branch_conds = OptionField.createAscending(6, 8, 14, 15).
        withOption("lt", boTrue(CRF.LT)).
        withOption("le", boFalse(CRF.GT)).
        withOption("eq", boTrue(CRF.EQ)).
        withOption("ge", boFalse(CRF.LT)).
        withOption("gt", boTrue(CRF.GT)).
        withOption("nl", boFalse(CRF.LT)).
        withOption("ne", boFalse(CRF.EQ)).
        withOption("ng", boFalse(CRF.GT)).
        withOption("so", boTrue(CRF.SO)).
        withOption("ns", boFalse(CRF.SO)).
        withOption("un", boTrue(CRF.UN)).
        withOption("nu", boFalse(CRF.UN));

    /**
     * An OptionField for the BO values that are in terms of the Count Register (CTR) and a bit in the Condition Register (CR).
     */
    public static final OptionField bo_CTR_and_CR = OptionField.createAscending(6, 10).
        withOption("dnzt", CTRNonZero_CRTrue).
        withOption("dnzf", CTRNonZero_CRFalse).
        withOption("dzt", CTRZero_CRTrue).
        withOption("dzf", CTRZero_CRFalse);

    /**
     * An OptionField for the BO values that are only in terms of the Count Register (CTR) and don't include the prediction bits.
     */
    public static final OptionField bo_CTR = OptionField.createAscending(6, 6, 8, 9).
        withOption("dnz", CTRNonZero.valueWithoutPredictionBits()).
        withOption("dz", CTRZero.valueWithoutPredictionBits());

    /**
     * An OperandField for the prediction bits in the BO values that are only in terms of a bit in the Condition Register (CR).
     */
    public static final SymbolicOperandField<BranchPredictionBits> bo_CR_prediction = SymbolicOperandField.createAscending(BranchPredictionBits.SYMBOLIZER, 9, 10).setVariableName("prediction");

    /**
     * An OperandField for the prediction bits in the BO values that are only in terms of a bit in the Count Register (CTR).
     */
    public static final SymbolicOperandField<BranchPredictionBits> bo_CTR_prediction = SymbolicOperandField.createAscending(BranchPredictionBits.SYMBOLIZER, 7, 7, 10, 10).setVariableName("prediction");

    /**
     * An OptionField for the prediction bits in the BO values that are only in terms of a bit in the Condition Register (CR).
     */
    public static final OptionField bo_CTR_prediction_option = OptionField.createAscending(9, 10).
        withOption("", BranchPredictionBits.NONE).
        withOption("_pt", BranchPredictionBits.PT).
        withOption("_pn", BranchPredictionBits.PN);

    /**
     * An OptionField for the BO values that are only in terms of a bit in the Condition Register (CR) and don't include the prediction bits.
     */
    public static final OptionField bo_CR = OptionField.createAscending(6, 8).
        withOption("t", CRTrue.valueWithoutPredictionBits()).
        withOption("f", CRFalse.valueWithoutPredictionBits());

    /**
     * An OptionField for the prediction bits in the BO values that are only in terms of a bit in the Condition Register (CR).
     */
    public static final OptionField bo_CR_prediction_option = OptionField.createAscending(7, 7, 10, 10).
        withOption("", BranchPredictionBits.NONE).
        withOption("_pt", BranchPredictionBits.PT).
        withOption("_pn", BranchPredictionBits.PN);

    static {
        StaticFieldName.Static.initialize(PPCFields.class, new StaticFieldName.StringFunction() {
            public String function(String name) {
                if (name.startsWith("_")) {
                    return name.substring(1);
                }
                return name;
            }
        });
    }
}