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

Unified Diff: src/IceAssemblerARM32.cpp

Issue 1503273002: Add Sxtb instructions to ARM integrated assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years 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
« no previous file with comments | « src/IceAssemblerARM32.h ('k') | src/IceInstARM32.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceAssemblerARM32.cpp
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
index d06ee7b6ddb4d41458101a6bea5e4c0f3d9363a6..b88e2ee25245d29798d8af545f4fd046e8795635 100644
--- a/src/IceAssemblerARM32.cpp
+++ b/src/IceAssemblerARM32.cpp
@@ -835,21 +835,6 @@ void AssemblerARM32::emitMulOp(CondARM32::Cond Cond, IValueT Opcode, IValueT Rd,
emitInst(Encoding);
}
-void AssemblerARM32::emitUxt(CondARM32::Cond Cond, IValueT Opcode, IValueT Rd,
- IValueT Rn, IValueT Rm, RotationValue Rotation,
- const char *InstName) {
- verifyCondDefined(Cond, InstName);
- IValueT Rot = encodeRotation(Rotation);
- if (!Utils::IsUint(2, Rot))
- llvm::report_fatal_error(std::string(InstName) +
- ": Illegal rotation value");
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- IValueT Encoding = (encodeCondition(Cond) << kConditionShift) | Opcode |
- (Rn << kRnShift) | (Rd << kRdShift) |
- (Rot << kRotationShift) | B6 | B5 | B4 | (Rm << kRmShift);
- emitInst(Encoding);
-}
-
void AssemblerARM32::emitMultiMemOp(CondARM32::Cond Cond,
BlockAddressMode AddressMode, bool IsLoad,
IValueT BaseReg, IValueT Registers,
@@ -867,6 +852,50 @@ void AssemblerARM32::emitMultiMemOp(CondARM32::Cond Cond,
emitInst(Encoding);
}
+void AssemblerARM32::emitSignExtend(CondARM32::Cond Cond, IValueT Opcode,
+ const Operand *OpRd, const Operand *OpSrc0,
+ const char *InstName) {
+ IValueT Rd = encodeRegister(OpRd, "Rd", InstName);
+ IValueT Rm = encodeRegister(OpSrc0, "Rm", InstName);
+ // Note: For the moment, we assume no rotation is specified.
+ RotationValue Rotation = kRotateNone;
+ constexpr IValueT Rn = RegARM32::Encoded_Reg_pc;
+ switch (typeWidthInBytes(OpSrc0->getType())) {
+ default:
+ llvm::report_fatal_error(std::string(InstName) +
+ ": Type of Rm not understood");
Jim Stichnoth 2015/12/08 05:57:24 Would be nice to have a "break;" here.
Karl 2015/12/08 19:17:43 Done.
+ case 1: {
+ // SXTB/UXTB - Arm sections A8.8.233 and A8.8.274, encoding A1:
+ // sxtb<c> <Rd>, <Rm>{, <rotate>}
+ // uxtb<c> <Rd>, <Rm>{, <rotate>}
+ //
+ // ccccxxxxxxxx1111ddddrr000111mmmm where cccc=Cond, xxxxxxxx<<20=Opcode,
+ // dddd=Rd, mmmm=Rm, and rr defined (RotationValue) rotate.
+ break;
+ }
+ case 2: {
+ // SXTH/UXTH - ARM sections A8.8.235 and A8.8.276, encoding A1:
+ // uxth<c> <Rd>< <Rm>{, <rotate>}
+ //
+ // cccc01101111nnnnddddrr000111mmmm where cccc=Cond, dddd=Rd, mmmm=Rm, and
+ // rr defined (RotationValue) rotate.
+ Opcode |= B20;
+ break;
+ }
+ }
+
+ verifyCondDefined(Cond, InstName);
+ IValueT Rot = encodeRotation(Rotation);
+ if (!Utils::IsUint(2, Rot))
+ llvm::report_fatal_error(std::string(InstName) +
+ ": Illegal rotation value");
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ IValueT Encoding = (encodeCondition(Cond) << kConditionShift) | Opcode |
+ (Rn << kRnShift) | (Rd << kRdShift) |
+ (Rot << kRotationShift) | B6 | B5 | B4 | (Rm << kRmShift);
+ emitInst(Encoding);
+}
+
void AssemblerARM32::adc(const Operand *OpRd, const Operand *OpRn,
const Operand *OpSrc1, bool SetFlags,
CondARM32::Cond Cond) {
@@ -1510,6 +1539,13 @@ void AssemblerARM32::rsb(const Operand *OpRd, const Operand *OpRn,
RsbName);
}
+void AssemblerARM32::sxt(const Operand *OpRd, const Operand *OpSrc0,
+ CondARM32::Cond Cond) {
+ constexpr const char *SxtName = "sxt";
+ constexpr IValueT SxtOpcode = B26 | B25 | B23 | B21;
+ emitSignExtend(Cond, SxtOpcode, OpRd, OpSrc0, SxtName);
+}
+
void AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn,
const Operand *OpSrc1, bool SetFlags,
CondARM32::Cond Cond) {
@@ -1597,35 +1633,8 @@ void AssemblerARM32::umull(const Operand *OpRdLo, const Operand *OpRdHi,
void AssemblerARM32::uxt(const Operand *OpRd, const Operand *OpSrc0,
CondARM32::Cond Cond) {
constexpr const char *UxtName = "uxt";
- IValueT Rd = encodeRegister(OpRd, "Rd", UxtName);
- IValueT Rm = encodeRegister(OpSrc0, "Rm", UxtName);
- // Note: For the moment, we assume no rotation is specified.
- RotationValue Rotation = kRotateNone;
- constexpr IValueT Rn = RegARM32::Encoded_Reg_pc;
- switch (typeWidthInBytes(OpSrc0->getType())) {
- default:
- llvm::report_fatal_error("Type of Rm not understood: uxt");
- case 1: {
- // UXTB - ARM section A8.8.274, encoding A1:
- // uxtb<c> <Rd>, <Rm>{, <rotate>}
- //
- // cccc011011101111ddddrr000111mmmm where cccc=Cond, dddd=Rd, mmmm=Rm, and
- // rr defined (RotationValue) rotate.
- constexpr IValueT UxtOpcode = B26 | B25 | B23 | B22 | B21;
- emitUxt(Cond, UxtOpcode, Rd, Rn, Rm, Rotation, UxtName);
- return;
- }
- case 2: {
- // UXTH - ARM section A8.8.276, encoding A1:
- // uxth<c> <Rd>< <Rm>{, <rotate>}
- //
- // cccc01101111nnnnddddrr000111mmmm where cccc=Cond, dddd=Rd, mmmm=Rm, and
- // rr defined (RotationValue) rotate.
- constexpr IValueT UxtOpcode = B26 | B25 | B23 | B22 | B21 | B20;
- emitUxt(Cond, UxtOpcode, Rd, Rn, Rm, Rotation, UxtName);
- return;
- }
- }
+ constexpr IValueT UxtOpcode = B26 | B25 | B23 | B22 | B21;
+ emitSignExtend(Cond, UxtOpcode, OpRd, OpSrc0, UxtName);
}
} // end of namespace ARM32
« no previous file with comments | « src/IceAssemblerARM32.h ('k') | src/IceInstARM32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698