Index: src/mips64/macro-assembler-mips64.cc |
diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc |
index d1d84ba40870f813dcb62ddb887b462c9263dd07..504cf020c5e08eae60fcc0b68bf0da61577c69a0 100644 |
--- a/src/mips64/macro-assembler-mips64.cc |
+++ b/src/mips64/macro-assembler-mips64.cc |
@@ -1758,11 +1758,28 @@ void MacroAssembler::Ext(Register rt, |
ext_(rt, rs, pos, size); |
} |
+void MacroAssembler::ExtractBits(Register rt, Register rs, uint16_t pos, |
+ uint16_t size) { |
+ DCHECK(pos < 64); |
+ DCHECK(size > 0 && size <= 64); |
+ DCHECK(pos + size <= 64); |
+ if (pos < 32) { |
+ if (size <= 32) { |
+ Dext(rt, rs, pos, size); |
+ } else { |
+ Dextm(rt, rs, pos, size); |
+ } |
+ } else if (pos < 64) { |
miran.karic
2016/11/10 12:30:12
Can be just else Dextu(...
ivica.bogosavljevic
2016/11/10 13:31:41
Done.
|
+ if (size <= 32) { |
+ Dextu(rt, rs, pos, size); |
+ } |
+ } |
+} |
void MacroAssembler::Dext(Register rt, Register rs, uint16_t pos, |
uint16_t size) { |
DCHECK(pos < 32); |
- DCHECK(pos + size < 33); |
+ DCHECK(size > 0 && size <= 32); |
dext_(rt, rs, pos, size); |
} |
@@ -1770,7 +1787,8 @@ void MacroAssembler::Dext(Register rt, Register rs, uint16_t pos, |
void MacroAssembler::Dextm(Register rt, Register rs, uint16_t pos, |
uint16_t size) { |
DCHECK(pos < 32); |
- DCHECK(size <= 64); |
+ DCHECK(size > 32 && size <= 64); |
+ DCHECK((pos + size) > 32 && (pos + size) <= 64); |
dextm(rt, rs, pos, size); |
} |
@@ -1778,7 +1796,8 @@ void MacroAssembler::Dextm(Register rt, Register rs, uint16_t pos, |
void MacroAssembler::Dextu(Register rt, Register rs, uint16_t pos, |
uint16_t size) { |
DCHECK(pos >= 32 && pos < 64); |
- DCHECK(size < 33); |
+ DCHECK(size < 0 && size <= 32); |
dusan.simicic
2016/11/10 10:03:13
Typo, size > 0.
|
+ DCHECK((pos + size) > 32 && (pos + size) <= 64); |
dextu(rt, rs, pos, size); |
} |