[webkit-reviews] review granted: [Bug 183740] [MIPS] Optimize JIT code generated by methods with TrustedImm32 operand : [Attachment 336038] Patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Mar 21 22:22:21 PDT 2018


Yusuke Suzuki <utatane.tea at gmail.com> has granted Stanislav Ocovaj
<stanislav.ocovaj at rt-rk.com>'s request for review:
Bug 183740: [MIPS] Optimize JIT code generated by methods with TrustedImm32
operand
https://bugs.webkit.org/show_bug.cgi?id=183740

Attachment 336038: Patch

https://bugs.webkit.org/attachment.cgi?id=336038&action=review




--- Comment #4 from Yusuke Suzuki <utatane.tea at gmail.com> ---
Comment on attachment 336038
  --> https://bugs.webkit.org/attachment.cgi?id=336038
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=336038&action=review

r=me with some comments.

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:686
> -	   if (imm.m_value == -1) {
> +	   if (imm.m_value == -1 && !m_fixedWidth) {
>	       m_assembler.nor(dest, dest, MIPSRegisters::zero);
>	       return;
>	   }
> -
> -	   /*
> -	       li  immTemp, imm
> -	       xor dest, dest, immTemp
> -	   */
> -	   move(imm, immTempRegister);
> -	   m_assembler.xorInsn(dest, dest, immTempRegister);
> +	   if (imm.m_value >= 0 && imm.m_value <= 65535 && !m_fixedWidth)
> +	       m_assembler.xori(dest, dest, imm.m_value);
> +	   else {
> +	       /*
> +		   li  immTemp, imm
> +		   xor dest, dest, immTemp
> +	       */
> +	       move(imm, immTempRegister);
> +	       m_assembler.xorInsn(dest, dest, immTempRegister);
> +	   }

Let's reorganize this code as follows,

if (!m_fixedWidth) {
    if (imm.m_value == -1) {
	...
	return;
    }

    if (imm.m_value >= 0 && imm.m_value <= 65535) {
	...;
	return;
    }
}
...;

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:704
> +	   if (imm.m_value == -1 && !m_fixedWidth) {
>	       m_assembler.nor(dest, src, MIPSRegisters::zero);
>	       return;
>	   }
> -
> -	   /*
> -	       li  immTemp, imm
> -	       xor dest, dest, immTemp
> -	   */
> -	   move(imm, immTempRegister);
> -	   m_assembler.xorInsn(dest, src, immTempRegister);
> +	   if (imm.m_value >= 0 && imm.m_value <= 65535 && !m_fixedWidth)
> +	       m_assembler.xori(dest, src, imm.m_value);
> +	   else {
> +	       /*
> +		   li  immTemp, imm
> +		   xor dest, src, immTemp
> +	       */
> +	       move(imm, immTempRegister);
> +	       m_assembler.xorInsn(dest, src, immTempRegister);
> +	   }

Ditto.

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:1628
> +	   if (!m_fixedWidth && !right.m_value)
> +	       return branch32(cond, left, MIPSRegisters::zero);
> +	   if (right.m_value >= -32768 && right.m_value <= 32767 &&
!m_fixedWidth) {

Reorganize the function as follows,

if (!m_fixedWidth) {
    ...;
}
...default path...;

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:1672
> +	       if (cond == Equal) {
> +		   move(right, immTempRegister);
> +		   return branchEqual(left, immTempRegister);
> +	       }
> +	       if (cond == NotEqual) {
> +		   move(right, immTempRegister);
> +		   return branchNotEqual(left, immTempRegister);
> +	       }
> +	       if (cond == Above) {
> +		   move(right, immTempRegister);
> +		   m_assembler.sltu(cmpTempRegister, immTempRegister, left);
> +		   return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == AboveOrEqual) {
> +		   m_assembler.sltiu(cmpTempRegister, left, right.m_value);
> +		   return branchEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == Below) {
> +		   m_assembler.sltiu(cmpTempRegister, left, right.m_value);
> +		   return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == BelowOrEqual) {
> +		   move(right, immTempRegister);
> +		   m_assembler.sltu(cmpTempRegister, immTempRegister, left);
> +		   return branchEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == GreaterThan) {
> +		   move(right, immTempRegister);
> +		   m_assembler.slt(cmpTempRegister, immTempRegister, left);
> +		   return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == GreaterThanOrEqual) {
> +		   m_assembler.slti(cmpTempRegister, left, right.m_value);
> +		   return branchEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == LessThan) {
> +		   m_assembler.slti(cmpTempRegister, left, right.m_value);
> +		   return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }
> +	       if (cond == LessThanOrEqual) {
> +		   move(right, immTempRegister);
> +		   m_assembler.slt(cmpTempRegister, immTempRegister, left);
> +		   return branchEqual(cmpTempRegister, MIPSRegisters::zero);
> +	       }

Large part of this function is the same to the default code path

move(...);
return branch32(...);

Let's add only special handling here. (AboveOrEqual, Below, GreaterThanOrEqual,
LessThan).

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:1674
> +	       ASSERT(0);
> +	       return Jump();

Remove this.

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:1768
> +	   }

Reorganize the function as follows,

if (!m_fixedWidth) {
   ...;
}
... default path ...;

> Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h:1791
> +	       mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond,
mask);

I think we should not do this here. We should create a helper function
mask8OnTest for MacroAssemblerMIPS and use it.
For example, test8 should also use it ;)


More information about the webkit-reviews mailing list