| OLD | NEW |
| 1 //===- subzero/src/IceAssemblerARM32.cpp - Assembler for ARM32 --*- C++ -*-===// | 1 //===- subzero/src/IceAssemblerARM32.cpp - Assembler for ARM32 --*- C++ -*-===// |
| 2 // | 2 // |
| 3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 4 // for details. All rights reserved. Use of this source code is governed by a | 4 // for details. All rights reserved. Use of this source code is governed by a |
| 5 // BSD-style license that can be found in the LICENSE file. | 5 // BSD-style license that can be found in the LICENSE file. |
| 6 // | 6 // |
| 7 // Modified by the Subzero authors. | 7 // Modified by the Subzero authors. |
| 8 // | 8 // |
| 9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
| 10 // | 10 // |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 //===----------------------------------------------------------------------===// | 21 //===----------------------------------------------------------------------===// |
| 22 | 22 |
| 23 #include "IceAssemblerARM32.h" | 23 #include "IceAssemblerARM32.h" |
| 24 | 24 |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 using namespace Ice; | 27 using namespace Ice; |
| 28 | 28 |
| 29 // The following define individual bits. | 29 // The following define individual bits. |
| 30 static constexpr uint32_t B0 = 1; | 30 static constexpr uint32_t B0 = 1; |
| 31 static constexpr uint32_t B1 = 1 << 1; |
| 31 static constexpr uint32_t B2 = 1 << 2; | 32 static constexpr uint32_t B2 = 1 << 2; |
| 32 static constexpr uint32_t B3 = 1 << 3; | 33 static constexpr uint32_t B3 = 1 << 3; |
| 33 static constexpr uint32_t B4 = 1 << 4; | 34 static constexpr uint32_t B4 = 1 << 4; |
| 34 static constexpr uint32_t B5 = 1 << 5; | 35 static constexpr uint32_t B5 = 1 << 5; |
| 35 static constexpr uint32_t B6 = 1 << 6; | 36 static constexpr uint32_t B6 = 1 << 6; |
| 36 static constexpr uint32_t B21 = 1 << 21; | 37 static constexpr uint32_t B21 = 1 << 21; |
| 37 static constexpr uint32_t B24 = 1 << 24; | 38 static constexpr uint32_t B24 = 1 << 24; |
| 38 | 39 |
| 39 // Constants used for the decoding or encoding of the individual fields of | 40 // Constants used for the decoding or encoding of the individual fields of |
| 40 // instructions. Based on ARM section A5.1. | 41 // instructions. Based on ARM section A5.1. |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 uint32_t Rn = 0; | 214 uint32_t Rn = 0; |
| 214 uint32_t Mov = B3 | B2 | B0; // 1101. | 215 uint32_t Mov = B3 | B2 | B0; // 1101. |
| 215 uint32_t InstType = 1; | 216 uint32_t InstType = 1; |
| 216 emitType01(Cond, InstType, Mov, SetFlags, Rn, Rd, Src); | 217 emitType01(Cond, InstType, Mov, SetFlags, Rn, Rd, Src); |
| 217 return; | 218 return; |
| 218 } | 219 } |
| 219 } while (0); | 220 } while (0); |
| 220 UnimplementedError(Ctx->getFlags()); | 221 UnimplementedError(Ctx->getFlags()); |
| 221 } | 222 } |
| 222 | 223 |
| 224 void ARM32::AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn, |
| 225 const Operand *OpSrc1, bool SetFlags, |
| 226 CondARM32::Cond Cond) { |
| 227 // Note: Loop is used so that we can short circuit using break; |
| 228 do { |
| 229 uint32_t Rd; |
| 230 if (decode(OpRd, Rd) != DecodedAsRegister) |
| 231 break; |
| 232 uint32_t Rn; |
| 233 if (decode(OpRn, Rn) != DecodedAsRegister) |
| 234 break; |
| 235 uint32_t Src1Value; |
| 236 // TODO(kschimpf) Other possible decodings of add. |
| 237 if (decode(OpSrc1, Src1Value) == DecodedAsRotatedImm8) { |
| 238 // Sub (Immediate): See ARM section A8.8.222, rule A1. |
| 239 // cccc0010010snnnnddddiiiiiiiiiiii where cccc=Cond, dddd=Rd, nnnn=Rn, |
| 240 // s=SetFlags and iiiiiiiiiiii=Src1Value |
| 241 if (!isConditionDefined(Cond) || (Rd == RegARM32::Reg_pc && SetFlags) || |
| 242 (Rn == RegARM32::Reg_lr) || (Rn == RegARM32::Reg_pc && SetFlags)) |
| 243 // Conditions of rule violated. |
| 244 break; |
| 245 uint32_t Add = B1; // 0010 |
| 246 uint32_t InstType = 1; |
| 247 emitType01(Cond, InstType, Add, SetFlags, Rn, Rd, Src1Value); |
| 248 return; |
| 249 } |
| 250 } while (0); |
| 251 UnimplementedError(Ctx->getFlags()); |
| 252 } |
| 253 |
| 223 } // end of namespace Ice | 254 } // end of namespace Ice |
| OLD | NEW |