| Index: src/IceAssemblerARM32.h | 
| diff --git a/src/IceAssemblerARM32.h b/src/IceAssemblerARM32.h | 
| index d2523f610531529f02e6cc2c757c5020de9c1f65..f5291c1203a8ff5772b99e2656c7464ed780f52a 100644 | 
| --- a/src/IceAssemblerARM32.h | 
| +++ b/src/IceAssemblerARM32.h | 
| @@ -44,6 +44,16 @@ using IValueT = uint32_t; | 
| /// An Offset value (+/-) used in an ARM 32-bit instruction. | 
| using IOffsetT = int32_t; | 
|  | 
| +/// Handles encoding of bottom/top 16 bits of an address using movw/movt. | 
| +class MoveRelocatableFixup : public AssemblerFixup { | 
| +  MoveRelocatableFixup &operator=(const MoveRelocatableFixup &) = delete; | 
| +  MoveRelocatableFixup(const MoveRelocatableFixup &) = default; | 
| + | 
| +public: | 
| +  MoveRelocatableFixup() = default; | 
| +  size_t emit(GlobalContext *Ctx, const Assembler &Asm) const override; | 
| +}; | 
| + | 
| class AssemblerARM32 : public Assembler { | 
| AssemblerARM32(const AssemblerARM32 &) = delete; | 
| AssemblerARM32 &operator=(const AssemblerARM32 &) = delete; | 
| @@ -65,6 +75,8 @@ public: | 
| } | 
| } | 
|  | 
| +  MoveRelocatableFixup *createMoveFixup(bool IsMovW, const Constant *Value); | 
| + | 
| void alignFunction() override { | 
| const SizeT Align = 1 << getBundleAlignLog2Bytes(); | 
| SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align); | 
| @@ -137,6 +149,10 @@ public: | 
|  | 
| void mov(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); | 
|  | 
| +  void movw(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); | 
| + | 
| +  void movt(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); | 
| + | 
| void bx(RegARM32::GPRRegister Rm, CondARM32::Cond Cond = CondARM32::AL); | 
|  | 
| void sbc(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, | 
|  |