18a151ae671f6d5c99d55779005580834b49187f0Ben Gruver/*
28a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * Copyright 2013, Google Inc.
38a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * All rights reserved.
48a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *
58a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * Redistribution and use in source and binary forms, with or without
68a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * modification, are permitted provided that the following conditions are
78a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * met:
88a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *
98a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *     * Redistributions of source code must retain the above copyright
108a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * notice, this list of conditions and the following disclaimer.
118a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *     * Redistributions in binary form must reproduce the above
128a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * copyright notice, this list of conditions and the following disclaimer
138a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * in the documentation and/or other materials provided with the
148a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * distribution.
158a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *     * Neither the name of Google Inc. nor the names of its
168a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * contributors may be used to endorse or promote products derived from
178a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * this software without specific prior written permission.
188a151ae671f6d5c99d55779005580834b49187f0Ben Gruver *
198a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
208a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
218a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
228a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
238a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
248a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
258a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
268a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
278a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
288a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
298a151ae671f6d5c99d55779005580834b49187f0Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
308a151ae671f6d5c99d55779005580834b49187f0Ben Gruver */
318a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
328a151ae671f6d5c99d55779005580834b49187f0Ben Gruverpackage org.jf.dexlib2.immutable.instruction;
338a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
348a151ae671f6d5c99d55779005580834b49187f0Ben Gruverimport org.jf.dexlib2.Format;
358a151ae671f6d5c99d55779005580834b49187f0Ben Gruverimport org.jf.dexlib2.Opcode;
368a151ae671f6d5c99d55779005580834b49187f0Ben Gruverimport org.jf.dexlib2.iface.instruction.formats.Instruction35ms;
378a151ae671f6d5c99d55779005580834b49187f0Ben Gruverimport org.jf.dexlib2.util.Preconditions;
388a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
398a151ae671f6d5c99d55779005580834b49187f0Ben Gruverimport javax.annotation.Nonnull;
408a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
418a151ae671f6d5c99d55779005580834b49187f0Ben Gruverpublic class ImmutableInstruction35ms extends ImmutableInstruction implements Instruction35ms {
428a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    public static final Format FORMAT = Format.Format35ms;
438a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
448a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerCount;
458a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerC;
468a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerD;
478a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerE;
488a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerF;
498a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    protected final int registerG;
50f320ed52934bd63d5f8071624a477f1b3332cd5dBen Gruver    protected final int vtableIndex;
518a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
528a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    public ImmutableInstruction35ms(@Nonnull Opcode opcode,
538a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerCount,
548a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerC,
558a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerD,
568a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerE,
578a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerF,
588a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int registerG,
598a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                                    int vtableIndex) {
608a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        super(opcode);
618a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerCount = Preconditions.check35cRegisterCount(registerCount);
628a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
638a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
648a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
658a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
668a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
678a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        this.vtableIndex = Preconditions.checkVtableIndex(vtableIndex);
688a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    }
698a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
708a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    public static ImmutableInstruction35ms of(Instruction35ms instruction) {
718a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        if (instruction instanceof ImmutableInstruction35ms) {
728a151ae671f6d5c99d55779005580834b49187f0Ben Gruver            return (ImmutableInstruction35ms)instruction;
738a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        }
748a151ae671f6d5c99d55779005580834b49187f0Ben Gruver        return new ImmutableInstruction35ms(
758a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getOpcode(),
768a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterCount(),
778a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterC(),
788a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterD(),
798a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterE(),
808a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterF(),
818a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getRegisterG(),
828a151ae671f6d5c99d55779005580834b49187f0Ben Gruver                instruction.getVtableIndex());
838a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    }
848a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
858a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterCount() { return registerCount; }
868a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterC() { return registerC; }
878a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterD() { return registerD; }
888a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterE() { return registerE; }
898a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterF() { return registerF; }
908a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getRegisterG() { return registerG; }
918a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public int getVtableIndex() { return vtableIndex; }
928a151ae671f6d5c99d55779005580834b49187f0Ben Gruver
938a151ae671f6d5c99d55779005580834b49187f0Ben Gruver    @Override public Format getFormat() { return FORMAT; }
948a151ae671f6d5c99d55779005580834b49187f0Ben Gruver}
95