diff options
| author | Tim Northover <tnorthover@apple.com> | 2013-08-01 09:20:35 +0000 | 
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2013-08-01 09:20:35 +0000 | 
| commit | 87773c318fcee853fb34a80a10c4347d523bdafb (patch) | |
| tree | 6c8b6620d46529f553a508e9190a264534e0a0dd /lib/Target/AArch64/Disassembler | |
| parent | 691aa094dafe54151b6f70168f066bd87c161e8d (diff) | |
| download | external_llvm-87773c318fcee853fb34a80a10c4347d523bdafb.zip external_llvm-87773c318fcee853fb34a80a10c4347d523bdafb.tar.gz external_llvm-87773c318fcee853fb34a80a10c4347d523bdafb.tar.bz2 | |
AArch64: add initial NEON support
Patch by Ana Pazos.
- Completed implementation of instruction formats:
AdvSIMD three same
AdvSIMD modified immediate
AdvSIMD scalar pairwise
- Completed implementation of instruction classes
(some of the instructions in these classes
belong to yet unfinished instruction formats):
Vector Arithmetic
Vector Immediate
Vector Pairwise Arithmetic
- Initial implementation of instruction formats:
AdvSIMD scalar two-reg misc
AdvSIMD scalar three same
- Intial implementation of instruction class:
Scalar Arithmetic
- Initial clang changes to support arm v8 intrinsics.
Note: no clang changes for scalar intrinsics function name mangling yet.
- Comprehensive test cases for added instructions
To verify auto codegen, encoding, decoding, diagnosis, intrinsics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/AArch64/Disassembler')
| -rw-r--r-- | lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp | 40 | 
1 files changed, 39 insertions, 1 deletions
| diff --git a/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp b/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp index 36dd704..a88a8e8 100644 --- a/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp +++ b/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp @@ -85,6 +85,9 @@ static DecodeStatus DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,  static DecodeStatus DecodeFPR128RegisterClass(llvm::MCInst &Inst,                                                unsigned RegNo, uint64_t Address,                                                const void *Decoder); +static DecodeStatus DecodeVPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo, +                                             uint64_t Address, +                                             const void *Decoder);  static DecodeStatus DecodeVPR128RegisterClass(llvm::MCInst &Inst,                                                unsigned RegNo, uint64_t Address,                                                const void *Decoder); @@ -126,6 +129,10 @@ static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,                                             unsigned ShiftAmount,                                             uint64_t Address,                                             const void *Decoder); +template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf> +static DecodeStatus +DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount, +                             uint64_t Address, const void *Decoder);  static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,                                              unsigned ShiftAmount, @@ -336,9 +343,20 @@ DecodeFPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,    return MCDisassembler::Success;  } +static DecodeStatus DecodeVPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo, +                                             uint64_t Address, +                                             const void *Decoder) { +  if (RegNo > 31) +    return MCDisassembler::Fail; + +  uint16_t Register = getReg(Decoder, AArch64::VPR64RegClassID, RegNo); +  Inst.addOperand(MCOperand::CreateReg(Register)); +  return MCDisassembler::Success; +} +  static DecodeStatus  DecodeVPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo, -                         uint64_t Address, const void *Decoder) { +						  uint64_t Address, const void *Decoder) {    if (RegNo > 31)      return MCDisassembler::Fail; @@ -799,4 +817,24 @@ extern "C" void LLVMInitializeAArch64Disassembler() {                                           createAArch64Disassembler);  } +template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf> +static DecodeStatus +DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount, +                             uint64_t Address, const void *Decoder) { +  bool IsLSL = false; +  if (Ext == A64SE::LSL) +    IsLSL = true; +  else if (Ext != A64SE::MSL) +    return MCDisassembler::Fail; + +  // MSL and LSLH accepts encoded shift amount 0 or 1. +  if ((!IsLSL || (IsLSL && IsHalf)) && ShiftAmount != 0 && ShiftAmount != 1) +    return MCDisassembler::Fail; + +  // LSL  accepts encoded shift amount 0, 1, 2 or 3. +  if (IsLSL && ShiftAmount > 3) +    return MCDisassembler::Fail; +  Inst.addOperand(MCOperand::CreateImm(ShiftAmount)); +  return MCDisassembler::Success; +} | 
