ART中添加 neg.s neg.d 指令及相关代码
2016-04-13 23:16
274 查看
一.android 5.0 中添加neg.s neg.d指令的代码:
修改 build/core/main.mk 文件中 dalvik.vm.dex2oat-filter = interpret-only
为 speed , 重新编译.
添加指令的代码:
文件compiler/dex/quick/mips/mips_lir.h :
enum MipsOpCode {
...
kMipsFnegs, // neg.s d,s [01000110000] [00000] s[15..11] d[10..6] [000111].
kMipsFnegd, // neg.d d,s [01000110001] [00000] s[15..11] d[10..6] [000111].
...
}
文件compiler/dex/quick/mips/assemble_mips.cc :
const MipsEncodingMap MipsMir2Lir::EncodingMap[kMipsLast] = {
...
//neg.s
ENCODING_MAP(kMipsFnegs, 0x46000007,
kFmtSfp, 10, 6, kFmtSfp, 15, 11, kFmtUnused, -1, -1,
kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
"neg.s", "!0s,!1s", 4),
//neg.d
ENCODING_MAP(kMipsFnegd, 0x46200007,
kFmtDfp, 10, 6, kFmtDfp, 15, 11, kFmtUnused, -1, -1,
kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
"neg.d", "!0S,!1S", 4),
...
};
文件compiler/dex/quick/mips/fp_mips.cc中:
void MipsMir2Lir::GenArithOpFloat(...) {
...
case Instruction::NEG_FLOAT:
// GenNegFloat(rl_dest, rl_src1);
op = kMipsFnegs;
rl_src1 = LoadValue(rl_src1, kFPReg);
rl_result = EvalLoc(rl_dest, kFPReg, true);
NewLIR2(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg());
StoreValue(rl_dest, rl_result);
return;
...
}
void MipsMir2Lir::GenArithOpDouble(...) {
...
case Instruction::NEG_DOUBLE:
// GenNegDouble(rl_dest, rl_src1);
op = kMipsFnegd;
rl_src1 = LoadValueWide(rl_src1, kFPReg);
DCHECK( rl_src1.wide ) ;
rl_result = EvalLoc(rl_dest, kFPReg, true);
DCHECK( rl_dest.wide ) ;
DCHECK( rl_result.wide ) ;
NewLIR2(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg());
StoreValueWide(rl_dest, rl_result);
return;
...
}
测试代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView message = new TextView(this);
float a = 2.71828F;
long start1 = System.currentTimeMillis();
for(long i = 0; i < 1000000000L; i++) {
float b = 0.0F;
b = -a;
}
long start2 = System.currentTimeMillis();
double c = 3.1415926535898;
long start3 = System.currentTimeMillis();
for(long i = 0; i < 1000000000L; i++) {
double d = 0.0;
d = -c;
}
long start4 = System.currentTimeMillis();
message.setText("neg.s took" + (start2 - start1) / 1000f + "seconds, neg.d took" + (start4 - start3) / 1000f + "seconds");
setContentView(message);
}
测试结果:
interpret-only模式:
neg-float: 236.818 s , 238.114 s , 237.613 s , 237.253 s , 237.088 s , 236.985 s , 237.722 s , 平均值: s
neg-double: 249.562 s , 249.481 s , 249.193 s , 249.331 s , 249.598 s , 249.504 s , 249.193 s , 平均值: s
speed模式:
添加指令前:
neg-float: 236.873 s , , 236.831 s , 236.758 s , 236.919 s , 236.66 s , 平均值:
neg-double: 249.568 s , 249.339 s , 249.37 s , 249.356 s ,249.262 s , 平均值:
添加指令后:
neg-float: 236.904 s , 236.737 s , 236.747 s , 236.821 s , 236.767 s , 平均值:
neg-double: 249.829 s , 249.445 s , 249.547 s , 249.405 s , 249.466 s , 平均值:
由以上数据看出,无法判断有无提升。
修改 build/core/main.mk 文件中 dalvik.vm.dex2oat-filter = interpret-only
为 speed , 重新编译.
添加指令的代码:
文件compiler/dex/quick/mips/mips_lir.h :
enum MipsOpCode {
...
kMipsFnegs, // neg.s d,s [01000110000] [00000] s[15..11] d[10..6] [000111].
kMipsFnegd, // neg.d d,s [01000110001] [00000] s[15..11] d[10..6] [000111].
...
}
文件compiler/dex/quick/mips/assemble_mips.cc :
const MipsEncodingMap MipsMir2Lir::EncodingMap[kMipsLast] = {
...
//neg.s
ENCODING_MAP(kMipsFnegs, 0x46000007,
kFmtSfp, 10, 6, kFmtSfp, 15, 11, kFmtUnused, -1, -1,
kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
"neg.s", "!0s,!1s", 4),
//neg.d
ENCODING_MAP(kMipsFnegd, 0x46200007,
kFmtDfp, 10, 6, kFmtDfp, 15, 11, kFmtUnused, -1, -1,
kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0_USE1,
"neg.d", "!0S,!1S", 4),
...
};
文件compiler/dex/quick/mips/fp_mips.cc中:
void MipsMir2Lir::GenArithOpFloat(...) {
...
case Instruction::NEG_FLOAT:
// GenNegFloat(rl_dest, rl_src1);
op = kMipsFnegs;
rl_src1 = LoadValue(rl_src1, kFPReg);
rl_result = EvalLoc(rl_dest, kFPReg, true);
NewLIR2(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg());
StoreValue(rl_dest, rl_result);
return;
...
}
void MipsMir2Lir::GenArithOpDouble(...) {
...
case Instruction::NEG_DOUBLE:
// GenNegDouble(rl_dest, rl_src1);
op = kMipsFnegd;
rl_src1 = LoadValueWide(rl_src1, kFPReg);
DCHECK( rl_src1.wide ) ;
rl_result = EvalLoc(rl_dest, kFPReg, true);
DCHECK( rl_dest.wide ) ;
DCHECK( rl_result.wide ) ;
NewLIR2(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg());
StoreValueWide(rl_dest, rl_result);
return;
...
}
测试代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView message = new TextView(this);
float a = 2.71828F;
long start1 = System.currentTimeMillis();
for(long i = 0; i < 1000000000L; i++) {
float b = 0.0F;
b = -a;
}
long start2 = System.currentTimeMillis();
double c = 3.1415926535898;
long start3 = System.currentTimeMillis();
for(long i = 0; i < 1000000000L; i++) {
double d = 0.0;
d = -c;
}
long start4 = System.currentTimeMillis();
message.setText("neg.s took" + (start2 - start1) / 1000f + "seconds, neg.d took" + (start4 - start3) / 1000f + "seconds");
setContentView(message);
}
测试结果:
interpret-only模式:
neg-float: 236.818 s , 238.114 s , 237.613 s , 237.253 s , 237.088 s , 236.985 s , 237.722 s , 平均值: s
neg-double: 249.562 s , 249.481 s , 249.193 s , 249.331 s , 249.598 s , 249.504 s , 249.193 s , 平均值: s
speed模式:
添加指令前:
neg-float: 236.873 s , , 236.831 s , 236.758 s , 236.919 s , 236.66 s , 平均值:
neg-double: 249.568 s , 249.339 s , 249.37 s , 249.356 s ,249.262 s , 平均值:
添加指令后:
neg-float: 236.904 s , 236.737 s , 236.747 s , 236.821 s , 236.767 s , 平均值:
neg-double: 249.829 s , 249.445 s , 249.547 s , 249.405 s , 249.466 s , 平均值:
由以上数据看出,无法判断有无提升。
相关文章推荐
- Spring Mvc简介
- lua 游戏中数字转字符串的函数
- 20145214实验二 Java面向对象程序设计
- 配置Notepad++直接运行Python、Perl、C、C++、Java
- java获取文件名的三种方法
- Java中的原子性与并发编程总结
- 编码-京东实习笔试编程题-糖果问题-动态规划
- c++作业3
- Python简介
- python分析mysql-binlog,统计时间段内各表的操作次数_2016041302
- C++学习篇——纯虚函数和抽象类
- 20145122《Java面向对象程序设计》实验二实验报告
- 319. Bulb Switcher
- 几个Python中的基础算法
- 利用Python进行数据分析笔记(一
- python_发送邮件
- Hough变换检测直线的Java实现
- [温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端
- 【慕课笔记】3-4 应用SAX方式解析XML—使用SAX解析将XML的内容和结构存入JAVA对象
- Python 爬验证码