// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.code;

import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.conversion.IRBuilder;

public class MulFloat extends Format23x {

  public static final int OPCODE = 0xa8;
  public static final String NAME = "MulFloat";
  public static final String SMALI_NAME = "mul-float";

  MulFloat(int high, BytecodeStream stream) {
    super(high, stream);
  }

  public MulFloat(int dest, int left, int right) {
    super(dest, left, right);
    // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where
    // the second src register and the dst register is the same (but the first src register is
    // different). Therefore, we have to avoid generating that pattern. The bug was fixed for
    // Android M: https://android-review.googlesource.com/#/c/114932/
    assert dest != right || dest == left;
  }

  @Override
  public String getName() {
    return NAME;
  }

  @Override
  public String getSmaliName() {
    return SMALI_NAME;
  }

  @Override
  public int getOpcode() {
    return OPCODE;
  }

  @Override
  public void buildIR(IRBuilder builder) {
    builder.addMul(NumericType.FLOAT, AA, BB, CC);
  }
}
