Index: include/llvm/MC/MCExpr.h =================================================================== --- include/llvm/MC/MCExpr.h +++ include/llvm/MC/MCExpr.h @@ -256,6 +256,7 @@ VK_Mips_GOT, VK_Mips_ABS_HI, VK_Mips_ABS_LO, + VK_Mips_LITERAL, VK_Mips_TLSGD, VK_Mips_TLSLDM, VK_Mips_DTPREL_HI, Index: lib/MC/MCExpr.cpp =================================================================== --- lib/MC/MCExpr.cpp +++ lib/MC/MCExpr.cpp @@ -270,6 +270,7 @@ case VK_Mips_GOT: return "GOT"; case VK_Mips_ABS_HI: return "ABS_HI"; case VK_Mips_ABS_LO: return "ABS_LO"; + case VK_Mips_LITERAL: return "LITERAL"; case VK_Mips_TLSGD: return "TLSGD"; case VK_Mips_TLSLDM: return "TLSLDM"; case VK_Mips_DTPREL_HI: return "DTPREL_HI"; Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -192,6 +192,9 @@ bool expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, SmallVectorImpl &Instructions); + + bool expandLoadImmReal(MCInst &Inst, bool IsSingle, bool IsGPR, SMLoc IDLoc, + SmallVectorImpl &Instructions); bool expandLoadAddress(unsigned DstReg, unsigned BaseReg, const MCOperand &Offset, bool Is32BitAddress, @@ -221,8 +224,8 @@ const bool Signed); bool expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, SMLoc IDLoc, - SmallVectorImpl &Instructions); - + SmallVectorImpl &Instructions); + bool expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, SmallVectorImpl &Instructions); @@ -584,7 +587,7 @@ RegKind_COP3 = 512, /// COP3 RegKind_COP0 = 1024, /// COP0 /// Potentially any (e.g. $1) - RegKind_Numeric = RegKind_GPR | RegKind_FGR | RegKind_FCC | RegKind_MSA128 | + RegKind_Numeric = RegKind_GPR | RegKind_FCC | RegKind_MSA128 | RegKind_MSACtrl | RegKind_COP2 | RegKind_ACC | RegKind_CCR | RegKind_HWRegs | RegKind_COP3 | RegKind_COP0 }; @@ -2011,6 +2014,24 @@ Instructions) ? MER_Fail : MER_Success; + + case Mips::LoadImmSingleGPR: + return expandLoadImmReal(Inst, true, true, IDLoc, Instructions) + ? MER_Fail + : MER_Success; + case Mips::LoadImmSingleFGR: + return expandLoadImmReal(Inst, true, false, IDLoc, Instructions) + ? MER_Fail + : MER_Success; + case Mips::LoadImmDoubleGPR: + return expandLoadImmReal(Inst, false, true, IDLoc, Instructions) + ? MER_Fail + : MER_Success; + case Mips::LoadImmDoubleFGR: + return expandLoadImmReal(Inst, false, false, IDLoc, Instructions) + ? MER_Fail + : MER_Success; + case Mips::B_MM_Pseudo: case Mips::B_MMR6_Pseudo: return expandUncondBranchMMPseudo(Inst, IDLoc, Instructions) ? MER_Fail @@ -3082,6 +3103,200 @@ return false; } +bool MipsAsmParser::expandLoadImmReal(MCInst &Inst, bool IsSingle, bool IsGPR, + SMLoc IDLoc, + SmallVectorImpl &Instructions) { + assert(Inst.getNumOperands() == 2 && "Invalid operand count"); + assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && + "Invalid instruction operand."); + + unsigned FirstReg = Inst.getOperand(0).getReg(); + uint64_t ImmOp64 = Inst.getOperand(1).getImm(); + + uint64_t HiImmOp64 = (ImmOp64 & 0xffffffff00000000) >> 32; + // If ImmOp64 is AsmToken::Integer type (all bits set to zero in the + // exponent field), convert it to double (e.g. 1 to 1.0) + if ((HiImmOp64 & 0x7ff00000) == 0) { + APFloat RealVal(APFloat::IEEEdouble, ImmOp64); + ImmOp64 = RealVal.bitcastToAPInt().getZExtValue(); + } + + uint64_t LoImmOp64 = ImmOp64 & 0xffffffff; + HiImmOp64 = (ImmOp64 & 0xffffffff00000000) >> 32; + + if (IsSingle) { + uint32_t ImmOp32; + // Convert double ImmOp64 into single ImmOp32 + void *void_pt = static_cast(&ImmOp64); + double *double_pt = static_cast(void_pt); + float tmp_float = static_cast(*double_pt); + void_pt = &tmp_float; + uint32_t *uint32_pt = static_cast(void_pt); + ImmOp32 = *uint32_pt; + + if (IsGPR) { + if (loadImmediate(ImmOp32, FirstReg, Mips::NoRegister, true, true, IDLoc, + Instructions)) + return true; + return false; + } else { + if (LoImmOp64 == 0) { + unsigned ATReg = getATReg(IDLoc); + if (!ATReg) + return true; + + if (loadImmediate(ImmOp32, ATReg, Mips::NoRegister, true, true, IDLoc, + Instructions)) + return true; + emitRR(Mips::MTC1, FirstReg, ATReg, IDLoc, Instructions); + return false; + } + + MCSection *CS = getStreamer().getCurrentSectionOnly(); + MCSection *Lit4Section = getContext().getELFSection( + ".lit4", ELF::SHT_PROGBITS, + ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_MIPS_GPREL); + getStreamer().SwitchSection(Lit4Section); + getStreamer().EmitIntValue(ImmOp32, 4); + getStreamer().SwitchSection(CS); + + MCSymbolELF *Sym = getContext().getOrCreateSectionSymbol( + *(dyn_cast(Lit4Section))); + + const MCSymbolRefExpr *LitExpr = MCSymbolRefExpr::create( + Sym, MCSymbolRefExpr::VK_Mips_LITERAL, getContext()); + + int32_t size_data_fragment = 0; + MCSection::FragmentListType &FragList = Lit4Section->getFragmentList(); + if (!FragList.empty()) { + MCDataFragment *DF = + &cast(Lit4Section->getFragmentList().back()); + size_data_fragment = DF->getContents().size(); + } + + const MCExpr *FixupAddr = MCBinaryExpr::createAdd( + LitExpr, MCConstantExpr::create(size_data_fragment - 4, getContext()), + getContext()); + + emitRRX(Mips::LWC1, FirstReg, Mips::GP, MCOperand::createExpr(FixupAddr), + IDLoc, Instructions); + + return false; + } + return false; + } + + // if(!IsSingle) + if (IsGPR) { + unsigned ATReg = getATReg(IDLoc); + if (!ATReg) + return true; + + // If real number can be presented in 32-bits without loss of information + // (e.g. 1.5) + if (LoImmOp64 == 0) { + if (loadImmediate(HiImmOp64, FirstReg, Mips::NoRegister, true, true, + IDLoc, Instructions)) + return true; + + if (loadImmediate(0, FirstReg + 1, Mips::NoRegister, true, true, IDLoc, + Instructions)) + return true; + return false; + } + + MCSection *CS = getStreamer().getCurrentSectionOnly(); + MCSection *ReadOnlySection = getContext().getELFSection( + ".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); + getStreamer().SwitchSection(ReadOnlySection); + getStreamer().EmitIntValue(HiImmOp64, 4); + getStreamer().EmitIntValue(LoImmOp64, 4); + getStreamer().SwitchSection(CS); + + int32_t size_data_fragment = 0; + MCSection::FragmentListType &FragList = ReadOnlySection->getFragmentList(); + if (!FragList.empty()) { + MCDataFragment *DF = + &cast(ReadOnlySection->getFragmentList().back()); + size_data_fragment = DF->getContents().size(); + } + + MCSymbolELF *Sym = getContext().getOrCreateSectionSymbol( + *(dyn_cast(ReadOnlySection))); + + const MCSymbolRefExpr *HiExpr = MCSymbolRefExpr::create( + Sym, MCSymbolRefExpr::VK_Mips_ABS_HI, getContext()); + const MCSymbolRefExpr *LoExpr = MCSymbolRefExpr::create( + Sym, MCSymbolRefExpr::VK_Mips_ABS_LO, getContext()); + + emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, + Instructions); + + const MCExpr *FixupAddr = MCBinaryExpr::createAdd( + LoExpr, MCConstantExpr::create(size_data_fragment - 8, getContext()), + getContext()); + + emitRRX(Mips::LW, FirstReg, ATReg, MCOperand::createExpr(FixupAddr), IDLoc, + Instructions); + + FixupAddr = MCBinaryExpr::createAdd( + LoExpr, MCConstantExpr::create(size_data_fragment - 4, getContext()), + getContext()); + + emitRRX(Mips::LW, FirstReg + 1, ATReg, MCOperand::createExpr(FixupAddr), + IDLoc, Instructions); + + return false; + } else { // if(!IsGPR) + // If real number can be presented in 32-bits without loss of information + // (e.g. 1.5) + if (LoImmOp64 == 0) { + unsigned ATReg = getATReg(IDLoc); + if (!ATReg) + return true; + + if (loadImmediate(HiImmOp64, ATReg, Mips::NoRegister, true, true, IDLoc, + Instructions)) + return true; + emitRR(Mips::MTC1, IsSingle ? FirstReg : FirstReg + 1, ATReg, IDLoc, + Instructions); + emitRR(Mips::MTC1, FirstReg, Mips::ZERO, IDLoc, Instructions); + + return false; + } + + MCSection *CS = getStreamer().getCurrentSectionOnly(); + MCSection *Lit8Section = getContext().getELFSection( + ".lit8", ELF::SHT_PROGBITS, + ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_MIPS_GPREL); + + getStreamer().SwitchSection(Lit8Section); + getStreamer().EmitIntValue(HiImmOp64, 4); + getStreamer().EmitIntValue(LoImmOp64, 4); + getStreamer().SwitchSection(CS); + + int32_t size_data_fragment = 0; + MCSection::FragmentListType &FragList = Lit8Section->getFragmentList(); + if (!FragList.empty()) { + MCDataFragment *DF = + &cast(Lit8Section->getFragmentList().back()); + size_data_fragment = DF->getContents().size(); + } + + MCSymbolELF *Sym = getContext().getOrCreateSectionSymbol( + *(dyn_cast(Lit8Section))); + const MCSymbolRefExpr *LitExpr = MCSymbolRefExpr::create( + Sym, MCSymbolRefExpr::VK_Mips_LITERAL, getContext()); + const MCExpr *FixupAddr = MCBinaryExpr::createAdd( + LitExpr, MCConstantExpr::create(size_data_fragment - 8, getContext()), + getContext()); + + emitRRX(Mips::LDC1, FirstReg, Mips::GP, MCOperand::createExpr(FixupAddr), + IDLoc, Instructions); + } + return false; +} + bool MipsAsmParser::expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, SMLoc IDLoc, SmallVectorImpl &Instructions) { @@ -4111,6 +4326,7 @@ case AsmToken::Minus: case AsmToken::Plus: case AsmToken::Integer: + case AsmToken::Real: case AsmToken::Tilde: case AsmToken::String: { DEBUG(dbgs() << ".. generic integer\n"); @@ -4301,7 +4517,7 @@ return true; case AsmToken::Identifier: case AsmToken::LParen: - case AsmToken::Integer: + case AsmToken::Integer: case AsmToken::Minus: case AsmToken::Plus: if (isParenExpr) @@ -4553,6 +4769,7 @@ case AsmToken::Minus: case AsmToken::Plus: case AsmToken::Integer: + case AsmToken::Real: case AsmToken::Tilde: case AsmToken::String: break; @@ -4824,6 +5041,7 @@ .Case("highest", MCSymbolRefExpr::VK_Mips_HIGHEST) .Case("pcrel_hi", MCSymbolRefExpr::VK_Mips_PCREL_HI16) .Case("pcrel_lo", MCSymbolRefExpr::VK_Mips_PCREL_LO16) + .Case("literal", MCSymbolRefExpr::VK_Mips_LITERAL) .Default(MCSymbolRefExpr::VK_None); assert(VK != MCSymbolRefExpr::VK_None); Index: lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp =================================================================== --- lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp +++ lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp @@ -169,6 +169,7 @@ case MCSymbolRefExpr::VK_Mips_CALL_LO16: OS << "%call_lo("; break; case MCSymbolRefExpr::VK_Mips_PCREL_HI16: OS << "%pcrel_hi("; break; case MCSymbolRefExpr::VK_Mips_PCREL_LO16: OS << "%pcrel_lo("; break; + case MCSymbolRefExpr::VK_Mips_LITERAL: OS << "%literal("; break; } SRE->getSymbol().print(OS, MAI); Index: lib/Target/Mips/MCTargetDesc/MipsBaseInfo.h =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsBaseInfo.h +++ lib/Target/Mips/MCTargetDesc/MipsBaseInfo.h @@ -52,6 +52,8 @@ /// address. MO_ABS_HI, MO_ABS_LO, + + MO_LITERAL, /// MO_TLSGD - Represents the offset into the global offset table at which // the module ID and TSL block offset reside during execution (General Index: lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -126,6 +126,8 @@ return ELF::R_MIPS_26; case Mips::fixup_Mips_CALL16: return ELF::R_MIPS_CALL16; + case Mips::fixup_Mips_LITERAL: + return ELF::R_MIPS_LITERAL; case Mips::fixup_Mips_GOT_Global: case Mips::fixup_Mips_GOT_Local: return ELF::R_MIPS_GOT16; Index: lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -517,7 +517,7 @@ case MipsMCExpr::VK_Mips_LO: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 : Mips::fixup_Mips_LO16; - break; + break; } Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); return 0; @@ -573,6 +573,9 @@ FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 : Mips::fixup_Mips_LO16; break; + case MCSymbolRefExpr::VK_Mips_LITERAL: + FixupKind = Mips::fixup_Mips_LITERAL; + break; case MCSymbolRefExpr::VK_Mips_TLSGD: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD : Mips::fixup_Mips_TLSGD; Index: lib/Target/Mips/MipsInstrFPU.td =================================================================== --- lib/Target/Mips/MipsInstrFPU.td +++ lib/Target/Mips/MipsInstrFPU.td @@ -571,6 +571,22 @@ "trunc.w.d\t$fd, $fs, $rs">, FGR_64, HARDFLOAT; +def LoadImmSingleGPR : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), + (ins imm64:$fpimm), + "li.s\t$rd, $fpimm">; + +def LoadImmSingleFGR : MipsAsmPseudoInst<(outs FGR32Opnd:$rd), + (ins imm64:$fpimm), + "li.s\t$rd, $fpimm">; + +def LoadImmDoubleGPR : MipsAsmPseudoInst<(outs GPR32Opnd:$rd), + (ins imm64:$fpimm), + "li.d\t$rd, $fpimm">; + +def LoadImmDoubleFGR : MipsAsmPseudoInst<(outs FGR32Opnd:$rd), + (ins imm64:$fpimm), + "li.d\t$rd, $fpimm">; + //===----------------------------------------------------------------------===// // InstAliases. //===----------------------------------------------------------------------===// Index: lib/Target/Mips/MipsMCInstLower.cpp =================================================================== --- lib/Target/Mips/MipsMCInstLower.cpp +++ lib/Target/Mips/MipsMCInstLower.cpp @@ -66,6 +66,7 @@ case MipsII::MO_GOT_LO16: Kind = MCSymbolRefExpr::VK_Mips_GOT_LO16; break; case MipsII::MO_CALL_HI16: Kind = MCSymbolRefExpr::VK_Mips_CALL_HI16; break; case MipsII::MO_CALL_LO16: Kind = MCSymbolRefExpr::VK_Mips_CALL_LO16; break; + case MipsII::MO_LITERAL: Kind = MCSymbolRefExpr::VK_Mips_LITERAL; break; } switch (MOTy) { Index: test/MC/Mips/li.d.s =================================================================== --- test/MC/Mips/li.d.s +++ test/MC/Mips/li.d.s @@ -0,0 +1,167 @@ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips64 -show-encoding | FileCheck %s + +li.d $4, 0 +# CHECK: addiu $4, $zero, 0 # encoding: [0x00,0x00,0x04,0x24] +# CHECK: addiu $5, $zero, 0 # encoding: [0x00,0x00,0x05,0x24] + +li.d $4, 0.0 +# CHECK: addiu $4, $zero, 0 # encoding: [0x00,0x00,0x04,0x24] +# CHECK: addiu $5, $zero, 0 # encoding: [0x00,0x00,0x05,0x24] + +li.d $4, 1.12345 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1072822694 +# CHECK: .4byte 3037400872 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $4, 1 +# CHECK: lui $4, 16368 # encoding: [0xf0,0x3f,0x04,0x3c] +# CHECK: addiu $5, $zero, 0 # encoding: [0x00,0x00,0x05,0x24] + +li.d $4, 1.0 +# CHECK: lui $4, 16368 # encoding: [0xf0,0x3f,0x04,0x3c] +# CHECK: addiu $5, $zero, 0 # encoding: [0x00,0x00,0x05,0x24] + +li.d $4, 12345678910 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790602240 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $4, 12345678910.0 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790602240 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $4, 0.4 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1071225241 +# CHECK: .4byte 2576980378 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $4, 1.5 +# CHECK: lui $4, 16376 # encoding: [0xf8,0x3f,0x04,0x3c] +# CHECK: addiu $5, $zero, 0 # encoding: [0x00,0x00,0x05,0x24] + +li.d $4, 12345678910.12345678910 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790666967 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $4, 12345678910123456789.12345678910 +# CHECK: .section .rodata,"a",@progbits +# CHECK: .4byte 1139108501 +# CHECK: .4byte 836738583 +# CHECK: .text +# CHECK: lui $1, %hi(.rodata) # encoding: [A,A,0x01,0x3c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_HI, kind: fixup_Mips_HI16 +# CHECK: lw $4, %lo(.rodata-8)($1) # encoding: [0xf8'A',0xff'A',0x24,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 +# CHECK: lw $5, %lo(.rodata-4)($1) # encoding: [0xfc'A',0xff'A',0x25,0x8c] +# CHECK: # fixup A - offset: 0, value: .rodata@ABS_LO, kind: fixup_Mips_LO16 + +li.d $f4, 0 +# CHECK: addiu $1, $zero, 0 # encoding: [0x00,0x00,0x01,0x24] +# CHECK: mtc1 $1, $f5 # encoding: [0x00,0x28,0x81,0x44] +# CHECK: mtc1 $zero, $f4 # encoding: [0x00,0x20,0x80,0x44] + +li.d $f4, 0.0 +# CHECK: addiu $1, $zero, 0 # encoding: [0x00,0x00,0x01,0x24] +# CHECK: mtc1 $1, $f5 # encoding: [0x00,0x28,0x81,0x44] +# CHECK: mtc1 $zero, $f4 # encoding: [0x00,0x20,0x80,0x44] + +li.d $f4, 1.12345 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1072822694 +# CHECK: .4byte 3037400872 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + +li.d $f4, 1 +# CHECK: lui $1, 16368 # encoding: [0xf0,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f5 # encoding: [0x00,0x28,0x81,0x44] +# CHECK: mtc1 $zero, $f4 # encoding: [0x00,0x20,0x80,0x44] + +li.d $f4, 1.0 +# CHECK: lui $1, 16368 # encoding: [0xf0,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f5 # encoding: [0x00,0x28,0x81,0x44] +# CHECK: mtc1 $zero, $f4 # encoding: [0x00,0x20,0x80,0x44] + +li.d $f4, 12345678910 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790602240 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + +li.d $f4, 12345678910.0 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790602240 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + +li.d $f4, 0.4 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1071225241 +# CHECK: .4byte 2576980378 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + +li.d $f4, 1.5 +# CHECK: lui $1, 16376 # encoding: [0xf8,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f5 # encoding: [0x00,0x28,0x81,0x44] +# CHECK: mtc1 $zero, $f4 # encoding: [0x00,0x20,0x80,0x44] + +li.d $f4, 12345678910.12345678910 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1107754720 +# CHECK: .4byte 3790666967 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + +li.d $f4, 12345678910123456789.12345678910 +# CHECK: .section .lit8,"aw",@progbits +# CHECK: .4byte 1139108501 +# CHECK: .4byte 836738583 +# CHECK: .text +# CHECK: ldc1 $f4, %literal(.lit8-8)($gp) # encoding: [0xf8'A',0xff'A',0x84,0xd7] +# CHECK: # fixup A - offset: 0, value: .lit8@LITERAL, kind: fixup_Mips_LITERAL + Index: test/MC/Mips/li.s.s =================================================================== --- test/MC/Mips/li.s.s +++ test/MC/Mips/li.s.s @@ -0,0 +1,104 @@ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32 -show-encoding | FileCheck %s +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips64 -show-encoding | FileCheck %s + +li.s $4, 0 +# CHECK: addiu $4, $zero, 0 # encoding: [0x00,0x00,0x04,0x24] + +li.s $4, 0.0 +# CHECK: addiu $4, $zero, 0 # encoding: [0x00,0x00,0x04,0x24] + +li.s $4, 1.12345 +# CHECK: lui $4, 16271 # encoding: [0x8f,0x3f,0x04,0x3c] +# CHECK: ori $4, $4, 52534 # encoding: [0x36,0xcd,0x84,0x34] + +li.s $4, 1 +# CHECK: lui $4, 16256 # encoding: [0x80,0x3f,0x04,0x3c] + +li.s $4, 1.0 +# CHECK: lui $4, 16256 # encoding: [0x80,0x3f,0x04,0x3c] + +li.s $4, 12345678910 +# CHECK: lui $4, 20535 # encoding: [0x37,0x50,0x04,0x3c] +# CHECK: ori $4, $4, 63239 # encoding: [0x07,0xf7,0x84,0x34] + +li.s $4, 12345678910.0 +# CHECK: lui $4, 20535 # encoding: [0x37,0x50,0x04,0x3c] +# CHECK: ori $4, $4, 63239 # encoding: [0x07,0xf7,0x84,0x34] + +li.s $4, 0.4 +# CHECK: lui $4, 16076 # encoding: [0xcc,0x3e,0x04,0x3c] +# CHECK: ori $4, $4, 52429 # encoding: [0xcd,0xcc,0x84,0x34] + +li.s $4, 1.5 +# CHECK: lui $4, 16320 # encoding: [0xc0,0x3f,0x04,0x3c] + +li.s $4, 12345678910.12345678910 +# CHECK: lui $4, 20535 # encoding: [0x37,0x50,0x04,0x3c] +# CHECK: ori $4, $4, 63239 # encoding: [0x07,0xf7,0x84,0x34] + +li.s $4, 12345678910123456789.12345678910 +# CHECK: lui $4, 24363 # encoding: [0x2b,0x5f,0x04,0x3c] +# CHECK: ori $4, $4, 21674 # encoding: [0xaa,0x54,0x84,0x34] + +li.s $f4, 0 +# CHECK: addiu $1, $zero, 0 # encoding: [0x00,0x00,0x01,0x24] +# CHECK: mtc1 $1, $f4 # encoding: [0x00,0x20,0x81,0x44] + +li.s $f4, 0.0 +# CHECK: addiu $1, $zero, 0 # encoding: [0x00,0x00,0x01,0x24] +# CHECK: mtc1 $1, $f4 # encoding: [0x00,0x20,0x81,0x44] + +li.s $f4, 1.12345 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1066388790 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL + +li.s $f4, 1 +# CHECK: lui $1, 16256 # encoding: [0x80,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f4 # encoding: [0x00,0x20,0x81,0x44] + +li.s $f4, 1.0 +# CHECK: lui $1, 16256 # encoding: [0x80,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f4 # encoding: [0x00,0x20,0x81,0x44] + +li.s $f4, 12345678910 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1345844999 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL + +li.s $f4, 12345678910.0 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1345844999 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL + +li.s $f4, 0.4 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1053609165 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL + +li.s $f4, 1.5 +# CHECK: lui $1, 16320 # encoding: [0xc0,0x3f,0x01,0x3c] +# CHECK: mtc1 $1, $f4 # encoding: [0x00,0x20,0x81,0x44] + +li.s $f4, 12345678910.12345678910 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1345844999 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL + +li.s $f4, 12345678910123456789.12345678910 +# CHECK: .section .lit4,"aw",@progbits +# CHECK: .4byte 1596675242 +# CHECK: .text +# CHECK: lwc1 $f4, %literal(.lit4-4)($gp) # encoding: [0xfc'A',0xff'A',0x84,0xc7] +# CHECK: # fixup A - offset: 0, value: .lit4@LITERAL, kind: fixup_Mips_LITERAL +