Index: include/llvm/IR/IntrinsicsARM.td =================================================================== --- include/llvm/IR/IntrinsicsARM.td +++ include/llvm/IR/IntrinsicsARM.td @@ -20,6 +20,8 @@ def int_arm_thread_pointer : GCCBuiltin<"__builtin_thread_pointer">, Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>; +def int_arm_space : Intrinsic<[], [llvm_i32_ty], []>; + //===----------------------------------------------------------------------===// // Saturating Arithmentic Index: lib/Target/ARM/ARMAsmPrinter.cpp =================================================================== --- lib/Target/ARM/ARMAsmPrinter.cpp +++ lib/Target/ARM/ARMAsmPrinter.cpp @@ -1459,6 +1459,9 @@ EmitJumpTable(MI); return; } + case ARM::SPACE: + OutStreamer.EmitZeros(MI->getOperand(0).getImm()); + return; case ARM::TRAP: { // Non-Darwin binutils don't yet support the "trap" mnemonic. // FIXME: Remove this special case when they do. Index: lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- lib/Target/ARM/ARMBaseInstrInfo.cpp +++ lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -639,6 +639,8 @@ ++NumEntries; return NumEntries * EntrySize + InstSize; } + case ARM::SPACE: + return MI->getOperand(0).getImm(); } } Index: lib/Target/ARM/ARMInstrInfo.td =================================================================== --- lib/Target/ARM/ARMInstrInfo.td +++ lib/Target/ARM/ARMInstrInfo.td @@ -5560,3 +5560,7 @@ // is discarded. def ITasm : ARMAsmPseudo<"it$mask $cc", (ins it_pred:$cc, it_mask:$mask)>, ComplexDeprecationPredicate<"IT">; + +let mayLoad = 1, mayStore =1, hasSideEffects = 1 in +def SPACE : PseudoInst<(outs), (ins i32imm:$size), NoItinerary, + [(int_arm_space imm:$size)]>; Index: test/CodeGen/ARM/space-directive.ll =================================================================== --- /dev/null +++ test/CodeGen/ARM/space-directive.ll @@ -0,0 +1,19 @@ +; RUN: llc -mtriple=armv7 -o - %s | FileCheck %s + +define i32 @test_space() minsize { +; CHECK-LABEL: test_space: +; CHECK: ldr {{r[0-9]+}}, [[CPENTRY:.?LCPI[0-9]+_[0-9]+]] +; CHECK: b [[PAST_CP:.?LBB[0-9]+_[0-9]+]] + +; CHECK: [[CPENTRY]]: +; CHECK-NEXT: 12345678 + +; CHECK: [[PAST_CP]]: +; CHECK: .zero 10000 + %addr = inttoptr i32 12345678 to i32* + %val = load i32* %addr + call void @llvm.arm.space(i32 10000) + ret i32 %val +} + +declare void @llvm.arm.space(i32) \ No newline at end of file