Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Unified Diff: src/arm/macro-assembler-arm.cc

Issue 1765973002: [turbofan] Implementation of Word32PairShl on arm. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@wasm-shift
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index 80aef0c4ffefa253069de6ac66473a4ac116b2a4..936839e4eaf08cb2220d85db526d30bc17122bb7 100644
--- a/src/arm/macro-assembler-arm.cc
+++ b/src/arm/macro-assembler-arm.cc
@@ -1056,7 +1056,45 @@ void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) {
vmov(dst, VmovIndexLo, src);
}
}
+void MacroAssembler::PairLsl(Register dst_low, Register dst_high,
+ Register src_low, Register src_high,
+ Register scratch, Register shift) {
+ Label less_than_32;
martyn.capewell 2016/03/04 18:54:57 Add some register alias assertions: perhaps !AreAl
ahaas 2016/03/07 13:40:49 I enforced src_low == dst_low now in the register
+ Label done;
+ cmp_raw_immediate(shift, 32);
+ b(lt, &less_than_32);
+ eor(dst_low, dst_low, Operand(dst_low));
martyn.capewell 2016/03/04 18:54:57 mov(dst_low, Operand(0))
martyn.capewell 2016/03/04 18:54:57 Switching zero and shift operations here would all
ahaas 2016/03/07 13:40:48 Done.
+ and_(scratch, shift, Operand(0x1f));
+ lsl(dst_high, src_low, Operand(scratch));
+ jmp(&done);
+ bind(&less_than_32);
+ rsb(scratch, shift, Operand(32));
+ lsr(dst_low, src_low, Operand(scratch));
+ lsl(dst_high, src_high, Operand(shift));
+ orr(dst_high, dst_high, dst_low);
+ lsl(dst_low, src_low, Operand(shift));
martyn.capewell 2016/03/04 18:54:57 You can combine shift with orr here: lsl(dst_hig
ahaas 2016/03/07 13:40:48 Thanks, that's really helpful.
+ bind(&done);
+}
+void MacroAssembler::PairLsl(Register dst_low, Register dst_high,
+ Register src_low, Register src_high,
+ Register scratch, uint32_t shift) {
martyn.capewell 2016/03/04 18:54:57 scratch isn't used.
ahaas 2016/03/07 13:40:49 I removed it.
+ Label less_than_32;
martyn.capewell 2016/03/04 18:54:57 Add some register alias assertions. At the top lev
ahaas 2016/03/07 13:40:49 Done.
+ Label done;
+ if (shift >= 32) {
martyn.capewell 2016/03/04 18:54:57 Switch the zero and shift instructions here, so ds
ahaas 2016/03/07 13:40:49 Done.
+ eor(dst_low, dst_low, Operand(dst_low));
martyn.capewell 2016/03/04 18:54:57 mov(dst_low, Operand(0))
ahaas 2016/03/07 13:40:48 Done.
+ shift &= 0x1f;
+ lsl(dst_high, src_low, Operand(shift));
+ } else if (shift == 0) {
martyn.capewell 2016/03/04 18:54:57 Assert dst_low != src_high.
+ mov(dst_low, src_low);
martyn.capewell 2016/03/04 18:54:57 Use Move() here to eliminate redundant instruction
ahaas 2016/03/07 13:40:49 Aha, that's useful. Thanks.
+ mov(dst_high, src_high);
+ } else {
+ lsr(dst_low, src_low, Operand(32 - shift));
+ lsl(dst_high, src_high, Operand(shift));
+ orr(dst_high, dst_high, dst_low);
+ lsl(dst_low, src_low, Operand(shift));
martyn.capewell 2016/03/04 18:54:57 Combine shift with orr: lsl(dst_high, src_high,
ahaas 2016/03/07 13:40:48 Done.
+ }
+}
void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress(
Register code_target_address) {

Powered by Google App Engine
This is Rietveld 408576698