/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_SRC_GREENLAND_DALVIK_REG_H_
#define ART_SRC_GREENLAND_DALVIK_REG_H_

#include "backend_types.h"

#include <stdint.h>
#include <string>

namespace llvm {
  class Type;
  class Value;
}

namespace art {
namespace greenland {

class IRBuilder;
class DexLang;

class DalvikReg {
 public:
  static llvm::Type* GetRegCategoryEquivSizeTy(IRBuilder& irb, RegCategory reg_cat);

  static char GetRegCategoryNamePrefix(RegCategory reg_cat);

  DalvikReg(DexLang& dex_lang, unsigned reg_idx);

  ~DalvikReg();

  llvm::Value* GetValue(JType jty, JTypeSpace space);

  llvm::Value* GetValue(char shorty, JTypeSpace space) {
    return GetValue(GetJTypeFromShorty(shorty), space);
  }

  void SetValue(JType jty, JTypeSpace space, llvm::Value* value);

  void SetValue(char shorty, JTypeSpace space, llvm::Value* value) {
    return SetValue(GetJTypeFromShorty(shorty), space, value);
  }

 private:
  llvm::Value* GetAddr(JType jty);

  llvm::Value* RegCat1SExt(llvm::Value* value);
  llvm::Value* RegCat1ZExt(llvm::Value* value);

  llvm::Value* RegCat1Trunc(llvm::Value* value, llvm::Type* ty);

  DexLang& dex_lang_;
  IRBuilder& irb_;

  unsigned reg_idx_;

  llvm::Value* reg_32_;
  llvm::Value* reg_64_;
  llvm::Value* reg_obj_;
};

} // namespace greenland
} // namespace art

#endif // ART_SRC_GREENLAND_DALVIK_REG_H_
