summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2012-01-24 00:07:41 +0000
committerJim Grosbach <grosbach@apple.com>2012-01-24 00:07:41 +0000
commitd3d36d9315a8b1919c61645d347c066e53c743b1 (patch)
tree948ea18c2445d4855a7a8a062a3cf9f0943913d4 /llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
parente33b2f5c97a61f53dc61bed8b82bf86b66001ce5 (diff)
downloadbcm5719-llvm-d3d36d9315a8b1919c61645d347c066e53c743b1.tar.gz
bcm5719-llvm-d3d36d9315a8b1919c61645d347c066e53c743b1.zip
NEON VST3(single element from one lane) assembly parsing.
llvm-svn: 148755
Diffstat (limited to 'llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp')
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index 01c3c6dc5aa..2fdfb21b45a 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -5254,6 +5254,53 @@ static unsigned getRealVSTOpcode(unsigned Opc, unsigned &Spacing) {
Spacing = 2;
return ARM::VST2LNq32;
+ // VST3LN
+ case ARM::VST3LNdWB_fixed_Asm_8:
+ Spacing = 1;
+ return ARM::VST3LNd8_UPD;
+ case ARM::VST3LNdWB_fixed_Asm_16:
+ Spacing = 1;
+ return ARM::VST3LNd16_UPD;
+ case ARM::VST3LNdWB_fixed_Asm_32:
+ Spacing = 1;
+ return ARM::VST3LNd32_UPD;
+ case ARM::VST3LNqWB_fixed_Asm_16:
+ Spacing = 1;
+ return ARM::VST3LNq16_UPD;
+ case ARM::VST3LNqWB_fixed_Asm_32:
+ Spacing = 2;
+ return ARM::VST3LNq32_UPD;
+ case ARM::VST3LNdWB_register_Asm_8:
+ Spacing = 1;
+ return ARM::VST3LNd8_UPD;
+ case ARM::VST3LNdWB_register_Asm_16:
+ Spacing = 1;
+ return ARM::VST3LNd16_UPD;
+ case ARM::VST3LNdWB_register_Asm_32:
+ Spacing = 1;
+ return ARM::VST3LNd32_UPD;
+ case ARM::VST3LNqWB_register_Asm_16:
+ Spacing = 2;
+ return ARM::VST3LNq16_UPD;
+ case ARM::VST3LNqWB_register_Asm_32:
+ Spacing = 2;
+ return ARM::VST3LNq32_UPD;
+ case ARM::VST3LNdAsm_8:
+ Spacing = 1;
+ return ARM::VST3LNd8;
+ case ARM::VST3LNdAsm_16:
+ Spacing = 1;
+ return ARM::VST3LNd16;
+ case ARM::VST3LNdAsm_32:
+ Spacing = 1;
+ return ARM::VST3LNd32;
+ case ARM::VST3LNqAsm_16:
+ Spacing = 2;
+ return ARM::VST3LNq16;
+ case ARM::VST3LNqAsm_32:
+ Spacing = 2;
+ return ARM::VST3LNq32;
+
// VST3
case ARM::VST3dWB_fixed_Asm_8:
Spacing = 1;
@@ -5560,6 +5607,33 @@ processInstruction(MCInst &Inst,
Inst = TmpInst;
return true;
}
+
+ case ARM::VST3LNdWB_register_Asm_8:
+ case ARM::VST3LNdWB_register_Asm_16:
+ case ARM::VST3LNdWB_register_Asm_32:
+ case ARM::VST3LNqWB_register_Asm_16:
+ case ARM::VST3LNqWB_register_Asm_32: {
+ MCInst TmpInst;
+ // Shuffle the operands around so the lane index operand is in the
+ // right place.
+ unsigned Spacing;
+ TmpInst.setOpcode(getRealVSTOpcode(Inst.getOpcode(), Spacing));
+ TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb
+ TmpInst.addOperand(Inst.getOperand(2)); // Rn
+ TmpInst.addOperand(Inst.getOperand(3)); // alignment
+ TmpInst.addOperand(Inst.getOperand(4)); // Rm
+ TmpInst.addOperand(Inst.getOperand(0)); // Vd
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing));
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing * 2));
+ TmpInst.addOperand(Inst.getOperand(1)); // lane
+ TmpInst.addOperand(Inst.getOperand(5)); // CondCode
+ TmpInst.addOperand(Inst.getOperand(6));
+ Inst = TmpInst;
+ return true;
+ }
+
case ARM::VST1LNdWB_fixed_Asm_8:
case ARM::VST1LNdWB_fixed_Asm_16:
case ARM::VST1LNdWB_fixed_Asm_32: {
@@ -5603,6 +5677,33 @@ processInstruction(MCInst &Inst,
Inst = TmpInst;
return true;
}
+
+ case ARM::VST3LNdWB_fixed_Asm_8:
+ case ARM::VST3LNdWB_fixed_Asm_16:
+ case ARM::VST3LNdWB_fixed_Asm_32:
+ case ARM::VST3LNqWB_fixed_Asm_16:
+ case ARM::VST3LNqWB_fixed_Asm_32: {
+ MCInst TmpInst;
+ // Shuffle the operands around so the lane index operand is in the
+ // right place.
+ unsigned Spacing;
+ TmpInst.setOpcode(getRealVSTOpcode(Inst.getOpcode(), Spacing));
+ TmpInst.addOperand(Inst.getOperand(2)); // Rn_wb
+ TmpInst.addOperand(Inst.getOperand(2)); // Rn
+ TmpInst.addOperand(Inst.getOperand(3)); // alignment
+ TmpInst.addOperand(MCOperand::CreateReg(0)); // Rm
+ TmpInst.addOperand(Inst.getOperand(0)); // Vd
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing));
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing * 2));
+ TmpInst.addOperand(Inst.getOperand(1)); // lane
+ TmpInst.addOperand(Inst.getOperand(4)); // CondCode
+ TmpInst.addOperand(Inst.getOperand(5));
+ Inst = TmpInst;
+ return true;
+ }
+
case ARM::VST1LNdAsm_8:
case ARM::VST1LNdAsm_16:
case ARM::VST1LNdAsm_32: {
@@ -5642,6 +5743,31 @@ processInstruction(MCInst &Inst,
Inst = TmpInst;
return true;
}
+
+ case ARM::VST3LNdAsm_8:
+ case ARM::VST3LNdAsm_16:
+ case ARM::VST3LNdAsm_32:
+ case ARM::VST3LNqAsm_16:
+ case ARM::VST3LNqAsm_32: {
+ MCInst TmpInst;
+ // Shuffle the operands around so the lane index operand is in the
+ // right place.
+ unsigned Spacing;
+ TmpInst.setOpcode(getRealVSTOpcode(Inst.getOpcode(), Spacing));
+ TmpInst.addOperand(Inst.getOperand(2)); // Rn
+ TmpInst.addOperand(Inst.getOperand(3)); // alignment
+ TmpInst.addOperand(Inst.getOperand(0)); // Vd
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing));
+ TmpInst.addOperand(MCOperand::CreateReg(Inst.getOperand(0).getReg() +
+ Spacing * 2));
+ TmpInst.addOperand(Inst.getOperand(1)); // lane
+ TmpInst.addOperand(Inst.getOperand(4)); // CondCode
+ TmpInst.addOperand(Inst.getOperand(5));
+ Inst = TmpInst;
+ return true;
+ }
+
// Handle NEON VLD complex aliases.
case ARM::VLD1LNdWB_register_Asm_8:
case ARM::VLD1LNdWB_register_Asm_16:
OpenPOWER on IntegriCloud