mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-13 08:26:02 +00:00
Long double patch 7 of N, unless I lost count:).
Last x87 bits for full functionality (not thoroughly tested, and long doubles do not work in SSE modes at all - use -mcpu=i486 for now) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40886 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -401,10 +401,13 @@ static const TableEntry OpcodeTable[] = {
|
|||||||
{ X86::ILD_Fp64m80 , X86::ILD_F64m },
|
{ X86::ILD_Fp64m80 , X86::ILD_F64m },
|
||||||
{ X86::ISTT_Fp16m32 , X86::ISTT_FP16m},
|
{ X86::ISTT_Fp16m32 , X86::ISTT_FP16m},
|
||||||
{ X86::ISTT_Fp16m64 , X86::ISTT_FP16m},
|
{ X86::ISTT_Fp16m64 , X86::ISTT_FP16m},
|
||||||
|
{ X86::ISTT_Fp16m80 , X86::ISTT_FP16m},
|
||||||
{ X86::ISTT_Fp32m32 , X86::ISTT_FP32m},
|
{ X86::ISTT_Fp32m32 , X86::ISTT_FP32m},
|
||||||
{ X86::ISTT_Fp32m64 , X86::ISTT_FP32m},
|
{ X86::ISTT_Fp32m64 , X86::ISTT_FP32m},
|
||||||
|
{ X86::ISTT_Fp32m80 , X86::ISTT_FP32m},
|
||||||
{ X86::ISTT_Fp64m32 , X86::ISTT_FP64m},
|
{ X86::ISTT_Fp64m32 , X86::ISTT_FP64m},
|
||||||
{ X86::ISTT_Fp64m64 , X86::ISTT_FP64m},
|
{ X86::ISTT_Fp64m64 , X86::ISTT_FP64m},
|
||||||
|
{ X86::ISTT_Fp64m80 , X86::ISTT_FP64m},
|
||||||
{ X86::IST_Fp16m32 , X86::IST_F16m },
|
{ X86::IST_Fp16m32 , X86::IST_F16m },
|
||||||
{ X86::IST_Fp16m64 , X86::IST_F16m },
|
{ X86::IST_Fp16m64 , X86::IST_F16m },
|
||||||
{ X86::IST_Fp16m80 , X86::IST_F16m },
|
{ X86::IST_Fp16m80 , X86::IST_F16m },
|
||||||
@@ -616,6 +619,9 @@ void FPS::handleOneArgFP(MachineBasicBlock::iterator &I) {
|
|||||||
MI->getOpcode() == X86::ISTT_Fp16m64 ||
|
MI->getOpcode() == X86::ISTT_Fp16m64 ||
|
||||||
MI->getOpcode() == X86::ISTT_Fp32m64 ||
|
MI->getOpcode() == X86::ISTT_Fp32m64 ||
|
||||||
MI->getOpcode() == X86::ISTT_Fp64m64 ||
|
MI->getOpcode() == X86::ISTT_Fp64m64 ||
|
||||||
|
MI->getOpcode() == X86::ISTT_Fp16m80 ||
|
||||||
|
MI->getOpcode() == X86::ISTT_Fp32m80 ||
|
||||||
|
MI->getOpcode() == X86::ISTT_Fp64m80 ||
|
||||||
MI->getOpcode() == X86::ST_FpP80m)) {
|
MI->getOpcode() == X86::ST_FpP80m)) {
|
||||||
duplicateToTop(Reg, 7 /*temp register*/, I);
|
duplicateToTop(Reg, 7 /*temp register*/, I);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -4603,7 +4603,10 @@ X86TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI,
|
|||||||
case X86::FP32_TO_INT64_IN_MEM:
|
case X86::FP32_TO_INT64_IN_MEM:
|
||||||
case X86::FP64_TO_INT16_IN_MEM:
|
case X86::FP64_TO_INT16_IN_MEM:
|
||||||
case X86::FP64_TO_INT32_IN_MEM:
|
case X86::FP64_TO_INT32_IN_MEM:
|
||||||
case X86::FP64_TO_INT64_IN_MEM: {
|
case X86::FP64_TO_INT64_IN_MEM:
|
||||||
|
case X86::FP80_TO_INT16_IN_MEM:
|
||||||
|
case X86::FP80_TO_INT32_IN_MEM:
|
||||||
|
case X86::FP80_TO_INT64_IN_MEM: {
|
||||||
// Change the floating point control register to use "round towards zero"
|
// Change the floating point control register to use "round towards zero"
|
||||||
// mode when truncating to an integer value.
|
// mode when truncating to an integer value.
|
||||||
MachineFunction *F = BB->getParent();
|
MachineFunction *F = BB->getParent();
|
||||||
@@ -4636,6 +4639,9 @@ X86TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI,
|
|||||||
case X86::FP64_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m64; break;
|
case X86::FP64_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m64; break;
|
||||||
case X86::FP64_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m64; break;
|
case X86::FP64_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m64; break;
|
||||||
case X86::FP64_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m64; break;
|
case X86::FP64_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m64; break;
|
||||||
|
case X86::FP80_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m80; break;
|
||||||
|
case X86::FP80_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m80; break;
|
||||||
|
case X86::FP80_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m80; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
X86AddressMode AM;
|
X86AddressMode AM;
|
||||||
|
@@ -98,6 +98,18 @@ let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler.
|
|||||||
(outs), (ins i64mem:$dst, RFP64:$src),
|
(outs), (ins i64mem:$dst, RFP64:$src),
|
||||||
"#FP64_TO_INT64_IN_MEM PSEUDO!",
|
"#FP64_TO_INT64_IN_MEM PSEUDO!",
|
||||||
[(X86fp_to_i64mem RFP64:$src, addr:$dst)]>;
|
[(X86fp_to_i64mem RFP64:$src, addr:$dst)]>;
|
||||||
|
def FP80_TO_INT16_IN_MEM : I<0, Pseudo,
|
||||||
|
(outs), (ins i16mem:$dst, RFP80:$src),
|
||||||
|
"#FP80_TO_INT16_IN_MEM PSEUDO!",
|
||||||
|
[(X86fp_to_i16mem RFP80:$src, addr:$dst)]>;
|
||||||
|
def FP80_TO_INT32_IN_MEM : I<0, Pseudo,
|
||||||
|
(outs), (ins i32mem:$dst, RFP80:$src),
|
||||||
|
"#FP80_TO_INT32_IN_MEM PSEUDO!",
|
||||||
|
[(X86fp_to_i32mem RFP80:$src, addr:$dst)]>;
|
||||||
|
def FP80_TO_INT64_IN_MEM : I<0, Pseudo,
|
||||||
|
(outs), (ins i64mem:$dst, RFP80:$src),
|
||||||
|
"#FP80_TO_INT64_IN_MEM PSEUDO!",
|
||||||
|
[(X86fp_to_i64mem RFP80:$src, addr:$dst)]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let isTerminator = 1 in
|
let isTerminator = 1 in
|
||||||
@@ -414,6 +426,15 @@ def ISTT_Fp32m64 : FpI_<(outs), (ins i32mem:$op, RFP64:$src), OneArgFP,
|
|||||||
def ISTT_Fp64m64 : FpI_<(outs), (ins i64mem:$op, RFP64:$src), OneArgFP,
|
def ISTT_Fp64m64 : FpI_<(outs), (ins i64mem:$op, RFP64:$src), OneArgFP,
|
||||||
[(X86fp_to_i64mem RFP64:$src, addr:$op)]>,
|
[(X86fp_to_i64mem RFP64:$src, addr:$op)]>,
|
||||||
Requires<[HasSSE3]>;
|
Requires<[HasSSE3]>;
|
||||||
|
def ISTT_Fp16m80 : FpI_<(outs), (ins i16mem:$op, RFP80:$src), OneArgFP,
|
||||||
|
[(X86fp_to_i16mem RFP80:$src, addr:$op)]>,
|
||||||
|
Requires<[HasSSE3]>;
|
||||||
|
def ISTT_Fp32m80 : FpI_<(outs), (ins i32mem:$op, RFP80:$src), OneArgFP,
|
||||||
|
[(X86fp_to_i32mem RFP80:$src, addr:$op)]>,
|
||||||
|
Requires<[HasSSE3]>;
|
||||||
|
def ISTT_Fp64m80 : FpI_<(outs), (ins i64mem:$op, RFP80:$src), OneArgFP,
|
||||||
|
[(X86fp_to_i64mem RFP80:$src, addr:$op)]>,
|
||||||
|
Requires<[HasSSE3]>;
|
||||||
|
|
||||||
def ISTT_FP16m : FPI<0xDF, MRM1m, (outs), (ins i16mem:$dst), "fisttp{s}\t$dst">;
|
def ISTT_FP16m : FPI<0xDF, MRM1m, (outs), (ins i16mem:$dst), "fisttp{s}\t$dst">;
|
||||||
def ISTT_FP32m : FPI<0xDB, MRM1m, (outs), (ins i32mem:$dst), "fisttp{l}\t$dst">;
|
def ISTT_FP32m : FPI<0xDB, MRM1m, (outs), (ins i32mem:$dst), "fisttp{l}\t$dst">;
|
||||||
@@ -498,6 +519,9 @@ def : Pat<(X86fld addr:$src, f80), (LD_Fp80m addr:$src)>;
|
|||||||
def : Pat<(X86fst RFP32:$src, addr:$op, f32), (ST_Fp32m addr:$op, RFP32:$src)>;
|
def : Pat<(X86fst RFP32:$src, addr:$op, f32), (ST_Fp32m addr:$op, RFP32:$src)>;
|
||||||
def : Pat<(X86fst RFP64:$src, addr:$op, f32), (ST_Fp64m32 addr:$op, RFP64:$src)>;
|
def : Pat<(X86fst RFP64:$src, addr:$op, f32), (ST_Fp64m32 addr:$op, RFP64:$src)>;
|
||||||
def : Pat<(X86fst RFP64:$src, addr:$op, f64), (ST_Fp64m addr:$op, RFP64:$src)>;
|
def : Pat<(X86fst RFP64:$src, addr:$op, f64), (ST_Fp64m addr:$op, RFP64:$src)>;
|
||||||
|
def : Pat<(X86fst RFP80:$src, addr:$op, f32), (ST_Fp80m32 addr:$op, RFP80:$src)>;
|
||||||
|
def : Pat<(X86fst RFP80:$src, addr:$op, f64), (ST_Fp80m64 addr:$op, RFP80:$src)>;
|
||||||
|
def : Pat<(X86fst RFP80:$src, addr:$op, f80), (ST_FpP80m addr:$op, RFP80:$src)>;
|
||||||
|
|
||||||
// Floating point constant -0.0 and -1.0
|
// Floating point constant -0.0 and -1.0
|
||||||
def : Pat<(f32 fpimmneg0), (CHS_Fp32 (LD_Fp032))>, Requires<[FPStack]>;
|
def : Pat<(f32 fpimmneg0), (CHS_Fp32 (LD_Fp032))>, Requires<[FPStack]>;
|
||||||
|
Reference in New Issue
Block a user