OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1133 // Both 'left' and 'right' are "used at start" (see LCodeGen::DoShift), so | 1133 // Both 'left' and 'right' are "used at start" (see LCodeGen::DoShift), so |
1134 // result may alias either of them. | 1134 // result may alias either of them. |
1135 LOperand* right_op = instr->right(); | 1135 LOperand* right_op = instr->right(); |
1136 Register left = ToRegister(instr->left()); | 1136 Register left = ToRegister(instr->left()); |
1137 Register result = ToRegister(instr->result()); | 1137 Register result = ToRegister(instr->result()); |
1138 | 1138 |
1139 if (right_op->IsRegister()) { | 1139 if (right_op->IsRegister()) { |
1140 // No need to mask the right operand on MIPS, it is built into the variable | 1140 // No need to mask the right operand on MIPS, it is built into the variable |
1141 // shift instructions. | 1141 // shift instructions. |
1142 switch (instr->op()) { | 1142 switch (instr->op()) { |
| 1143 case Token::ROR: |
| 1144 __ Ror(result, left, Operand(ToRegister(right_op))); |
| 1145 break; |
1143 case Token::SAR: | 1146 case Token::SAR: |
1144 __ srav(result, left, ToRegister(right_op)); | 1147 __ srav(result, left, ToRegister(right_op)); |
1145 break; | 1148 break; |
1146 case Token::SHR: | 1149 case Token::SHR: |
1147 __ srlv(result, left, ToRegister(right_op)); | 1150 __ srlv(result, left, ToRegister(right_op)); |
1148 if (instr->can_deopt()) { | 1151 if (instr->can_deopt()) { |
1149 DeoptimizeIf(lt, instr->environment(), result, Operand(zero_reg)); | 1152 DeoptimizeIf(lt, instr->environment(), result, Operand(zero_reg)); |
1150 } | 1153 } |
1151 break; | 1154 break; |
1152 case Token::SHL: | 1155 case Token::SHL: |
1153 __ sllv(result, left, ToRegister(right_op)); | 1156 __ sllv(result, left, ToRegister(right_op)); |
1154 break; | 1157 break; |
1155 default: | 1158 default: |
1156 UNREACHABLE(); | 1159 UNREACHABLE(); |
1157 break; | 1160 break; |
1158 } | 1161 } |
1159 } else { | 1162 } else { |
1160 // Mask the right_op operand. | 1163 // Mask the right_op operand. |
1161 int value = ToInteger32(LConstantOperand::cast(right_op)); | 1164 int value = ToInteger32(LConstantOperand::cast(right_op)); |
1162 uint8_t shift_count = static_cast<uint8_t>(value & 0x1F); | 1165 uint8_t shift_count = static_cast<uint8_t>(value & 0x1F); |
1163 switch (instr->op()) { | 1166 switch (instr->op()) { |
| 1167 case Token::ROR: |
| 1168 if (shift_count != 0) { |
| 1169 __ Ror(result, left, Operand(shift_count)); |
| 1170 } else { |
| 1171 __ Move(result, left); |
| 1172 } |
| 1173 break; |
1164 case Token::SAR: | 1174 case Token::SAR: |
1165 if (shift_count != 0) { | 1175 if (shift_count != 0) { |
1166 __ sra(result, left, shift_count); | 1176 __ sra(result, left, shift_count); |
1167 } else { | 1177 } else { |
1168 __ Move(result, left); | 1178 __ Move(result, left); |
1169 } | 1179 } |
1170 break; | 1180 break; |
1171 case Token::SHR: | 1181 case Token::SHR: |
1172 if (shift_count != 0) { | 1182 if (shift_count != 0) { |
1173 __ srl(result, left, shift_count); | 1183 __ srl(result, left, shift_count); |
(...skipping 4286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5460 __ Subu(scratch, result, scratch); | 5470 __ Subu(scratch, result, scratch); |
5461 __ lw(result, FieldMemOperand(scratch, | 5471 __ lw(result, FieldMemOperand(scratch, |
5462 FixedArray::kHeaderSize - kPointerSize)); | 5472 FixedArray::kHeaderSize - kPointerSize)); |
5463 __ bind(&done); | 5473 __ bind(&done); |
5464 } | 5474 } |
5465 | 5475 |
5466 | 5476 |
5467 #undef __ | 5477 #undef __ |
5468 | 5478 |
5469 } } // namespace v8::internal | 5479 } } // namespace v8::internal |
OLD | NEW |