mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[ARM64] SCVTF and FCVTZS/U are undefined if scale<5> == 0.
llvm-svn: 205882
This commit is contained in:
parent
a41c6988db
commit
7a63e7691e
@ -304,12 +304,12 @@ def movk_symbol_g0 : Operand<i32> {
|
||||
|
||||
def fixedpoint32 : Operand<i32> {
|
||||
let EncoderMethod = "getFixedPointScaleOpValue";
|
||||
let DecoderMethod = "DecodeFixedPointScaleImm";
|
||||
let DecoderMethod = "DecodeFixedPointScaleImm32";
|
||||
let ParserMatchClass = Imm1_32Operand;
|
||||
}
|
||||
def fixedpoint64 : Operand<i64> {
|
||||
let EncoderMethod = "getFixedPointScaleOpValue";
|
||||
let DecoderMethod = "DecodeFixedPointScaleImm";
|
||||
let DecoderMethod = "DecodeFixedPointScaleImm64";
|
||||
let ParserMatchClass = Imm1_64Operand;
|
||||
}
|
||||
|
||||
@ -3117,6 +3117,7 @@ multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
|
||||
def SWSri : BaseFPToInteger<0b00, rmode, opcode, FPR32, GPR32,
|
||||
fixedpoint32, asm> {
|
||||
let Inst{31} = 0; // 32-bit GPR flag
|
||||
let scale{5} = 1;
|
||||
}
|
||||
|
||||
// Scaled single-precision to 64-bit
|
||||
@ -3129,6 +3130,7 @@ multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
|
||||
def SWDri : BaseFPToInteger<0b01, rmode, opcode, FPR64, GPR32,
|
||||
fixedpoint32, asm> {
|
||||
let Inst{31} = 0; // 32-bit GPR flag
|
||||
let scale{5} = 1;
|
||||
}
|
||||
|
||||
// Scaled double-precision to 64-bit
|
||||
@ -3203,11 +3205,13 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDNode node> {
|
||||
def SWSri: BaseIntegerToFP<isUnsigned, GPR32, FPR32, fixedpoint32, asm> {
|
||||
let Inst{31} = 0; // 32-bit GPR flag
|
||||
let Inst{22} = 0; // 32-bit FPR flag
|
||||
let scale{5} = 1;
|
||||
}
|
||||
|
||||
def SWDri: BaseIntegerToFP<isUnsigned, GPR32, FPR64, fixedpoint32, asm> {
|
||||
let Inst{31} = 0; // 32-bit GPR flag
|
||||
let Inst{22} = 1; // 64-bit FPR flag
|
||||
let scale{5} = 1;
|
||||
}
|
||||
|
||||
def SXSri: BaseIntegerToFP<isUnsigned, GPR64, FPR32, fixedpoint64, asm> {
|
||||
|
@ -82,9 +82,12 @@ static DecodeStatus DecodeDDDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
|
||||
static DecodeStatus DecodeFixedPointScaleImm(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
static DecodeStatus DecodeFixedPointScaleImm32(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
static DecodeStatus DecodeFixedPointScaleImm64(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
static DecodeStatus DecodeCondBranchTarget(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
@ -744,9 +747,18 @@ static DecodeStatus DecodeDDDDRegisterClass(MCInst &Inst, unsigned RegNo,
|
||||
return Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeFixedPointScaleImm(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Addr,
|
||||
const void *Decoder) {
|
||||
static DecodeStatus DecodeFixedPointScaleImm32(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Addr,
|
||||
const void *Decoder) {
|
||||
// scale{5} is asserted as 1 in tblgen.
|
||||
Imm |= 0x20;
|
||||
Inst.addOperand(MCOperand::CreateImm(64 - Imm));
|
||||
return Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeFixedPointScaleImm64(llvm::MCInst &Inst, unsigned Imm,
|
||||
uint64_t Addr,
|
||||
const void *Decoder) {
|
||||
Inst.addOperand(MCOperand::CreateImm(64 - Imm));
|
||||
return Success;
|
||||
}
|
||||
|
@ -23,4 +23,9 @@
|
||||
# EXT on vectors of i8 must have imm<3> = 0.
|
||||
# RUN: echo "0x00 0x40 0x00 0x2e" | llvm-mc -triple=arm64 -disassemble 2>&1 | FileCheck %s
|
||||
|
||||
# SCVTF on fixed point W-registers is undefined if scale<5> == 0.
|
||||
# Same with FCVTZS and FCVTZU.
|
||||
# RUN: echo "0x00 0x00 0x02 0x1e" | llvm-mc -triple=arm64 -disassemble 2>&1 | FileCheck %s
|
||||
# RUN: echo "0x00 0x00 0x18 0x1e" | llvm-mc -triple=arm64 -disassemble 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK: invalid instruction encoding
|
||||
|
Loading…
Reference in New Issue
Block a user