mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +00:00
Print VMOV (immediate) operands as hexadecimal values. Apple's assembler
will not accept negative values for these. LLVM's default operand printing sign extends values, so that valid unsigned values appear as negative immediates. Print all VMOV immediate operands as hex values to resolve this. Radar 7372576. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86301 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
79f0332c20
commit
54c78ef2fe
@ -102,6 +102,19 @@ def addrmode_neonldstm : Operand<i32>,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
def h8imm : Operand<i8> {
|
||||||
|
let PrintMethod = "printHex8ImmOperand";
|
||||||
|
}
|
||||||
|
def h16imm : Operand<i16> {
|
||||||
|
let PrintMethod = "printHex16ImmOperand";
|
||||||
|
}
|
||||||
|
def h32imm : Operand<i32> {
|
||||||
|
let PrintMethod = "printHex32ImmOperand";
|
||||||
|
}
|
||||||
|
def h64imm : Operand<i64> {
|
||||||
|
let PrintMethod = "printHex64ImmOperand";
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// NEON load / store instructions
|
// NEON load / store instructions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -2325,38 +2338,38 @@ def vmovImm64 : PatLeaf<(build_vector), [{
|
|||||||
// be encoded based on the immed values.
|
// be encoded based on the immed values.
|
||||||
|
|
||||||
def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$dst),
|
def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$dst),
|
||||||
(ins i8imm:$SIMM), IIC_VMOVImm,
|
(ins h8imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i8\t$dst, $SIMM", "",
|
"vmov.i8\t$dst, $SIMM", "",
|
||||||
[(set DPR:$dst, (v8i8 vmovImm8:$SIMM))]>;
|
[(set DPR:$dst, (v8i8 vmovImm8:$SIMM))]>;
|
||||||
def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$dst),
|
def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$dst),
|
||||||
(ins i8imm:$SIMM), IIC_VMOVImm,
|
(ins h8imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i8\t$dst, $SIMM", "",
|
"vmov.i8\t$dst, $SIMM", "",
|
||||||
[(set QPR:$dst, (v16i8 vmovImm8:$SIMM))]>;
|
[(set QPR:$dst, (v16i8 vmovImm8:$SIMM))]>;
|
||||||
|
|
||||||
def VMOVv4i16 : N1ModImm<1, 0b000, 0b1000, 0, 0, 0, 1, (outs DPR:$dst),
|
def VMOVv4i16 : N1ModImm<1, 0b000, 0b1000, 0, 0, 0, 1, (outs DPR:$dst),
|
||||||
(ins i16imm:$SIMM), IIC_VMOVImm,
|
(ins h16imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i16\t$dst, $SIMM", "",
|
"vmov.i16\t$dst, $SIMM", "",
|
||||||
[(set DPR:$dst, (v4i16 vmovImm16:$SIMM))]>;
|
[(set DPR:$dst, (v4i16 vmovImm16:$SIMM))]>;
|
||||||
def VMOVv8i16 : N1ModImm<1, 0b000, 0b1000, 0, 1, 0, 1, (outs QPR:$dst),
|
def VMOVv8i16 : N1ModImm<1, 0b000, 0b1000, 0, 1, 0, 1, (outs QPR:$dst),
|
||||||
(ins i16imm:$SIMM), IIC_VMOVImm,
|
(ins h16imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i16\t$dst, $SIMM", "",
|
"vmov.i16\t$dst, $SIMM", "",
|
||||||
[(set QPR:$dst, (v8i16 vmovImm16:$SIMM))]>;
|
[(set QPR:$dst, (v8i16 vmovImm16:$SIMM))]>;
|
||||||
|
|
||||||
def VMOVv2i32 : N1ModImm<1, 0b000, 0b0000, 0, 0, 0, 1, (outs DPR:$dst),
|
def VMOVv2i32 : N1ModImm<1, 0b000, 0b0000, 0, 0, 0, 1, (outs DPR:$dst),
|
||||||
(ins i32imm:$SIMM), IIC_VMOVImm,
|
(ins h32imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i32\t$dst, $SIMM", "",
|
"vmov.i32\t$dst, $SIMM", "",
|
||||||
[(set DPR:$dst, (v2i32 vmovImm32:$SIMM))]>;
|
[(set DPR:$dst, (v2i32 vmovImm32:$SIMM))]>;
|
||||||
def VMOVv4i32 : N1ModImm<1, 0b000, 0b0000, 0, 1, 0, 1, (outs QPR:$dst),
|
def VMOVv4i32 : N1ModImm<1, 0b000, 0b0000, 0, 1, 0, 1, (outs QPR:$dst),
|
||||||
(ins i32imm:$SIMM), IIC_VMOVImm,
|
(ins h32imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i32\t$dst, $SIMM", "",
|
"vmov.i32\t$dst, $SIMM", "",
|
||||||
[(set QPR:$dst, (v4i32 vmovImm32:$SIMM))]>;
|
[(set QPR:$dst, (v4i32 vmovImm32:$SIMM))]>;
|
||||||
|
|
||||||
def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$dst),
|
def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$dst),
|
||||||
(ins i64imm:$SIMM), IIC_VMOVImm,
|
(ins h64imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i64\t$dst, $SIMM", "",
|
"vmov.i64\t$dst, $SIMM", "",
|
||||||
[(set DPR:$dst, (v1i64 vmovImm64:$SIMM))]>;
|
[(set DPR:$dst, (v1i64 vmovImm64:$SIMM))]>;
|
||||||
def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$dst),
|
def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$dst),
|
||||||
(ins i64imm:$SIMM), IIC_VMOVImm,
|
(ins h64imm:$SIMM), IIC_VMOVImm,
|
||||||
"vmov.i64\t$dst, $SIMM", "",
|
"vmov.i64\t$dst, $SIMM", "",
|
||||||
[(set QPR:$dst, (v2i64 vmovImm64:$SIMM))]>;
|
[(set QPR:$dst, (v2i64 vmovImm64:$SIMM))]>;
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
#include "llvm/ADT/SmallPtrSet.h"
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
#include "llvm/ADT/SmallString.h"
|
#include "llvm/ADT/SmallString.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/ADT/StringSet.h"
|
#include "llvm/ADT/StringSet.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
@ -138,6 +139,19 @@ namespace {
|
|||||||
void printVFPf32ImmOperand(const MachineInstr *MI, int OpNum);
|
void printVFPf32ImmOperand(const MachineInstr *MI, int OpNum);
|
||||||
void printVFPf64ImmOperand(const MachineInstr *MI, int OpNum);
|
void printVFPf64ImmOperand(const MachineInstr *MI, int OpNum);
|
||||||
|
|
||||||
|
void printHex8ImmOperand(const MachineInstr *MI, int OpNum) {
|
||||||
|
O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xff);
|
||||||
|
}
|
||||||
|
void printHex16ImmOperand(const MachineInstr *MI, int OpNum) {
|
||||||
|
O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xffff);
|
||||||
|
}
|
||||||
|
void printHex32ImmOperand(const MachineInstr *MI, int OpNum) {
|
||||||
|
O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xffffffff);
|
||||||
|
}
|
||||||
|
void printHex64ImmOperand(const MachineInstr *MI, int OpNum) {
|
||||||
|
O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm());
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
|
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
|
||||||
unsigned AsmVariant, const char *ExtraCode);
|
unsigned AsmVariant, const char *ExtraCode);
|
||||||
virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
|
virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
|
||||||
|
@ -80,6 +80,10 @@ public:
|
|||||||
void printNoHashImmediate(const MCInst *MI, unsigned OpNum);
|
void printNoHashImmediate(const MCInst *MI, unsigned OpNum);
|
||||||
void printVFPf32ImmOperand(const MCInst *MI, int OpNum) {}
|
void printVFPf32ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
void printVFPf64ImmOperand(const MCInst *MI, int OpNum) {}
|
void printVFPf64ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
|
void printHex8ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
|
void printHex16ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
|
void printHex32ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
|
void printHex64ImmOperand(const MCInst *MI, int OpNum) {}
|
||||||
|
|
||||||
void printPCLabel(const MCInst *MI, unsigned OpNum);
|
void printPCLabel(const MCInst *MI, unsigned OpNum);
|
||||||
// FIXME: Implement.
|
// FIXME: Implement.
|
||||||
|
@ -134,6 +134,26 @@ define <2 x i64> @v_movQi64() nounwind {
|
|||||||
ret <2 x i64> < i64 18374687574888349695, i64 18374687574888349695 >
|
ret <2 x i64> < i64 18374687574888349695, i64 18374687574888349695 >
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Check for correct assembler printing for immediate values.
|
||||||
|
%struct.int8x8_t = type { <8 x i8> }
|
||||||
|
define arm_apcscc void @vdupn128(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
|
||||||
|
entry:
|
||||||
|
;CHECK: vdupn128:
|
||||||
|
;CHECK: vmov.i8 d0, #0x80
|
||||||
|
%0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
|
||||||
|
store <8 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>, <8 x i8>* %0, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define arm_apcscc void @vdupnneg75(%struct.int8x8_t* noalias nocapture sret %agg.result) nounwind {
|
||||||
|
entry:
|
||||||
|
;CHECK: vdupnneg75:
|
||||||
|
;CHECK: vmov.i8 d0, #0xB5
|
||||||
|
%0 = getelementptr inbounds %struct.int8x8_t* %agg.result, i32 0, i32 0 ; <<8 x i8>*> [#uses=1]
|
||||||
|
store <8 x i8> <i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75>, <8 x i8>* %0, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
define <8 x i16> @vmovls8(<8 x i8>* %A) nounwind {
|
define <8 x i16> @vmovls8(<8 x i8>* %A) nounwind {
|
||||||
;CHECK: vmovls8:
|
;CHECK: vmovls8:
|
||||||
;CHECK: vmovl.s8
|
;CHECK: vmovl.s8
|
||||||
|
Loading…
Reference in New Issue
Block a user