Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: src/IceAssemblerARM32.cpp

Issue 1624383004: Add VMOV(immediate) instructions to the ARM assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix issues in previous patch. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/IceAssemblerARM32.cpp
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
index 001458d2d35ccf8f03affae6083a0059d43d8d50..abd4716a37e0f745081c94a6422afe5c3dd155b6 100644
--- a/src/IceAssemblerARM32.cpp
+++ b/src/IceAssemblerARM32.cpp
@@ -2390,6 +2390,40 @@ void AssemblerARM32::vldrs(const Operand *OpSd, const Operand *OpAddress,
emitInst(Encoding);
}
+void AssemblerARM32::vmovd(const Operand *OpDd,
+ const OperandARM32FlexFpImm *OpFpImm,
+ CondARM32::Cond Cond) {
+ // VMOV (immediate) - ARM section A8.8.339, encoding A2:
+ // vmov<c>.f64 <Dd>, #<imm>
+ //
+ // cccc11101D11xxxxdddd10110000yyyy where cccc=Cond, ddddD=Sn, xxxxyyyy=imm.
+ constexpr const char *Vmovd = "vmovd";
+ IValueT Dd = encodeSRegister(OpDd, "Dd", Vmovd);
+ IValueT Imm8 = OpFpImm->getModifiedImm();
+ assert(Imm8 < (1 << 8));
+ constexpr IValueT VmovsOpcode = B23 | B21 | B20 | B8;
+ IValueT OpcodePlusImm8 = VmovsOpcode | ((Imm8 >> 4) << 16) | (Imm8 & 0xf);
+ constexpr IValueT D0 = 0;
+ emitVFPddd(Cond, OpcodePlusImm8, Dd, D0, D0);
+}
+
+void AssemblerARM32::vmovs(const Operand *OpSd,
+ const OperandARM32FlexFpImm *OpFpImm,
+ CondARM32::Cond Cond) {
+ // VMOV (immediate) - ARM section A8.8.339, encoding A2:
+ // vmov<c>.f32 <Sd>, #<imm>
+ //
+ // cccc11101D11xxxxdddd10100000yyyy where cccc=Cond, ddddD=Sn, xxxxyyyy=imm.
+ constexpr const char *Vmovs = "vmovs";
+ IValueT Sd = encodeSRegister(OpSd, "Sd", Vmovs);
+ IValueT Imm8 = OpFpImm->getModifiedImm();
+ assert(Imm8 < (1 << 8));
+ constexpr IValueT VmovsOpcode = B23 | B21 | B20;
+ IValueT OpcodePlusImm8 = VmovsOpcode | ((Imm8 >> 4) << 16) | (Imm8 & 0xf);
+ constexpr IValueT S0 = 0;
+ emitVFPsss(Cond, OpcodePlusImm8, Sd, S0, S0);
+}
+
void AssemblerARM32::vmovsr(const Operand *OpSn, const Operand *OpRt,
CondARM32::Cond Cond) {
// VMOV (between ARM core register and single-precision register)

Powered by Google App Engine
This is Rietveld 408576698