[llvm-commits] [llvm] r116259 - in /llvm/trunk: lib/Target/ARM/ARMAddressingModes.h lib/Target/ARM/ARMBaseInstrInfo.h lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMMCCodeEmitter.cpp test/MC/ARM/simple-encoding.ll
Chris Lattner
clattner at apple.com
Mon Oct 11 16:29:19 PDT 2010
On Oct 11, 2010, at 4:16 PM, Jim Grosbach wrote:
> +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Mon Oct 11 18:16:21 2010
> @@ -139,8 +140,27 @@
> return;
>
> ++MCNumEmitted; // Keep track of the # of mi's emitted
> + // FIXME: TableGen doesn't deal well with operands that expand to multiple
> + // machine instruction operands, so for now we'll fix those up here.
> switch (Opcode) {
> - //FIXME: Any non-pseudos that need special handling, if there are any...
> + case ARM::ADDrs:
> + case ARM::ANDrs:
> + case ARM::BICrs:
> + case ARM::EORrs:
> + case ARM::ORRrs:
> + case ARM::SUBrs: {
> + // The so_reg operand needs the shift ammount encoded.
> + unsigned Value = getBinaryCodeForInstr(MI);
> + unsigned ShVal = MI.getOperand(4).getImm();
> + unsigned ShType = ARM_AM::getShiftOpcEncoding(ARM_AM::getSORegShOp(ShVal));
> + unsigned ShAmt = ARM_AM::getSORegOffset(ShVal);
> +
> + Value |= ShType << ARMII::ShiftTypeShift;
> + Value |= ShAmt << ARMII::ShiftShift;
Hi Jim,
What is the issue here? Could this be solved by having the generated code emitter pass the MachineOperand's operand # into getMachineOpValue?
-Chris
> +
> + EmitConstant(Value, 4, CurByte, OS);
> + break;
> + }
> default: {
> unsigned Value = getBinaryCodeForInstr(MI);
> EmitConstant(Value, 4, CurByte, OS);
>
> Modified: llvm/trunk/test/MC/ARM/simple-encoding.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/simple-encoding.ll?rev=116259&r1=116258&r2=116259&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/simple-encoding.ll (original)
> +++ llvm/trunk/test/MC/ARM/simple-encoding.ll Mon Oct 11 18:16:21 2010
> @@ -8,8 +8,8 @@
> define i32 @foo(i32 %a, i32 %b) nounwind ssp {
> entry:
> ; CHECK: foo
> -; CHECK: 0xf0,0x00,0xf0,0x07
> -; CHECK: 0x1e,0xff,0x2f,0xe1
> +; CHECK: trap @ encoding: [0xf0,0x00,0xf0,0x07]
> +; CHECK: bx lr @ encoding: [0x1e,0xff,0x2f,0xe1]
>
> tail call void @llvm.trap()
> ret i32 undef
> @@ -18,9 +18,21 @@
> define i32 @f2(i32 %a, i32 %b) nounwind readnone ssp {
> entry:
> ; CHECK: f2
> -; CHECK: 0x00,0x00,0x81,0xe0
> -; CHECK: 0x1e,0xff,0x2f,0xe1
> +; CHECK: add r0, r1, r0 @ encoding: [0x00,0x00,0x81,0xe0]
> +; CHECK: bx lr @ encoding: [0x1e,0xff,0x2f,0xe1]
> %add = add nsw i32 %b, %a
> ret i32 %add
> }
> +
> +
> +define i32 @f3(i32 %a, i32 %b) nounwind readnone ssp {
> +entry:
> +; CHECK: f3
> +; CHECK: add r0, r0, r1, lsl #3 @ encoding: [0x81,0x01,0x80,0xe0]
> +; CHECK: bx lr @ encoding: [0x1e,0xff,0x2f,0xe1]
> + %mul = shl i32 %b, 3
> + %add = add nsw i32 %mul, %a
> + ret i32 %add
> +}
> +
> declare void @llvm.trap() nounwind
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list