diff --git a/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp b/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp --- a/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp +++ b/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp @@ -1377,7 +1377,24 @@ if (!Parser.getTok().is(AsmToken::LParen)) break; - // FIXME: Parsing %vec-reg + "(" + %sclar-reg/number + ")" + // Parsing %vec-reg + "(" + %sclar-reg/number + ")" + std::unique_ptr Op1 = VEOperand::CreateToken( + Parser.getTok().getString(), Parser.getTok().getLoc()); + Parser.Lex(); // Eat the '('. + + std::unique_ptr Op2; + ResTy = parseVEAsmOperand(Op2); + if (ResTy != MatchOperand_Success || !Op2) + return MatchOperand_ParseFail; + + if (!Parser.getTok().is(AsmToken::RParen)) + return MatchOperand_ParseFail; + + Operands.push_back(std::move(Op1)); + Operands.push_back(std::move(Op2)); + Operands.push_back(VEOperand::CreateToken(Parser.getTok().getString(), + Parser.getTok().getLoc())); + Parser.Lex(); // Eat the ')'. break; } } diff --git a/llvm/lib/Target/VE/VEInstrVec.td b/llvm/lib/Target/VE/VEInstrVec.td --- a/llvm/lib/Target/VE/VEInstrVec.td +++ b/llvm/lib/Target/VE/VEInstrVec.td @@ -283,3 +283,72 @@ } let vc = 1, vx = 0 in defm PFCHV : PFCHVm<"pfchv", 0x80>; let vc = 0, vx = 0 in defm PFCHVNC : PFCHVm<"pfchv.nc", 0x80>; + +// Section 8.9.20 - LSV (Load S to V) +let sx = 0, vx = ?, hasSideEffects = 0 in +multiclass LSVbmopc, RegisterClass RC, + dag dag_in> { + def "" : RR; + let Constraints = "$vx = $base", DisableEncoding = "$base", + isCodeGenOnly = 1 in + def _v : RR; +} +multiclass LSVmopc, RegisterClass RC> { + defm rr : LSVbm; + let cy = 0 in + defm ir : LSVbm; + let cz = 0 in + defm rm : LSVbm; + let cy = 0, cz = 0 in + defm im : LSVbm; +} +defm LSV : LSVm<"lsv", 0x8e, V64>; + +// Section 8.9.21 - LVS (Load V to S) +let cz = 0, sz = 0, vx = ?, hasSideEffects = 0 in +multiclass LVSmopc, RegisterClass RC> { + def vr : RR; + let cy = 0 in + def vi : RR; +} +defm LVS : LVSm<"lvs", 0x9e, V64>; + +// Section 8.9.22 - LVM (Load VM) +let sx = 0, vx = ?, hasSideEffects = 0 in +multiclass LVMbmopc, RegisterClass RCM, + dag dag_in> { + def "" : RR; + let Constraints = "$vx = $base", DisableEncoding = "$base", + isCodeGenOnly = 1 in { + def _m : RR; + } +} +multiclass LVMomopc, RegisterClass RCM> { + defm rr : LVMbm; + let cy = 0 in + defm ir : LVMbm; + let cz = 0 in + defm rm : LVMbm; + let cy = 0, cz = 0 in + defm im : LVMbm; +} +multiclass LVMmopc, RegisterClass RCM> { + defm "" : LVMom; +} +defm LVM : LVMm<"lvm", 0xb7, VM>; + +// Section 8.9.23 - SVM (Save VM) +let cz = 0, sz = 0, vz = ?, hasSideEffects = 0 in +multiclass SVMmopc, RegisterClass RCM> { + def mr : RR; + let cy = 0 in + def mi : RR; +} +defm SVM : SVMm<"svm", 0xa7, VM>; diff --git a/llvm/test/MC/VE/LSV.s b/llvm/test/MC/VE/LSV.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/VE/LSV.s @@ -0,0 +1,28 @@ +# RUN: llvm-mc -triple=ve --show-encoding < %s \ +# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \ +# RUN: | FileCheck %s --check-prefixes=CHECK-INST + +# CHECK-INST: lsv %v11(0), %s12 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x8c,0x00,0x00,0x8e] +lsv %v11(0), %s12 + +# CHECK-INST: lsv %vix(%s23), %s12 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x8c,0x97,0x00,0x8e] +lsv %vix(%s23), %s12 + +# CHECK-INST: lsv %v11(0), (32)0 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x60,0x00,0x00,0x8e] +lsv %v11(0), (32)0 + +# CHECK-INST: lsv %vix(%s23), (23)1 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x17,0x97,0x00,0x8e] +lsv %vix(%s23), (23)1 + +# CHECK-INST: lsv %v11(%s22), (1)0 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x41,0x96,0x00,0x8e] +lsv %v11(%s22), (1)0 + +# CHECK-INST: lsv %vix(127), (63)1 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x3f,0x7f,0x00,0x8e] +lsv %vix(127), (63)1 diff --git a/llvm/test/MC/VE/LVM.s b/llvm/test/MC/VE/LVM.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/VE/LVM.s @@ -0,0 +1,28 @@ +# RUN: llvm-mc -triple=ve --show-encoding < %s \ +# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \ +# RUN: | FileCheck %s --check-prefixes=CHECK-INST + +# CHECK-INST: lvm %vm11, 0, %s12 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x8c,0x00,0x00,0xb7] +lvm %vm11, 0, %s12 + +# CHECK-INST: lvm %vm12, %s23, %s12 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0c,0x8c,0x97,0x00,0xb7] +lvm %vm12, %s23, %s12 + +# CHECK-INST: lvm %vm1, 0, (32)0 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x01,0x60,0x00,0x00,0xb7] +lvm %vm1, 0, (32)0 + +# CHECK-INST: lvm %vm2, %s23, (23)1 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x02,0x17,0x97,0x00,0xb7] +lvm %vm2, %s23, (23)1 + +# CHECK-INST: lvm %vm0, %s22, (1)0 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x00,0x41,0x96,0x00,0xb7] +lvm %vm0, %s22, (1)0 + +# CHECK-INST: lvm %vm15, 3, (63)1 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0f,0x3f,0x03,0x00,0xb7] +lvm %vm15, 3, (63)1 diff --git a/llvm/test/MC/VE/LVS.s b/llvm/test/MC/VE/LVS.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/VE/LVS.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -triple=ve --show-encoding < %s \ +# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \ +# RUN: | FileCheck %s --check-prefixes=CHECK-INST + +# CHECK-INST: lvs %s12, %v11(0) +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x00,0x00,0x0c,0x9e] +lvs %s12, %v11(0) + +# CHECK-INST: lvs %s63, %vix(%s23) +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x00,0x97,0x3f,0x9e] +lvs %s63, %vix(%s23) + +# CHECK-INST: lvs %s0, %v11(127) +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x00,0x7f,0x00,0x9e] +lvs %s0, %v11(127) diff --git a/llvm/test/MC/VE/SVM.s b/llvm/test/MC/VE/SVM.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/VE/SVM.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc -triple=ve --show-encoding < %s \ +# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST +# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \ +# RUN: | FileCheck %s --check-prefixes=CHECK-INST + +# CHECK-INST: svm %s12, %vm11, 0 +# CHECK-ENCODING: encoding: [0x00,0x0b,0x00,0x00,0x00,0x00,0x0c,0xa7] +svm %s12, %vm11, 0 + +# CHECK-INST: svm %s63, %vm0, %s23 +# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x00,0x00,0x97,0x3f,0xa7] +svm %s63, %vm0, %s23 + +# CHECK-INST: svm %s0, %vm11, 3 +# CHECK-ENCODING: encoding: [0x00,0x0b,0x00,0x00,0x00,0x03,0x00,0xa7] +svm %s0, %vm11, 3