您的位置:首页 > 编程语言

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 , 平均值:

由以上数据看出,无法判断有无提升。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: