ART中添加 neg.s neg.d 指令及相关代码

本文介绍在Android 5.0中如何通过修改源代码添加neg.s和neg.d浮点数运算指令,并对比不同模式下执行效率的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


由以上数据看出,无法判断有无提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值