Commit 2bbda7f4 by Jaydeep Patil Committed by Jim Stichnoth

[SubZero] Fix code generation issues occurred in Cross-test and PNaCL smoke-tests

The patch fixes various code generation issues found during testing of Cross-test and PNaCL smoke-test framework. 1) To keep track of branches to same label, relative position of the branch from previous branch is used. 2) Fixed encoding of conditional mov instructions 3) Added MovFP64ToI64 instruction for f64 to i64 move 4) Handled vector-types in Phi nodes 5) Fixed alignment of spilled vector arguments on stack 6) Save-restore FP registers 7) Fixed code generation for Zext and Sext operations 8) Fixed InsertElement for vi16x8 type R=stichnot@chromium.org Patch from Jaydeep Patil <jaydeep.patil@imgtec.com>. Review-Url: https://codereview.chromium.org/2619943003 .
parent 4b1bdae3
...@@ -196,7 +196,10 @@ void AssemblerMIPS32::bind(Label *L) { ...@@ -196,7 +196,10 @@ void AssemblerMIPS32::bind(Label *L) {
IOffsetT Dest = BoundPc - Position; IOffsetT Dest = BoundPc - Position;
IValueT Inst = Buffer.load<IValueT>(Position); IValueT Inst = Buffer.load<IValueT>(Position);
Buffer.store<IValueT>(Position, encodeBranchOffset(Dest, Inst)); Buffer.store<IValueT>(Position, encodeBranchOffset(Dest, Inst));
L->setPosition(decodeBranchOffset(Inst)); IOffsetT NextBrPc = decodeBranchOffset(Inst);
if (NextBrPc != 0)
NextBrPc = Position - NextBrPc;
L->setPosition(NextBrPc);
} }
L->bindTo(BoundPc); L->bindTo(BoundPc);
} }
...@@ -428,7 +431,10 @@ void AssemblerMIPS32::b(Label *TargetLabel) { ...@@ -428,7 +431,10 @@ void AssemblerMIPS32::b(Label *TargetLabel) {
return; return;
} }
const IOffsetT Position = Buffer.size(); const IOffsetT Position = Buffer.size();
emitBr(CondMIPS32::AL, OpRsNone, OpRtNone, TargetLabel->getEncodedPosition()); IOffsetT PrevPosition = TargetLabel->getEncodedPosition();
if (PrevPosition != 0)
PrevPosition = Position - PrevPosition;
emitBr(CondMIPS32::AL, OpRsNone, OpRtNone, PrevPosition);
TargetLabel->linkTo(*this, Position); TargetLabel->linkTo(*this, Position);
} }
...@@ -850,7 +856,7 @@ void AssemblerMIPS32::movn(const Operand *OpRd, const Operand *OpRs, ...@@ -850,7 +856,7 @@ void AssemblerMIPS32::movn(const Operand *OpRd, const Operand *OpRs,
void AssemblerMIPS32::movn_d(const Operand *OpFd, const Operand *OpFs, void AssemblerMIPS32::movn_d(const Operand *OpFd, const Operand *OpFs,
const Operand *OpFt) { const Operand *OpFt) {
static constexpr IValueT Opcode = 0x44000013; static constexpr IValueT Opcode = 0x44000013;
emitCOP1FmtRtFsFd(Opcode, SinglePrecision, OpFd, OpFs, OpFt, "movn.d"); emitCOP1FmtRtFsFd(Opcode, DoublePrecision, OpFd, OpFs, OpFt, "movn.d");
} }
void AssemblerMIPS32::movn_s(const Operand *OpFd, const Operand *OpFs, void AssemblerMIPS32::movn_s(const Operand *OpFd, const Operand *OpFs,
...@@ -879,7 +885,7 @@ void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs, ...@@ -879,7 +885,7 @@ void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs,
void AssemblerMIPS32::movz_d(const Operand *OpFd, const Operand *OpFs, void AssemblerMIPS32::movz_d(const Operand *OpFd, const Operand *OpFs,
const Operand *OpFt) { const Operand *OpFt) {
static constexpr IValueT Opcode = 0x44000012; static constexpr IValueT Opcode = 0x44000012;
emitCOP1FmtFtFsFd(Opcode, SinglePrecision, OpFd, OpFs, OpFt, "movz.d"); emitCOP1FmtFtFsFd(Opcode, DoublePrecision, OpFd, OpFs, OpFt, "movz.d");
} }
void AssemblerMIPS32::movz(const Operand *OpRd, const Operand *OpRs, void AssemblerMIPS32::movz(const Operand *OpRd, const Operand *OpRs,
...@@ -1239,7 +1245,10 @@ void AssemblerMIPS32::bcc(const CondMIPS32::Cond Cond, const Operand *OpRs, ...@@ -1239,7 +1245,10 @@ void AssemblerMIPS32::bcc(const CondMIPS32::Cond Cond, const Operand *OpRs,
return; return;
} }
const IOffsetT Position = Buffer.size(); const IOffsetT Position = Buffer.size();
emitBr(Cond, OpRs, OpRt, TargetLabel->getEncodedPosition()); IOffsetT PrevPosition = TargetLabel->getEncodedPosition();
if (PrevPosition != 0)
PrevPosition = Position - PrevPosition;
emitBr(Cond, OpRs, OpRt, PrevPosition);
TargetLabel->linkTo(*this, Position); TargetLabel->linkTo(*this, Position);
} }
...@@ -1252,7 +1261,10 @@ void AssemblerMIPS32::bzc(const CondMIPS32::Cond Cond, const Operand *OpRs, ...@@ -1252,7 +1261,10 @@ void AssemblerMIPS32::bzc(const CondMIPS32::Cond Cond, const Operand *OpRs,
return; return;
} }
const IOffsetT Position = Buffer.size(); const IOffsetT Position = Buffer.size();
emitBr(Cond, OpRs, OpRtNone, TargetLabel->getEncodedPosition()); IOffsetT PrevPosition = TargetLabel->getEncodedPosition();
if (PrevPosition)
PrevPosition = Position - PrevPosition;
emitBr(Cond, OpRs, OpRtNone, PrevPosition);
TargetLabel->linkTo(*this, Position); TargetLabel->linkTo(*this, Position);
} }
......
...@@ -315,6 +315,13 @@ InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src, ...@@ -315,6 +315,13 @@ InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src,
} }
} }
InstMIPS32MovFP64ToI64::InstMIPS32MovFP64ToI64(Cfg *Func, Variable *Dst,
Operand *Src,
Int64Part Int64HiLo)
: InstMIPS32(Func, InstMIPS32::Mov_fp, 1, Dst), Int64HiLo(Int64HiLo) {
addSource(Src);
}
InstMIPS32Ret::InstMIPS32Ret(Cfg *Func, Variable *RA, Variable *Source) InstMIPS32Ret::InstMIPS32Ret(Cfg *Func, Variable *RA, Variable *Source)
: InstMIPS32(Func, InstMIPS32::Ret, Source ? 2 : 1, nullptr) { : InstMIPS32(Func, InstMIPS32::Ret, Source ? 2 : 1, nullptr) {
addSource(RA); addSource(RA);
......
...@@ -29,6 +29,7 @@ namespace Ice { ...@@ -29,6 +29,7 @@ namespace Ice {
namespace MIPS32 { namespace MIPS32 {
enum RelocOp { RO_No, RO_Hi, RO_Lo, RO_Jal }; enum RelocOp { RO_No, RO_Hi, RO_Lo, RO_Jal };
enum Int64Part { Int64_Hi, Int64_Lo };
inline void emitRelocOp(Ostream &Str, RelocOp Reloc) { inline void emitRelocOp(Ostream &Str, RelocOp Reloc) {
switch (Reloc) { switch (Reloc) {
...@@ -232,6 +233,7 @@ public: ...@@ -232,6 +233,7 @@ public:
Mfhi, Mfhi,
Mflo, Mflo,
Mov, // actually a pseudo op for addi rd, rs, 0 Mov, // actually a pseudo op for addi rd, rs, 0
Mov_fp,
Mov_d, Mov_d,
Mov_s, Mov_s,
Movf, Movf,
...@@ -1320,6 +1322,44 @@ private: ...@@ -1320,6 +1322,44 @@ private:
Variable *DestHi = nullptr; Variable *DestHi = nullptr;
}; };
/// Handle double to i64 move
class InstMIPS32MovFP64ToI64 final : public InstMIPS32 {
InstMIPS32MovFP64ToI64() = delete;
InstMIPS32MovFP64ToI64(const InstMIPS32MovFP64ToI64 &) = delete;
InstMIPS32MovFP64ToI64 &operator=(const InstMIPS32MovFP64ToI64 &) = delete;
public:
static InstMIPS32MovFP64ToI64 *create(Cfg *Func, Variable *Dest, Operand *Src,
Int64Part Int64HiLo) {
return new (Func->allocate<InstMIPS32MovFP64ToI64>())
InstMIPS32MovFP64ToI64(Func, Dest, Src, Int64HiLo);
}
bool isRedundantAssign() const override {
return checkForRedundantAssign(getDest(), getSrc(0));
}
void dump(const Cfg *Func) const override {
if (!BuildDefs::dump())
return;
Ostream &Str = Func->getContext()->getStrDump();
getDest()->dump(Func);
Str << " = ";
dumpOpcode(Str, "mov_fp", getDest()->getType());
Str << " ";
getSrc(0)->dump(Func);
}
Int64Part getInt64Part() const { return Int64HiLo; }
static bool classof(const Inst *Inst) { return isClassof(Inst, Mov_fp); }
private:
InstMIPS32MovFP64ToI64(Cfg *Func, Variable *Dest, Operand *Src,
Int64Part Int64HiLo);
const Int64Part Int64HiLo;
};
// Declare partial template specializations of emit() methods that already have // Declare partial template specializations of emit() methods that already have
// default implementations. Without this, there is the possibility of ODR // default implementations. Without this, there is the possibility of ODR
// violations and link errors. // violations and link errors.
......
...@@ -36,7 +36,8 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) { ...@@ -36,7 +36,8 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) {
if (Phi->isDeleted()) if (Phi->isDeleted())
continue; continue;
Variable *Dest = Phi->getDest(); Variable *Dest = Phi->getDest();
if (Dest->getType() == IceType_i64) { Type DestTy = Dest->getType();
if (DestTy == IceType_i64) {
auto *DestLo = llvm::cast<Variable>(Target->loOperand(Dest)); auto *DestLo = llvm::cast<Variable>(Target->loOperand(Dest));
auto *DestHi = llvm::cast<Variable>(Target->hiOperand(Dest)); auto *DestHi = llvm::cast<Variable>(Target->hiOperand(Dest));
auto *PhiLo = InstPhi::create(Func, Phi->getSrcSize(), DestLo); auto *PhiLo = InstPhi::create(Func, Phi->getSrcSize(), DestLo);
...@@ -51,6 +52,23 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) { ...@@ -51,6 +52,23 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) {
Node->getPhis().push_back(PhiLo); Node->getPhis().push_back(PhiLo);
Node->getPhis().push_back(PhiHi); Node->getPhis().push_back(PhiHi);
Phi->setDeleted(); Phi->setDeleted();
} else if (isVectorType(DestTy) &&
Target->shouldSplitToVariableVecOn32(DestTy)) {
auto *DstVec = llvm::cast<VariableVecOn32>(Dest);
SizeT Idx = 0;
for (Variable *DestElem : DstVec->getContainers()) {
auto *PhiElem = InstPhi::create(Func, Phi->getSrcSize(), DestElem);
for (SizeT I = 0; I < Phi->getSrcSize(); ++I) {
Operand *Src = Phi->getSrc(I);
CfgNode *Label = Phi->getLabel(I);
Src = Target->legalizeUndef(Src);
auto *SrcVec = llvm::cast<VariableVecOn32>(Src);
PhiElem->addArgument(SrcVec->getContainers()[Idx], Label);
}
++Idx;
Node->getPhis().push_back(PhiElem);
}
Phi->setDeleted();
} }
} }
} }
......
...@@ -392,6 +392,11 @@ public: ...@@ -392,6 +392,11 @@ public:
} }
} }
void _mov_fp64_to_i64(Variable *Dest, Operand *Src, Int64Part Int64HiLo) {
assert(Dest != nullptr);
Context.insert<InstMIPS32MovFP64ToI64>(Dest, Src, Int64HiLo);
}
void _mov_d(Variable *Dest, Variable *Src) { void _mov_d(Variable *Dest, Variable *Src) {
Context.insert<InstMIPS32Mov_d>(Dest, Src); Context.insert<InstMIPS32Mov_d>(Dest, Src);
} }
...@@ -659,7 +664,9 @@ public: ...@@ -659,7 +664,9 @@ public:
Variable *makeReg(Type Ty, RegNumT RegNum = RegNumT()); Variable *makeReg(Type Ty, RegNumT RegNum = RegNumT());
Variable *getZero() { Variable *getZero() {
return getPhysicalRegister(RegMIPS32::Reg_ZERO, IceType_i32); auto *Zero = makeReg(IceType_i32, RegMIPS32::Reg_ZERO);
Context.insert<InstFakeDef>(Zero);
return Zero;
} }
Variable *I32Reg(RegNumT RegNum = RegNumT()) { Variable *I32Reg(RegNumT RegNum = RegNumT()) {
...@@ -809,6 +816,7 @@ protected: ...@@ -809,6 +816,7 @@ protected:
/// ///
/// Moves to memory become store instructions, and moves from memory, loads. /// Moves to memory become store instructions, and moves from memory, loads.
void legalizeMov(InstMIPS32Mov *Mov); void legalizeMov(InstMIPS32Mov *Mov);
void legalizeMovFp(InstMIPS32MovFP64ToI64 *MovInstr);
private: private:
/// Creates a new Base register centered around [Base, +/- Offset]. /// Creates a new Base register centered around [Base, +/- Offset].
......
...@@ -41,6 +41,7 @@ entry: ...@@ -41,6 +41,7 @@ entry:
; ASM-LABEL: encBswap16 ; ASM-LABEL: encBswap16
; ASM-NEXT: .LencBswap16$entry: ; ASM-NEXT: .LencBswap16$entry:
; ASM-NEXT: andi $a0, $a0, 65535
; ASM-NEXT: sll $v0, $a0, 8 ; ASM-NEXT: sll $v0, $a0, 8
; ASM-NEXT: lui $v1, 255 ; ASM-NEXT: lui $v1, 255
; ASM-NEXT: and $v0, $v0, $v1 ; ASM-NEXT: and $v0, $v0, $v1
...@@ -51,6 +52,7 @@ entry: ...@@ -51,6 +52,7 @@ entry:
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
; DIS-LABEL: <encBswap16>: ; DIS-LABEL: <encBswap16>:
; DIS-NEXT: 3084ffff andi a0,a0,0xffff
; DIS-NEXT: 00041200 sll v0,a0,0x8 ; DIS-NEXT: 00041200 sll v0,a0,0x8
; DIS-NEXT: 3c0300ff lui v1,0xff ; DIS-NEXT: 3c0300ff lui v1,0xff
; DIS-NEXT: 00431024 and v0,v0,v1 ; DIS-NEXT: 00431024 and v0,v0,v1
...@@ -62,6 +64,10 @@ entry: ...@@ -62,6 +64,10 @@ entry:
; IASM-LABEL: encBswap16 ; IASM-LABEL: encBswap16
; IASM-NEXT: .LencBswap16$entry: ; IASM-NEXT: .LencBswap16$entry:
; IASM-NEXT: .byte 0xff
; IASM-NEXT: .byte 0xff
; IASM-NEXT: .byte 0x84
; IASM-NEXT: .byte 0x30
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x12 ; IASM-NEXT: .byte 0x12
; IASM-NEXT: .byte 0x4 ; IASM-NEXT: .byte 0x4
...@@ -576,7 +582,7 @@ entry: ...@@ -576,7 +582,7 @@ entry:
; ASM-NEXT: clz $a0, $a0 ; ASM-NEXT: clz $a0, $a0
; ASM-NEXT: addiu $a0, $a0, 32 ; ASM-NEXT: addiu $a0, $a0, 32
; ASM-NEXT: movn $a0, $v0, $a1 ; ASM-NEXT: movn $a0, $v0, $a1
; ASM-NEXT: addiu $v0, $zero, 0 ; ASM: addiu $v0, $zero, 0
; ASM-NEXT: move $v1, $v0 ; ASM-NEXT: move $v1, $v0
; ASM-NEXT: move $v0, $a0 ; ASM-NEXT: move $v0, $a0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
...@@ -705,10 +711,10 @@ entry: ...@@ -705,10 +711,10 @@ entry:
; ASM-LABEL: encCttz32 ; ASM-LABEL: encCttz32
; ASM-NEXT: .LencCttz32$entry: ; ASM-NEXT: .LencCttz32$entry:
; ASM-NEXT: addiu $v0, $a0, -1 ; ASM-NEXT: addiu $v0, $a0, -1
; ASM-NEXT: nor $a0, $a0, $zero ; ASM: nor $a0, $a0, $zero
; ASM-NEXT: and $a0, $a0, $v0 ; ASM-NEXT: and $a0, $a0, $v0
; ASM-NEXT: clz $a0, $a0 ; ASM-NEXT: clz $a0, $a0
; ASM-NEXT: addiu $v0, $zero, 32 ; ASM: addiu $v0, $zero, 32
; ASM-NEXT: subu $v0, $v0, $a0 ; ASM-NEXT: subu $v0, $v0, $a0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
...@@ -763,10 +769,10 @@ entry: ...@@ -763,10 +769,10 @@ entry:
; ASM-NEXT: lui $v0, 1 ; ASM-NEXT: lui $v0, 1
; ASM-NEXT: ori $v0, $v0, 57920 ; ASM-NEXT: ori $v0, $v0, 57920
; ASM-NEXT: addiu $v1, $v0, -1 ; ASM-NEXT: addiu $v1, $v0, -1
; ASM-NEXT: nor $v0, $v0, $zero ; ASM: nor $v0, $v0, $zero
; ASM-NEXT: and $v0, $v0, $v1 ; ASM-NEXT: and $v0, $v0, $v1
; ASM-NEXT: clz $v0, $v0 ; ASM-NEXT: clz $v0, $v0
; ASM-NEXT: addiu $v1, $zero, 32 ; ASM: addiu $v1, $zero, 32
; ASM-NEXT: subu $v1, $v1, $v0 ; ASM-NEXT: subu $v1, $v1, $v0
; ASM-NEXT: move $v0, $v1 ; ASM-NEXT: move $v0, $v1
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
...@@ -835,19 +841,19 @@ entry: ...@@ -835,19 +841,19 @@ entry:
; ASM-LABEL: encCttz64 ; ASM-LABEL: encCttz64
; ASM-NEXT: .LencCttz64$entry: ; ASM-NEXT: .LencCttz64$entry:
; ASM-NEXT: addiu $v0, $a1, -1 ; ASM-NEXT: addiu $v0, $a1, -1
; ASM-NEXT: nor $a1, $a1, $zero ; ASM: nor $a1, $a1, $zero
; ASM-NEXT: and $a1, $a1, $v0 ; ASM-NEXT: and $a1, $a1, $v0
; ASM-NEXT: clz $a1, $a1 ; ASM-NEXT: clz $a1, $a1
; ASM-NEXT: addiu $v0, $zero, 64 ; ASM: addiu $v0, $zero, 64
; ASM-NEXT: subu $v0, $v0, $a1 ; ASM-NEXT: subu $v0, $v0, $a1
; ASM-NEXT: addiu $v1, $a0, -1 ; ASM-NEXT: addiu $v1, $a0, -1
; ASM-NEXT: nor $a1, $a0, $zero ; ASM: nor $a1, $a0, $zero
; ASM-NEXT: and $a1, $a1, $v1 ; ASM-NEXT: and $a1, $a1, $v1
; ASM-NEXT: clz $a1, $a1 ; ASM-NEXT: clz $a1, $a1
; ASM-NEXT: addiu $v1, $zero, 32 ; ASM: addiu $v1, $zero, 32
; ASM-NEXT: subu $v1, $v1, $a1 ; ASM-NEXT: subu $v1, $v1, $a1
; ASM-NEXT: movn $v0, $v1, $a0 ; ASM-NEXT: movn $v0, $v1, $a0
; ASM-NEXT: addiu $v1, $zero, 0 ; ASM: addiu $v1, $zero, 0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
; DIS-LABEL: <encCttz64>: ; DIS-LABEL: <encCttz64>:
...@@ -944,19 +950,19 @@ entry: ...@@ -944,19 +950,19 @@ entry:
; ASM-NEXT: lui $v1, 48793 ; ASM-NEXT: lui $v1, 48793
; ASM-NEXT: ori $v1, $v1, 6676 ; ASM-NEXT: ori $v1, $v1, 6676
; ASM-NEXT: addiu $a0, $v0, -1 ; ASM-NEXT: addiu $a0, $v0, -1
; ASM-NEXT: nor $v0, $v0, $zero ; ASM: nor $v0, $v0, $zero
; ASM-NEXT: and $v0, $v0, $a0 ; ASM-NEXT: and $v0, $v0, $a0
; ASM-NEXT: clz $v0, $v0 ; ASM-NEXT: clz $v0, $v0
; ASM-NEXT: addiu $a0, $zero, 64 ; ASM: addiu $a0, $zero, 64
; ASM-NEXT: subu $a0, $a0, $v0 ; ASM-NEXT: subu $a0, $a0, $v0
; ASM-NEXT: addiu $v0, $v1, -1 ; ASM-NEXT: addiu $v0, $v1, -1
; ASM-NEXT: nor $a1, $v1, $zero ; ASM: nor $a1, $v1, $zero
; ASM-NEXT: and $a1, $a1, $v0 ; ASM-NEXT: and $a1, $a1, $v0
; ASM-NEXT: clz $a1, $a1 ; ASM-NEXT: clz $a1, $a1
; ASM-NEXT: addiu $v0, $zero, 32 ; ASM: addiu $v0, $zero, 32
; ASM-NEXT: subu $v0, $v0, $a1 ; ASM-NEXT: subu $v0, $v0, $a1
; ASM-NEXT: movn $a0, $v0, $v1 ; ASM-NEXT: movn $a0, $v0, $v1
; ASM-NEXT: addiu $v0, $zero, 0 ; ASM: addiu $v0, $zero, 0
; ASM-NEXT: move $v1, $v0 ; ASM-NEXT: move $v1, $v0
; ASM-NEXT: move $v0, $a0 ; ASM-NEXT: move $v0, $a0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
...@@ -1072,7 +1078,7 @@ define internal void @encTrap() { ...@@ -1072,7 +1078,7 @@ define internal void @encTrap() {
; ASM-LABEL: encTrap ; ASM-LABEL: encTrap
; ASM-NEXT: .LencTrap$__0: ; ASM-NEXT: .LencTrap$__0:
; ASM-NEXT: teq $zero, $zero, 0 ; ASM: teq $zero, $zero, 0
; DIS-LABEL: <encTrap>: ; DIS-LABEL: <encTrap>:
; DIS-NEXT: 00000034 teq zero,zero ; DIS-NEXT: 00000034 teq zero,zero
......
...@@ -478,25 +478,41 @@ entry: ...@@ -478,25 +478,41 @@ entry:
} }
; ASM-LABEL: cast_d2ll_const ; ASM-LABEL: cast_d2ll_const
; ASM-LABEL: .Lcast_d2ll_const$entry: ; ASM-LABEL: .Lcast_d2ll_const$entry:
; ASM-NEXT: lui $[[REG:.*]], %hi({{.*}}) ; ASM: lui $[[REG:.*]], %hi({{.*}})
; ASM-NEXT: ldc1 $[[FREG:.*]], %lo({{.*}})($[[REG]]) ; ASM-NEXT: ldc1 $[[FREG:.*]], %lo({{.*}})($[[REG]])
; DIS-LABEL: 000000c0 <cast_d2ll_const>: ; DIS-LABEL: <cast_d2ll_const>:
; DIS-NEXT: c0: 3c020000 lui v0,0x0 ; DIS: 3c020000 lui v0,0x0
; DIS-NEXT: c4: d4400000 ldc1 $f0,0(v0) ; DIS-NEXT: d4400000 ldc1 $f0,0(v0)
; IASM-LABEL: cast_d2ll_const: ; IASM-LABEL: cast_d2ll_const:
; IASM-LABEL: .Lcast_d2ll_const$entry: ; IASM-LABEL: .Lcast_d2ll_const$entry:
; IASM-NEXT: .byte 0xf0
; IASM-NEXT: .byte 0xff
; IASM-NEXT: .byte 0xbd
; IASM-NEXT: .byte 0x27
; IASM-NEXT: .word 0x3c020000 # R_MIPS_HI16 [[LAB:.*]] ; IASM-NEXT: .word 0x3c020000 # R_MIPS_HI16 [[LAB:.*]]
; IASM-NEXT: .word 0xd4400000 # R_MIPS_LO16 [[LAB]] ; IASM-NEXT: .word 0xd4400000 # R_MIPS_LO16 [[LAB]]
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x8
; IASM-NEXT: .byte 0x3
; IASM-NEXT: .byte 0x44
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xa1
; IASM-NEXT: .byte 0xe7
; IASM-NEXT: .byte 0x4
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xa0
; IASM-NEXT: .byte 0xe7
; IASM-NEXT: .byte 0x4
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xa2
; IASM-NEXT: .byte 0x8f
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x2 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x44 ; IASM-NEXT: .byte 0xa3
; IASM-NEXT: .byte 0x8f
; IASM-NEXT: .byte 0x10
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xbd
; IASM-NEXT: .byte 0x27
; IASM-NEXT: .byte 0x8 ; IASM-NEXT: .byte 0x8
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xe0 ; IASM-NEXT: .byte 0xe0
...@@ -505,7 +521,14 @@ entry: ...@@ -505,7 +521,14 @@ entry:
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x34
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x34
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
declare void @bar(i32 %a1, i32 %a2) declare void @bar(i32 %a1, i32 %a2)
define internal void @Call() { define internal void @Call() {
...@@ -515,8 +538,8 @@ define internal void @Call() { ...@@ -515,8 +538,8 @@ define internal void @Call() {
; ASM-LABEL: Call ; ASM-LABEL: Call
; ASM: jal bar ; ASM: jal bar
; DIS-LABEL: 000000e0 <Call>: ; DIS-LABEL: 000000f0 <Call>:
; DIS: f0: 0c000000 jal 0 ; DIS: 100: 0c000000 jal 0
; IASM-LABEL: Call: ; IASM-LABEL: Call:
; IASM: .word 0xc000000 # R_MIPS_26 bar ; IASM: .word 0xc000000 # R_MIPS_26 bar
...@@ -28,7 +28,7 @@ define internal void @encTrap() { ...@@ -28,7 +28,7 @@ define internal void @encTrap() {
; ASM-LABEL: encTrap ; ASM-LABEL: encTrap
; ASM-NEXT: .LencTrap$__0: ; ASM-NEXT: .LencTrap$__0:
; ASM-NEXT: teq $zero, $zero, 0 ; ASM: teq $zero, $zero, 0
; DIS-LABEL: 00000000 <encTrap>: ; DIS-LABEL: 00000000 <encTrap>:
; DIS-NEXT: 0: 00000034 teq zero,zero ; DIS-NEXT: 0: 00000034 teq zero,zero
......
...@@ -62,9 +62,9 @@ entry: ...@@ -62,9 +62,9 @@ entry:
; ARM32: bl {{.*}} R_{{.*}} f1 ; ARM32: bl {{.*}} R_{{.*}} f1
; MIPS32-LABEL: fixed_416_align_16 ; MIPS32-LABEL: fixed_416_align_16
; MIPS32-OPT2: addiu sp,sp,-436 ; MIPS32-OPT2: addiu sp,sp,-448
; MIPS32-OPT2: addiu a0,sp,16 ; MIPS32-OPT2: addiu a0,sp,16
; MIPS32-OPTM1: addiu sp,sp,-456 ; MIPS32-OPTM1: addiu sp,sp,-464
; MIPS32-OPTM1: addiu [[REG:.*]],sp,16 ; MIPS32-OPTM1: addiu [[REG:.*]],sp,16
; MIPS32-OPTM1: sw [[REG]],{{.*}} ; MIPS32-OPTM1: sw [[REG]],{{.*}}
; MIPS32-OPTM1: lw a0,{{.*}} ; MIPS32-OPTM1: lw a0,{{.*}}
...@@ -93,9 +93,9 @@ entry: ...@@ -93,9 +93,9 @@ entry:
; ARM32: bl {{.*}} R_{{.*}} f1 ; ARM32: bl {{.*}} R_{{.*}} f1
; MIPS32-LABEL: fixed_416_align_32 ; MIPS32-LABEL: fixed_416_align_32
; MIPS32-OPT2: addiu sp,sp,-440 ; MIPS32-OPT2: addiu sp,sp,-448
; MIPS32-OPT2: addiu a0,sp,32 ; MIPS32-OPT2: addiu a0,sp,16
; MIPS32-OPTM1: addiu sp,sp,-456 ; MIPS32-OPTM1: addiu sp,sp,-464
; MIPS32-OPTM1: addiu [[REG:.*]],sp,32 ; MIPS32-OPTM1: addiu [[REG:.*]],sp,32
; MIPS32-OPTM1: sw [[REG]],{{.*}} ; MIPS32-OPTM1: sw [[REG]],{{.*}}
; MIPS32-OPTM1: lw a0,{{.*}} ; MIPS32-OPTM1: lw a0,{{.*}}
...@@ -127,9 +127,9 @@ entry: ...@@ -127,9 +127,9 @@ entry:
; ARM32: bl {{.*}} R_{{.*}} f1 ; ARM32: bl {{.*}} R_{{.*}} f1
; MIPS32-LABEL: fixed_351_align_16 ; MIPS32-LABEL: fixed_351_align_16
; MIPS32-OPT2: addiu sp,sp,-372 ; MIPS32-OPT2: addiu sp,sp,-384
; MIPS32-OPT2: addiu a0,sp,16 ; MIPS32-OPT2: addiu a0,sp,16
; MIPS32-OPTM1: addiu sp,sp,-392 ; MIPS32-OPTM1: addiu sp,sp,-400
; MIPS32-OPTM1: addiu [[REG:.*]],sp,16 ; MIPS32-OPTM1: addiu [[REG:.*]],sp,16
; MIPS32-OPTM1: sw [[REG]],{{.*}} ; MIPS32-OPTM1: sw [[REG]],{{.*}}
; MIPS32-OPTM1: lw a0,{{.*}} ; MIPS32-OPTM1: lw a0,{{.*}}
...@@ -158,9 +158,9 @@ entry: ...@@ -158,9 +158,9 @@ entry:
; ARM32: bl {{.*}} R_{{.*}} f1 ; ARM32: bl {{.*}} R_{{.*}} f1
; MIPS32-LABEL: fixed_351_align_32 ; MIPS32-LABEL: fixed_351_align_32
; MIPS32-OPT2: addiu sp,sp,-376 ; MIPS32-OPT2: addiu sp,sp,-384
; MIPS32-OPT2: addiu a0,sp,32 ; MIPS32-OPT2: addiu a0,sp,16
; MIPS32-OPTM1: addiu sp,sp,-392 ; MIPS32-OPTM1: addiu sp,sp,-400
; MIPS32-OPTM1: addiu [[REG:.*]],sp,32 ; MIPS32-OPTM1: addiu [[REG:.*]],sp,32
; MIPS32-OPTM1: sw [[REG]],{{.*}} ; MIPS32-OPTM1: sw [[REG]],{{.*}}
; MIPS32-OPTM1: lw a0,{{.*}} ; MIPS32-OPTM1: lw a0,{{.*}}
......
...@@ -65,8 +65,10 @@ entry: ...@@ -65,8 +65,10 @@ entry:
; ARM32-LABEL: cast_d2ll ; ARM32-LABEL: cast_d2ll
; ARM32: vmov r{{[0-9]+}}, r{{[0-9]+}}, d{{[0-9]+}} ; ARM32: vmov r{{[0-9]+}}, r{{[0-9]+}}, d{{[0-9]+}}
; MIPS32-LABEL: cast_d2ll ; MIPS32-LABEL: cast_d2ll
; MIPS32-O2: mfc1 $v1, $f{{[0-9]+}} ; MIPS32-O2: swc1 $f13, {{.*}}
; MIPS32-O2: mfc1 $v0, $f{{[0-9]+}} ; MIPS32-O2: swc1 $f12, {{.*}}
; MIPS32-O2: lw $v0, {{.*}}
; MIPS32-O2: lw $v1, {{.*}}
; MIPS32-OM1: sdc1 ; MIPS32-OM1: sdc1
; MIPS32-OM1: lw ; MIPS32-OM1: lw
; MIPS32-OM1: lw ; MIPS32-OM1: lw
...@@ -87,12 +89,10 @@ entry: ...@@ -87,12 +89,10 @@ entry:
; MIPS32-LABEL: cast_d2ll_const ; MIPS32-LABEL: cast_d2ll_const
; MIPS32: lui {{.*}}, %hi(.L$double$0012345678901234) ; MIPS32: lui {{.*}}, %hi(.L$double$0012345678901234)
; MIPS32: ldc1 {{.*}}, %lo(.L$double$0012345678901234)({{.*}}) ; MIPS32: ldc1 {{.*}}, %lo(.L$double$0012345678901234)({{.*}})
; MIPS32-O2: mfc1 $v1, $f{{[0-9]+}} ; MIPS32: swc1 $f{{[0-9]+}}, {{.*}}
; MIPS32-O2: mfc1 $v0, $f{{[0-9]+}} ; MIPS32: swc1 $f{{[0-9]+}}, {{.*}}
; MIPS32-OM1: mfc1 ; MIPS32: lw $v0, {{.*}}
; MIPS32-OM1: mfc1 ; MIPS32: lw $v1, {{.*}}
; MIPS32-OM1: lw
; MIPS32-OM1: lw
define internal double @cast_ll2d(i64 %ll) { define internal double @cast_ll2d(i64 %ll) {
entry: entry:
......
...@@ -59,16 +59,16 @@ entry: ...@@ -59,16 +59,16 @@ entry:
; CHECK: mov DWORD PTR [esp+0x4],0x7b ; CHECK: mov DWORD PTR [esp+0x4],0x7b
; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
; MIPS32-LABEL: passFpArgs ; MIPS32-LABEL: passFpArgs
; MIPS32: mfc1 a2,$f15 ; MIPS32: mfc1 a2,$f{{[0-9]+}}
; MIPS32: mfc1 a3,$f14 ; MIPS32: mfc1 a3,$f{{[0-9]+}}
; MIPS32: li a1,123 ; MIPS32: li a1,123
; MIPS32: jal {{.*}} ignoreFpArgsNoInline ; MIPS32: jal {{.*}} ignoreFpArgsNoInline
; MIPS32: mfc1 a2,$f23 ; MIPS32: mfc1 a2,$f{{[0-9]+}}
; MIPS32: mfc1 a3,$f22 ; MIPS32: mfc1 a3,$f{{[0-9]+}}
; MIPS32: li a1,123 ; MIPS32: li a1,123
; MIPS32: jal {{.*}} ignoreFpArgsNoInline ; MIPS32: jal {{.*}} ignoreFpArgsNoInline
; MIPS32: mfc1 a2,$f25 ; MIPS32: mfc1 a2,$f{{[0-9]+}}
; MIPS32: mfc1 a3,$f24 ; MIPS32: mfc1 a3,$f{{[0-9]+}}
; MIPS32: li a1,123 ; MIPS32: li a1,123
; MIPS32: jal {{.*}} ignoreFpArgsNoInline ; MIPS32: jal {{.*}} ignoreFpArgsNoInline
...@@ -83,8 +83,8 @@ entry: ...@@ -83,8 +83,8 @@ entry:
; CHECK: mov DWORD PTR [esp+0x4],0x7b ; CHECK: mov DWORD PTR [esp+0x4],0x7b
; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline
; MIPS32-LABEL: passFpConstArg ; MIPS32-LABEL: passFpConstArg
; MIPS32: mfc1 a2,$f1 ; MIPS32: mfc1 a2,$f{{[0-9]+}}
; MIPS32: mfc1 a3,$f0 ; MIPS32: mfc1 a3,$f{{[0-9]+}}
; MIPS32: li a1,123 ; MIPS32: li a1,123
; MIPS32: jal {{.*}} ignoreFpArgsNoInline ; MIPS32: jal {{.*}} ignoreFpArgsNoInline
...@@ -131,8 +131,8 @@ entry: ...@@ -131,8 +131,8 @@ entry:
; CHECK-LABEL: returnFloatConst ; CHECK-LABEL: returnFloatConst
; CHECK: fld ; CHECK: fld
; MIPS32-LABEL: returnFloatConst ; MIPS32-LABEL: returnFloatConst
; MIPS32: lui v0,0x0 160: R_MIPS_HI16 .L$float$3f9d70a4 ; MIPS32: lui v0,0x0 {{.*}} .L$float$3f9d70a4
; MIPS32: lwc1 $f0,0(v0) 164: R_MIPS_LO16 .L$float$3f9d70a4 ; MIPS32: lwc1 $f0,0(v0) {{.*}} .L$float$3f9d70a4
; MIPS32: jr ra ; MIPS32: jr ra
define internal double @returnDoubleConst() { define internal double @returnDoubleConst() {
...@@ -142,6 +142,6 @@ entry: ...@@ -142,6 +142,6 @@ entry:
; CHECK-LABEL: returnDoubleConst ; CHECK-LABEL: returnDoubleConst
; CHECK: fld ; CHECK: fld
; MIPS32-LABEL: returnDoubleConst ; MIPS32-LABEL: returnDoubleConst
; MIPS32: lui v0,0x0 170: R_MIPS_HI16 .L$double$3ff3ae147ae147ae ; MIPS32: lui v0,0x0 {{.*}} .L$double$3ff3ae147ae147ae
; MIPS32: ldc1 $f0,0(v0) 174: R_MIPS_LO16 .L$double$3ff3ae147ae147ae ; MIPS32: ldc1 $f0,0(v0) {{.*}} .L$double$3ff3ae147ae147ae
; MIPS32: jr ra ; MIPS32: jr ra
...@@ -70,7 +70,7 @@ entry: ...@@ -70,7 +70,7 @@ entry:
; MIPS32: andi a0,a0,0x1 ; MIPS32: andi a0,a0,0x1
; MIPS32: sll a0,a0,0x1f ; MIPS32: sll a0,a0,0x1f
; MIPS32: sra a0,a0,0x1f ; MIPS32: sra a0,a0,0x1f
; MIPS32: srl a0,a0,0x18 ; MIPS32: sll a0,a0,0x18
; MIPS32: sll t2,t2,0x8 ; MIPS32: sll t2,t2,0x8
; MIPS32: srl t2,t2,0x8 ; MIPS32: srl t2,t2,0x8
; MIPS32: or a0,a0,t2 ; MIPS32: or a0,a0,t2
...@@ -111,7 +111,7 @@ entry: ...@@ -111,7 +111,7 @@ entry:
; MIPS32: andi a1,a1,0x1 ; MIPS32: andi a1,a1,0x1
; MIPS32: sll a1,a1,0x1f ; MIPS32: sll a1,a1,0x1f
; MIPS32: sra a1,a1,0x1f ; MIPS32: sra a1,a1,0x1f
; MIPS32: srl a1,a1,0x18 ; MIPS32: sll a1,a1,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a1,a1,v0 ; MIPS32: or a1,a1,v0
...@@ -152,7 +152,7 @@ entry: ...@@ -152,7 +152,7 @@ entry:
; MIPS32: andi a2,a2,0x1 ; MIPS32: andi a2,a2,0x1
; MIPS32: sll a2,a2,0x1f ; MIPS32: sll a2,a2,0x1f
; MIPS32: sra a2,a2,0x1f ; MIPS32: sra a2,a2,0x1f
; MIPS32: srl a2,a2,0x18 ; MIPS32: sll a2,a2,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a2,a2,v0 ; MIPS32: or a2,a2,v0
...@@ -193,7 +193,7 @@ entry: ...@@ -193,7 +193,7 @@ entry:
; MIPS32: andi a3,a3,0x1 ; MIPS32: andi a3,a3,0x1
; MIPS32: sll a3,a3,0x1f ; MIPS32: sll a3,a3,0x1f
; MIPS32: sra a3,a3,0x1f ; MIPS32: sra a3,a3,0x1f
; MIPS32: srl a3,a3,0x18 ; MIPS32: sll a3,a3,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a3,a3,v0 ; MIPS32: or a3,a3,v0
...@@ -354,7 +354,7 @@ entry: ...@@ -354,7 +354,7 @@ entry:
; MIPS32: srl a0,a0,0x18 ; MIPS32: srl a0,a0,0x18
; MIPS32: andi a0,a0,0x1 ; MIPS32: andi a0,a0,0x1
; MIPS32: andi a0,a0,0x1 ; MIPS32: andi a0,a0,0x1
; MIPS32: srl a0,a0,0x18 ; MIPS32: sll a0,a0,0x18
; MIPS32: sll t2,t2,0x8 ; MIPS32: sll t2,t2,0x8
; MIPS32: srl t2,t2,0x8 ; MIPS32: srl t2,t2,0x8
; MIPS32: or a0,a0,t2 ; MIPS32: or a0,a0,t2
...@@ -391,7 +391,7 @@ entry: ...@@ -391,7 +391,7 @@ entry:
; MIPS32: srl a1,a1,0x18 ; MIPS32: srl a1,a1,0x18
; MIPS32: andi a1,a1,0x1 ; MIPS32: andi a1,a1,0x1
; MIPS32: andi a1,a1,0x1 ; MIPS32: andi a1,a1,0x1
; MIPS32: srl a1,a1,0x18 ; MIPS32: sll a1,a1,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a1,a1,v0 ; MIPS32: or a1,a1,v0
...@@ -428,7 +428,7 @@ entry: ...@@ -428,7 +428,7 @@ entry:
; MIPS32: srl a2,a2,0x18 ; MIPS32: srl a2,a2,0x18
; MIPS32: andi a2,a2,0x1 ; MIPS32: andi a2,a2,0x1
; MIPS32: andi a2,a2,0x1 ; MIPS32: andi a2,a2,0x1
; MIPS32: srl a2,a2,0x18 ; MIPS32: sll a2,a2,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a2,a2,v0 ; MIPS32: or a2,a2,v0
...@@ -465,7 +465,7 @@ entry: ...@@ -465,7 +465,7 @@ entry:
; MIPS32: srl a3,a3,0x18 ; MIPS32: srl a3,a3,0x18
; MIPS32: andi a3,a3,0x1 ; MIPS32: andi a3,a3,0x1
; MIPS32: andi a3,a3,0x1 ; MIPS32: andi a3,a3,0x1
; MIPS32: srl a3,a3,0x18 ; MIPS32: sll a3,a3,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a3,a3,v0 ; MIPS32: or a3,a3,v0
...@@ -581,6 +581,7 @@ entry: ...@@ -581,6 +581,7 @@ entry:
; X8632: pand ; X8632: pand
; MIPS32: move t2,a0 ; MIPS32: move t2,a0
; MIPS32: andi t2,t2,0xff ; MIPS32: andi t2,t2,0xff
; MIPS32: andi t2,t2,0x1
; MIPS32: andi t2,t2,0xff ; MIPS32: andi t2,t2,0xff
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
...@@ -588,6 +589,7 @@ entry: ...@@ -588,6 +589,7 @@ entry:
; MIPS32: move v0,a0 ; MIPS32: move v0,a0
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: lui t3,0xffff ; MIPS32: lui t3,0xffff
...@@ -597,6 +599,7 @@ entry: ...@@ -597,6 +599,7 @@ entry:
; MIPS32: move t2,a0 ; MIPS32: move t2,a0
; MIPS32: srl t2,t2,0x10 ; MIPS32: srl t2,t2,0x10
; MIPS32: andi t2,t2,0xff ; MIPS32: andi t2,t2,0xff
; MIPS32: andi t2,t2,0x1
; MIPS32: andi t2,t2,0xff ; MIPS32: andi t2,t2,0xff
; MIPS32: sll t2,t2,0x10 ; MIPS32: sll t2,t2,0x10
; MIPS32: lui t3,0xff00 ; MIPS32: lui t3,0xff00
...@@ -604,12 +607,14 @@ entry: ...@@ -604,12 +607,14 @@ entry:
; MIPS32: and v0,v0,t3 ; MIPS32: and v0,v0,t3
; MIPS32: or t2,t2,v0 ; MIPS32: or t2,t2,v0
; MIPS32: srl a0,a0,0x18 ; MIPS32: srl a0,a0,0x18
; MIPS32: srl a0,a0,0x18 ; MIPS32: andi a0,a0,0x1
; MIPS32: sll a0,a0,0x18
; MIPS32: sll t2,t2,0x8 ; MIPS32: sll t2,t2,0x8
; MIPS32: srl t2,t2,0x8 ; MIPS32: srl t2,t2,0x8
; MIPS32: or a0,a0,t2 ; MIPS32: or a0,a0,t2
; MIPS32: move v0,a1 ; MIPS32: move v0,a1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: srl v1,v1,0x8 ; MIPS32: srl v1,v1,0x8
; MIPS32: sll v1,v1,0x8 ; MIPS32: sll v1,v1,0x8
...@@ -617,6 +622,7 @@ entry: ...@@ -617,6 +622,7 @@ entry:
; MIPS32: move v1,a1 ; MIPS32: move v1,a1
; MIPS32: srl v1,v1,0x8 ; MIPS32: srl v1,v1,0x8
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: andi v1,v1,0x1
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: sll v1,v1,0x8 ; MIPS32: sll v1,v1,0x8
; MIPS32: lui t2,0xffff ; MIPS32: lui t2,0xffff
...@@ -626,6 +632,7 @@ entry: ...@@ -626,6 +632,7 @@ entry:
; MIPS32: move v0,a1 ; MIPS32: move v0,a1
; MIPS32: srl v0,v0,0x10 ; MIPS32: srl v0,v0,0x10
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: sll v0,v0,0x10 ; MIPS32: sll v0,v0,0x10
; MIPS32: lui t2,0xff00 ; MIPS32: lui t2,0xff00
...@@ -633,12 +640,14 @@ entry: ...@@ -633,12 +640,14 @@ entry:
; MIPS32: and v1,v1,t2 ; MIPS32: and v1,v1,t2
; MIPS32: or v0,v0,v1 ; MIPS32: or v0,v0,v1
; MIPS32: srl a1,a1,0x18 ; MIPS32: srl a1,a1,0x18
; MIPS32: srl a1,a1,0x18 ; MIPS32: andi a1,a1,0x1
; MIPS32: sll a1,a1,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a1,a1,v0 ; MIPS32: or a1,a1,v0
; MIPS32: move v0,a2 ; MIPS32: move v0,a2
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: srl t0,t0,0x8 ; MIPS32: srl t0,t0,0x8
; MIPS32: sll t0,t0,0x8 ; MIPS32: sll t0,t0,0x8
...@@ -646,6 +655,7 @@ entry: ...@@ -646,6 +655,7 @@ entry:
; MIPS32: move v1,a2 ; MIPS32: move v1,a2
; MIPS32: srl v1,v1,0x8 ; MIPS32: srl v1,v1,0x8
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: andi v1,v1,0x1
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: sll v1,v1,0x8 ; MIPS32: sll v1,v1,0x8
; MIPS32: lui t0,0xffff ; MIPS32: lui t0,0xffff
...@@ -655,6 +665,7 @@ entry: ...@@ -655,6 +665,7 @@ entry:
; MIPS32: move v0,a2 ; MIPS32: move v0,a2
; MIPS32: srl v0,v0,0x10 ; MIPS32: srl v0,v0,0x10
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: sll v0,v0,0x10 ; MIPS32: sll v0,v0,0x10
; MIPS32: lui t0,0xff00 ; MIPS32: lui t0,0xff00
...@@ -662,12 +673,14 @@ entry: ...@@ -662,12 +673,14 @@ entry:
; MIPS32: and v1,v1,t0 ; MIPS32: and v1,v1,t0
; MIPS32: or v0,v0,v1 ; MIPS32: or v0,v0,v1
; MIPS32: srl a2,a2,0x18 ; MIPS32: srl a2,a2,0x18
; MIPS32: srl a2,a2,0x18 ; MIPS32: andi a2,a2,0x1
; MIPS32: sll a2,a2,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a2,a2,v0 ; MIPS32: or a2,a2,v0
; MIPS32: move v0,a3 ; MIPS32: move v0,a3
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: srl t1,t1,0x8 ; MIPS32: srl t1,t1,0x8
; MIPS32: sll t1,t1,0x8 ; MIPS32: sll t1,t1,0x8
...@@ -675,6 +688,7 @@ entry: ...@@ -675,6 +688,7 @@ entry:
; MIPS32: move v1,a3 ; MIPS32: move v1,a3
; MIPS32: srl v1,v1,0x8 ; MIPS32: srl v1,v1,0x8
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: andi v1,v1,0x1
; MIPS32: andi v1,v1,0xff ; MIPS32: andi v1,v1,0xff
; MIPS32: sll v1,v1,0x8 ; MIPS32: sll v1,v1,0x8
; MIPS32: lui t0,0xffff ; MIPS32: lui t0,0xffff
...@@ -684,6 +698,7 @@ entry: ...@@ -684,6 +698,7 @@ entry:
; MIPS32: move v0,a3 ; MIPS32: move v0,a3
; MIPS32: srl v0,v0,0x10 ; MIPS32: srl v0,v0,0x10
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: andi v0,v0,0x1
; MIPS32: andi v0,v0,0xff ; MIPS32: andi v0,v0,0xff
; MIPS32: sll v0,v0,0x10 ; MIPS32: sll v0,v0,0x10
; MIPS32: lui t0,0xff00 ; MIPS32: lui t0,0xff00
...@@ -691,7 +706,8 @@ entry: ...@@ -691,7 +706,8 @@ entry:
; MIPS32: and v1,v1,t0 ; MIPS32: and v1,v1,t0
; MIPS32: or v0,v0,v1 ; MIPS32: or v0,v0,v1
; MIPS32: srl a3,a3,0x18 ; MIPS32: srl a3,a3,0x18
; MIPS32: srl a3,a3,0x18 ; MIPS32: andi a3,a3,0x1
; MIPS32: sll a3,a3,0x18
; MIPS32: sll v0,v0,0x8 ; MIPS32: sll v0,v0,0x8
; MIPS32: srl v0,v0,0x8 ; MIPS32: srl v0,v0,0x8
; MIPS32: or a3,a3,v0 ; MIPS32: or a3,a3,v0
......
...@@ -29,7 +29,7 @@ entry: ...@@ -29,7 +29,7 @@ entry:
; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}} ; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}}
; MIPS32-LABEL: test_select_v16i8 ; MIPS32-LABEL: test_select_v16i8
; MIPS32: addiu [[T0:.*]],sp,-20 ; MIPS32: addiu [[T0:.*]],sp,-32
; MIPS32: sw [[T1:.*]], ; MIPS32: sw [[T1:.*]],
; MIPS32: sw [[T2:.*]], ; MIPS32: sw [[T2:.*]],
; MIPS32: sw [[T3:.*]], ; MIPS32: sw [[T3:.*]],
...@@ -98,7 +98,7 @@ entry: ...@@ -98,7 +98,7 @@ entry:
; MIPS32: srl [[T6]],[[T6]],0x18 ; MIPS32: srl [[T6]],[[T6]],0x18
; MIPS32: srl [[T10]],[[T10]],0x18 ; MIPS32: srl [[T10]],[[T10]],0x18
; MIPS32: movn [[T10]],[[T6]],[[T16]] ; MIPS32: movn [[T10]],[[T6]],[[T16]]
; MIPS32: srl [[T10]],[[T10]],0x18 ; MIPS32: sll [[T10]],[[T10]],0x18
; MIPS32: sll [[T1]],[[T1]],0x8 ; MIPS32: sll [[T1]],[[T1]],0x8
; MIPS32: srl [[T1]],[[T1]],0x8 ; MIPS32: srl [[T1]],[[T1]],0x8
; MIPS32: or [[T10]],[[T10]],[[T1]] ; MIPS32: or [[T10]],[[T10]],[[T1]]
...@@ -153,7 +153,7 @@ entry: ...@@ -153,7 +153,7 @@ entry:
; MIPS32: srl [[T7]],[[T7]],0x18 ; MIPS32: srl [[T7]],[[T7]],0x18
; MIPS32: srl [[T11]],[[T11]],0x18 ; MIPS32: srl [[T11]],[[T11]],0x18
; MIPS32: movn [[T11]],[[T7]],[[T17]] ; MIPS32: movn [[T11]],[[T7]],[[T17]]
; MIPS32: srl [[T11]],[[T11]],0x18 ; MIPS32: sll [[T11]],[[T11]],0x18
; MIPS32: sll [[T14]],[[T14]],0x8 ; MIPS32: sll [[T14]],[[T14]],0x8
; MIPS32: srl [[T14]],[[T14]],0x8 ; MIPS32: srl [[T14]],[[T14]],0x8
; MIPS32: or [[T11]],[[T11]],[[T14]] ; MIPS32: or [[T11]],[[T11]],[[T14]]
...@@ -208,7 +208,7 @@ entry: ...@@ -208,7 +208,7 @@ entry:
; MIPS32: srl [[T8]],[[T8]],0x18 ; MIPS32: srl [[T8]],[[T8]],0x18
; MIPS32: srl [[T12]],[[T12]],0x18 ; MIPS32: srl [[T12]],[[T12]],0x18
; MIPS32: movn [[T12]],[[T8]],[[T18]] ; MIPS32: movn [[T12]],[[T8]],[[T18]]
; MIPS32: srl [[T12]],[[T12]],0x18 ; MIPS32: sll [[T12]],[[T12]],0x18
; MIPS32: sll [[T16]],[[T16]],0x8 ; MIPS32: sll [[T16]],[[T16]],0x8
; MIPS32: srl [[T16]],[[T16]],0x8 ; MIPS32: srl [[T16]],[[T16]],0x8
; MIPS32: or [[T12]],[[T12]],[[T16]] ; MIPS32: or [[T12]],[[T12]],[[T16]]
...@@ -263,7 +263,7 @@ entry: ...@@ -263,7 +263,7 @@ entry:
; MIPS32: srl [[T9]],[[T9]],0x18 ; MIPS32: srl [[T9]],[[T9]],0x18
; MIPS32: srl [[T13]],[[T13]],0x18 ; MIPS32: srl [[T13]],[[T13]],0x18
; MIPS32: movn [[T13]],[[T9]],[[T19]] ; MIPS32: movn [[T13]],[[T9]],[[T19]]
; MIPS32: srl [[T13]],[[T13]],0x18 ; MIPS32: sll [[T13]],[[T13]],0x18
; MIPS32: sll [[T16]],[[T16]],0x8 ; MIPS32: sll [[T16]],[[T16]],0x8
; MIPS32: srl [[T16]],[[T16]],0x8 ; MIPS32: srl [[T16]],[[T16]],0x8
; MIPS32: or [[T13]],[[T13]],[[T16]] ; MIPS32: or [[T13]],[[T13]],[[T16]]
...@@ -276,7 +276,7 @@ entry: ...@@ -276,7 +276,7 @@ entry:
; MIPS32: lw [[T3]], ; MIPS32: lw [[T3]],
; MIPS32: lw [[T2]], ; MIPS32: lw [[T2]],
; MIPS32: lw [[T1]], ; MIPS32: lw [[T1]],
; MIPS32: addiu [[T0]],sp,20 ; MIPS32: addiu [[T0]],sp,32
} }
define internal <16 x i1> @test_select_v16i1(<16 x i1> %cond, <16 x i1> %arg1, define internal <16 x i1> @test_select_v16i1(<16 x i1> %cond, <16 x i1> %arg1,
...@@ -293,7 +293,7 @@ entry: ...@@ -293,7 +293,7 @@ entry:
; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}} ; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}}
; MIPS32-LABEL: test_select_v16i1 ; MIPS32-LABEL: test_select_v16i1
; MIPS32: addiu [[T0:.*]],sp,-20 ; MIPS32: addiu [[T0:.*]],sp,-32
; MIPS32: sw [[T1:.*]], ; MIPS32: sw [[T1:.*]],
; MIPS32: sw [[T2:.*]], ; MIPS32: sw [[T2:.*]],
; MIPS32: sw [[T3:.*]], ; MIPS32: sw [[T3:.*]],
...@@ -370,7 +370,7 @@ entry: ...@@ -370,7 +370,7 @@ entry:
; MIPS32: srl [[T10]],[[T10]],0x18 ; MIPS32: srl [[T10]],[[T10]],0x18
; MIPS32: andi [[T10]],[[T10]],0x1 ; MIPS32: andi [[T10]],[[T10]],0x1
; MIPS32: movn [[T10]],[[T6]],[[T16]] ; MIPS32: movn [[T10]],[[T6]],[[T16]]
; MIPS32: srl [[T10]],[[T10]],0x18 ; MIPS32: sll [[T10]],[[T10]],0x18
; MIPS32: sll [[T1]],[[T1]],0x8 ; MIPS32: sll [[T1]],[[T1]],0x8
; MIPS32: srl [[T1]],[[T1]],0x8 ; MIPS32: srl [[T1]],[[T1]],0x8
; MIPS32: or [[T10]],[[T10]],[[T1]] ; MIPS32: or [[T10]],[[T10]],[[T1]]
...@@ -433,7 +433,7 @@ entry: ...@@ -433,7 +433,7 @@ entry:
; MIPS32: srl [[T11]],[[T11]],0x18 ; MIPS32: srl [[T11]],[[T11]],0x18
; MIPS32: andi [[T11]],[[T11]],0x1 ; MIPS32: andi [[T11]],[[T11]],0x1
; MIPS32: movn [[T11]],[[T7]],[[T17]] ; MIPS32: movn [[T11]],[[T7]],[[T17]]
; MIPS32: srl [[T11]],[[T11]],0x18 ; MIPS32: sll [[T11]],[[T11]],0x18
; MIPS32: sll [[T14]],[[T14]],0x8 ; MIPS32: sll [[T14]],[[T14]],0x8
; MIPS32: srl [[T14]],[[T14]],0x8 ; MIPS32: srl [[T14]],[[T14]],0x8
; MIPS32: or [[T11]],[[T11]],[[T14]] ; MIPS32: or [[T11]],[[T11]],[[T14]]
...@@ -496,7 +496,7 @@ entry: ...@@ -496,7 +496,7 @@ entry:
; MIPS32: srl [[T12]],[[T12]],0x18 ; MIPS32: srl [[T12]],[[T12]],0x18
; MIPS32: andi [[T12]],[[T12]],0x1 ; MIPS32: andi [[T12]],[[T12]],0x1
; MIPS32: movn [[T12]],[[T8]],[[T18]] ; MIPS32: movn [[T12]],[[T8]],[[T18]]
; MIPS32: srl [[T12]],[[T12]],0x18 ; MIPS32: sll [[T12]],[[T12]],0x18
; MIPS32: sll [[T16]],[[T16]],0x8 ; MIPS32: sll [[T16]],[[T16]],0x8
; MIPS32: srl [[T16]],[[T16]],0x8 ; MIPS32: srl [[T16]],[[T16]],0x8
; MIPS32: or [[T12]],[[T12]],[[T16]] ; MIPS32: or [[T12]],[[T12]],[[T16]]
...@@ -559,7 +559,7 @@ entry: ...@@ -559,7 +559,7 @@ entry:
; MIPS32: srl [[T13]],[[T13]],0x18 ; MIPS32: srl [[T13]],[[T13]],0x18
; MIPS32: andi [[T13]],[[T13]],0x1 ; MIPS32: andi [[T13]],[[T13]],0x1
; MIPS32: movn [[T13]],[[T9]],[[T19]] ; MIPS32: movn [[T13]],[[T9]],[[T19]]
; MIPS32: srl [[T13]],[[T13]],0x18 ; MIPS32: sll [[T13]],[[T13]],0x18
; MIPS32: sll [[T16]],[[T16]],0x8 ; MIPS32: sll [[T16]],[[T16]],0x8
; MIPS32: srl [[T16]],[[T16]],0x8 ; MIPS32: srl [[T16]],[[T16]],0x8
; MIPS32: or [[T13]],[[T13]],[[T16]] ; MIPS32: or [[T13]],[[T13]],[[T16]]
...@@ -572,7 +572,7 @@ entry: ...@@ -572,7 +572,7 @@ entry:
; MIPS32: lw [[T3]], ; MIPS32: lw [[T3]],
; MIPS32: lw [[T2]], ; MIPS32: lw [[T2]],
; MIPS32: lw [[T1]], ; MIPS32: lw [[T1]],
; MIPS32: addiu [[T0]],sp,20 ; MIPS32: addiu [[T0]],sp,32
} }
define internal <8 x i16> @test_select_v8i16(<8 x i1> %cond, <8 x i16> %arg1, define internal <8 x i16> @test_select_v8i16(<8 x i1> %cond, <8 x i16> %arg1,
...@@ -589,7 +589,7 @@ entry: ...@@ -589,7 +589,7 @@ entry:
; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}} ; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}}
; MIPS32-LABEL: test_select_v8i16 ; MIPS32-LABEL: test_select_v8i16
; MIPS32: addiu [[T0:.*]],sp,-20 ; MIPS32: addiu [[T0:.*]],sp,-32
; MIPS32: sw [[T1:.*]], ; MIPS32: sw [[T1:.*]],
; MIPS32: sw [[T2:.*]], ; MIPS32: sw [[T2:.*]],
; MIPS32: sw [[T3:.*]], ; MIPS32: sw [[T3:.*]],
...@@ -700,7 +700,7 @@ entry: ...@@ -700,7 +700,7 @@ entry:
; MIPS32: lw [[T3]], ; MIPS32: lw [[T3]],
; MIPS32: lw [[T2]], ; MIPS32: lw [[T2]],
; MIPS32: lw [[T1]], ; MIPS32: lw [[T1]],
; MIPS32: addiu [[T0]],sp,20 ; MIPS32: addiu [[T0]],sp,32
} }
define internal <8 x i1> @test_select_v8i1(<8 x i1> %cond, <8 x i1> %arg1, define internal <8 x i1> @test_select_v8i1(<8 x i1> %cond, <8 x i1> %arg1,
...@@ -717,7 +717,7 @@ entry: ...@@ -717,7 +717,7 @@ entry:
; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}} ; SSE41: pblendvb xmm{{[0-7]}},{{xmm[0-7]|XMMWORD}}
; MIPS32-LABEL: test_select_v8i1 ; MIPS32-LABEL: test_select_v8i1
; MIPS32: addiu [[T0:.*]],sp,-20 ; MIPS32: addiu [[T0:.*]],sp,-32
; MIPS32: sw [[T1:.*]], ; MIPS32: sw [[T1:.*]],
; MIPS32: sw [[T2:.*]], ; MIPS32: sw [[T2:.*]],
; MIPS32: sw [[T3:.*]], ; MIPS32: sw [[T3:.*]],
...@@ -844,7 +844,7 @@ entry: ...@@ -844,7 +844,7 @@ entry:
; MIPS32: lw [[T3]], ; MIPS32: lw [[T3]],
; MIPS32: lw [[T2]], ; MIPS32: lw [[T2]],
; MIPS32: lw [[T1]], ; MIPS32: lw [[T1]],
; MIPS32: addiu [[T0]],sp,20 ; MIPS32: addiu [[T0]],sp,32
} }
define internal <4 x i32> @test_select_v4i32(<4 x i1> %cond, <4 x i32> %arg1, define internal <4 x i32> @test_select_v4i32(<4 x i1> %cond, <4 x i32> %arg1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment