[llvm] 7898587 - [LoongArch] Add basic support to Disassembler
Weining Lu via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 10 01:14:11 PST 2022
Author: Weining Lu
Date: 2022-03-10T17:08:31+08:00
New Revision: 7898587e948cc24af6e22f86c921949169f4f87b
URL: https://github.com/llvm/llvm-project/commit/7898587e948cc24af6e22f86c921949169f4f87b
DIFF: https://github.com/llvm/llvm-project/commit/7898587e948cc24af6e22f86c921949169f4f87b.diff
LOG: [LoongArch] Add basic support to Disassembler
With the addition of disassembler now we can do instructions 'round-trip' test
that assembles `.s` to obj with `llvm-mc` and disassembles it with `llvm-objdump`
to check instruction mnemonics.
Reviewed By: xen0n, MaskRay
Differential Revision: https://reviews.llvm.org/D120477
Added:
llvm/lib/Target/LoongArch/Disassembler/CMakeLists.txt
llvm/lib/Target/LoongArch/Disassembler/LoongArchDisassembler.cpp
llvm/test/MC/LoongArch/Basic/Integer/invalid-dis.s
llvm/test/MC/LoongArch/Misc/aligned-nops.s
llvm/test/MC/LoongArch/Misc/unaligned-nops.s
Modified:
llvm/lib/Target/LoongArch/CMakeLists.txt
llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
llvm/test/MC/LoongArch/Basic/Integer/arith.s
llvm/test/MC/LoongArch/Basic/Integer/atomic.s
llvm/test/MC/LoongArch/Basic/Integer/barrier.s
llvm/test/MC/LoongArch/Basic/Integer/bit-manipu.s
llvm/test/MC/LoongArch/Basic/Integer/bit-shift.s
llvm/test/MC/LoongArch/Basic/Integer/bound-check.s
llvm/test/MC/LoongArch/Basic/Integer/branch.s
llvm/test/MC/LoongArch/Basic/Integer/crc.s
llvm/test/MC/LoongArch/Basic/Integer/memory.s
llvm/test/MC/LoongArch/Basic/Integer/misc.s
llvm/test/MC/LoongArch/Basic/Integer/pseudos.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/LoongArch/CMakeLists.txt b/llvm/lib/Target/LoongArch/CMakeLists.txt
index 4eebfb713b61c..4d8e81aea4200 100644
--- a/llvm/lib/Target/LoongArch/CMakeLists.txt
+++ b/llvm/lib/Target/LoongArch/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LLVM_TARGET_DEFINITIONS LoongArch.td)
tablegen(LLVM LoongArchGenAsmMatcher.inc -gen-asm-matcher)
tablegen(LLVM LoongArchGenAsmWriter.inc -gen-asm-writer)
tablegen(LLVM LoongArchGenDAGISel.inc -gen-dag-isel)
+tablegen(LLVM LoongArchGenDisassemblerTables.inc -gen-disassembler)
tablegen(LLVM LoongArchGenInstrInfo.inc -gen-instr-info)
tablegen(LLVM LoongArchGenMCPseudoLowering.inc -gen-pseudo-lowering)
tablegen(LLVM LoongArchGenMCCodeEmitter.inc -gen-emitter)
@@ -42,5 +43,6 @@ add_llvm_target(LoongArchCodeGen
)
add_subdirectory(AsmParser)
+add_subdirectory(Disassembler)
add_subdirectory(MCTargetDesc)
add_subdirectory(TargetInfo)
diff --git a/llvm/lib/Target/LoongArch/Disassembler/CMakeLists.txt b/llvm/lib/Target/LoongArch/Disassembler/CMakeLists.txt
new file mode 100644
index 0000000000000..1cce676cfab8b
--- /dev/null
+++ b/llvm/lib/Target/LoongArch/Disassembler/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_llvm_component_library(LLVMLoongArchDisassembler
+ LoongArchDisassembler.cpp
+
+ LINK_COMPONENTS
+ LoongArchDesc
+ LoongArchInfo
+ MC
+ MCDisassembler
+ Support
+
+ ADD_TO_COMPONENT
+ LoongArch
+ )
diff --git a/llvm/lib/Target/LoongArch/Disassembler/LoongArchDisassembler.cpp b/llvm/lib/Target/LoongArch/Disassembler/LoongArchDisassembler.cpp
new file mode 100644
index 0000000000000..d94007ed4a40d
--- /dev/null
+++ b/llvm/lib/Target/LoongArch/Disassembler/LoongArchDisassembler.cpp
@@ -0,0 +1,107 @@
+//===-- LoongArchDisassembler.cpp - Disassembler for LoongArch ------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the LoongArchDisassembler class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MCTargetDesc/LoongArchBaseInfo.h"
+#include "MCTargetDesc/LoongArchMCTargetDesc.h"
+#include "TargetInfo/LoongArchTargetInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCDisassembler/MCDisassembler.h"
+#include "llvm/MC/MCFixedLenDisassembler.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/MC/TargetRegistry.h"
+#include "llvm/Support/Endian.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "loongarch-disassembler"
+
+typedef MCDisassembler::DecodeStatus DecodeStatus;
+
+namespace {
+class LoongArchDisassembler : public MCDisassembler {
+public:
+ LoongArchDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
+ : MCDisassembler(STI, Ctx) {}
+
+ DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
+ ArrayRef<uint8_t> Bytes, uint64_t Address,
+ raw_ostream &CStream) const override;
+};
+} // end anonymous namespace
+
+static MCDisassembler *createLoongArchDisassembler(const Target &T,
+ const MCSubtargetInfo &STI,
+ MCContext &Ctx) {
+ return new LoongArchDisassembler(STI, Ctx);
+}
+
+extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLoongArchDisassembler() {
+ // Register the disassembler for each target.
+ TargetRegistry::RegisterMCDisassembler(getTheLoongArch32Target(),
+ createLoongArchDisassembler);
+ TargetRegistry::RegisterMCDisassembler(getTheLoongArch64Target(),
+ createLoongArchDisassembler);
+}
+
+static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, uint64_t RegNo,
+ uint64_t Address,
+ const void *Decoder) {
+ if (RegNo >= 32)
+ return MCDisassembler::Fail;
+ Inst.addOperand(MCOperand::createReg(LoongArch::R0 + RegNo));
+ return MCDisassembler::Success;
+}
+
+template <unsigned N, int P = 0>
+static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm,
+ int64_t Address, const void *Decoder) {
+ assert(isUInt<N>(Imm) && "Invalid immediate");
+ Inst.addOperand(MCOperand::createImm(Imm + P));
+ return MCDisassembler::Success;
+}
+
+template <unsigned N, unsigned S = 0>
+static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm,
+ int64_t Address, const void *Decoder) {
+ assert(isUInt<N>(Imm) && "Invalid immediate");
+ // Sign-extend the number in the bottom <N> bits of Imm, then shift left <S>
+ // bits.
+ Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm) << S));
+ return MCDisassembler::Success;
+}
+
+#include "LoongArchGenDisassemblerTables.inc"
+
+DecodeStatus LoongArchDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
+ ArrayRef<uint8_t> Bytes,
+ uint64_t Address,
+ raw_ostream &CS) const {
+ uint32_t Insn;
+ DecodeStatus Result;
+
+ // We want to read exactly 4 bytes of data because all LoongArch instructions
+ // are fixed 32 bits.
+ if (Bytes.size() < 4) {
+ Size = 0;
+ return MCDisassembler::Fail;
+ }
+
+ Insn = support::endian::read32le(Bytes.data());
+ // Calling the auto-generated decoder function.
+ Result = decodeInstruction(DecoderTable32, MI, Insn, Address, this, STI);
+ Size = 4;
+
+ return Result;
+}
diff --git a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
index 48a68b5bd3a70..3699bbcd56edc 100644
--- a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
@@ -40,6 +40,7 @@ def uimm2 : Operand<GRLenVT> {
def uimm2_plus1 : Operand<GRLenVT> {
let ParserMatchClass = UImmAsmOperand<2, "plus1">;
let EncoderMethod = "getImmOpValueSub1";
+ let DecoderMethod = "decodeUImmOperand<2, 1>";
}
def uimm3 : Operand<GRLenVT> {
@@ -64,34 +65,41 @@ def uimm15 : Operand<GRLenVT> {
def simm12 : Operand<GRLenVT>, ImmLeaf<GRLenVT, [{return isInt<12>(Imm);}]> {
let ParserMatchClass = SImmAsmOperand<12>;
+ let DecoderMethod = "decodeSImmOperand<12>";
}
def simm14_lsl2 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<14, "lsl2">;
let EncoderMethod = "getImmOpValueAsr2";
+ let DecoderMethod = "decodeSImmOperand<14, 2>";
}
def simm16 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<16>;
+ let DecoderMethod = "decodeSImmOperand<16>";
}
def simm16_lsl2 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<16, "lsl2">;
let EncoderMethod = "getImmOpValueAsr2";
+ let DecoderMethod = "decodeSImmOperand<16, 2>";
}
def simm20 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<20>;
+ let DecoderMethod = "decodeSImmOperand<20>";
}
def simm21_lsl2 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<21, "lsl2">;
let EncoderMethod = "getImmOpValueAsr2";
+ let DecoderMethod = "decodeSImmOperand<21, 2>";
}
def simm26_lsl2 : Operand<GRLenVT> {
let ParserMatchClass = SImmAsmOperand<26, "lsl2">;
let EncoderMethod = "getImmOpValueAsr2";
+ let DecoderMethod = "decodeSImmOperand<26, 2>";
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/arith.s b/llvm/test/MC/LoongArch/Basic/Integer/arith.s
index 104b01fba19a0..bfb3a4c11eb23 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/arith.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/arith.s
@@ -1,127 +1,131 @@
## Test valid arithmetic operation instructions
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
#############################################################
-# CHECK-ASM: add.w $a5, $ra, $s8
+# CHECK-ASM-AND-OBJ: add.w $a5, $ra, $s8
# CHECK-ASM: encoding: [0x29,0x7c,0x10,0x00]
add.w $a5, $ra, $s8
-# CHECK-ASM: sub.w $r21, $s2, $t7
+# CHECK-ASM-AND-OBJ: sub.w $r21, $s2, $t7
# CHECK-ASM: encoding: [0x35,0x4f,0x11,0x00]
sub.w $r21, $s2, $t7
-# CHECK-ASM: addi.w $a1, $a3, 246
+# CHECK-ASM-AND-OBJ: addi.w $a1, $a3, 246
# CHECK-ASM: encoding: [0xe5,0xd8,0x83,0x02]
addi.w $a1, $a3, 246
-# CHECK-ASM: alsl.w $tp, $t5, $tp, 4
+# CHECK-ASM-AND-OBJ: alsl.w $tp, $t5, $tp, 4
# CHECK-ASM: encoding: [0x22,0x8a,0x05,0x00]
alsl.w $tp, $t5, $tp, 4
-# CHECK-ASM: lu12i.w $t4, 49
+# CHECK-ASM-AND-OBJ: lu12i.w $t4, 49
# CHECK-ASM: encoding: [0x30,0x06,0x00,0x14]
lu12i.w $t4, 49
-# CHECK-ASM: lu12i.w $a0, -1
+# CHECK-ASM-AND-OBJ: lu12i.w $a0, -1
# CHECK-ASM: encoding: [0xe4,0xff,0xff,0x15]
lu12i.w $a0, -1
-# CHECK-ASM: slt $s6, $s3, $tp
+# CHECK-ASM-AND-OBJ: slt $s6, $s3, $tp
# CHECK-ASM: encoding: [0x5d,0x0b,0x12,0x00]
slt $s6, $s3, $tp
-# CHECK-ASM: sltu $a7, $r21, $s6
+# CHECK-ASM-AND-OBJ: sltu $a7, $r21, $s6
# CHECK-ASM: encoding: [0xab,0xf6,0x12,0x00]
sltu $a7, $r21, $s6
-# CHECK-ASM: slti $s4, $ra, 235
+# CHECK-ASM-AND-OBJ: slti $s4, $ra, 235
# CHECK-ASM: encoding: [0x3b,0xac,0x03,0x02]
slti $s4, $ra, 235
-# CHECK-ASM: sltui $zero, $a4, 162
+# CHECK-ASM-AND-OBJ: sltui $zero, $a4, 162
# CHECK-ASM: encoding: [0x00,0x89,0x42,0x02]
sltui $zero, $a4, 162
-# CHECK-ASM: pcaddi $a5, 187
+# CHECK-ASM-AND-OBJ: pcaddi $a5, 187
# CHECK-ASM: encoding: [0x69,0x17,0x00,0x18]
pcaddi $a5, 187
-# CHECK-ASM: pcaddu12i $zero, 37
+# CHECK-ASM-AND-OBJ: pcaddu12i $zero, 37
# CHECK-ASM: encoding: [0xa0,0x04,0x00,0x1c]
pcaddu12i $zero, 37
-# CHECK-ASM: pcalau12i $a6, 89
+# CHECK-ASM-AND-OBJ: pcalau12i $a6, 89
# CHECK-ASM: encoding: [0x2a,0x0b,0x00,0x1a]
pcalau12i $a6, 89
-# CHECK-ASM: and $t7, $s8, $ra
+# CHECK-ASM-AND-OBJ: and $t7, $s8, $ra
# CHECK-ASM: encoding: [0xf3,0x87,0x14,0x00]
and $t7, $s8, $ra
-# CHECK-ASM: or $t5, $t4, $s7
+# CHECK-ASM-AND-OBJ: or $t5, $t4, $s7
# CHECK-ASM: encoding: [0x11,0x7a,0x15,0x00]
or $t5, $t4, $s7
-# CHECK-ASM: nor $a1, $t6, $a1
+# CHECK-ASM-AND-OBJ: nor $a1, $t6, $a1
# CHECK-ASM: encoding: [0x45,0x16,0x14,0x00]
nor $a1, $t6, $a1
-# CHECK-ASM: xor $t3, $t7, $a4
+# CHECK-ASM-AND-OBJ: xor $t3, $t7, $a4
# CHECK-ASM: encoding: [0x6f,0xa2,0x15,0x00]
xor $t3, $t7, $a4
-# CHECK-ASM: andn $s5, $s2, $a1
+# CHECK-ASM-AND-OBJ: andn $s5, $s2, $a1
# CHECK-ASM: encoding: [0x3c,0x97,0x16,0x00]
andn $s5, $s2, $a1
-# CHECK-ASM: orn $tp, $sp, $s2
+# CHECK-ASM-AND-OBJ: orn $tp, $sp, $s2
# CHECK-ASM: encoding: [0x62,0x64,0x16,0x00]
orn $tp, $sp, $s2
-# CHECK-ASM: andi $s2, $zero, 106
+# CHECK-ASM-AND-OBJ: andi $s2, $zero, 106
# CHECK-ASM: encoding: [0x19,0xa8,0x41,0x03]
andi $s2, $zero, 106
-# CHECK-ASM: ori $t5, $a1, 47
+# CHECK-ASM-AND-OBJ: ori $t5, $a1, 47
# CHECK-ASM: encoding: [0xb1,0xbc,0x80,0x03]
ori $t5, $a1, 47
-# CHECK-ASM: xori $t6, $s0, 99
+# CHECK-ASM-AND-OBJ: xori $t6, $s0, 99
# CHECK-ASM: encoding: [0xf2,0x8e,0xc1,0x03]
xori $t6, $s0, 99
-# CHECK-ASM: mul.w $a0, $t6, $sp
+# CHECK-ASM-AND-OBJ: mul.w $a0, $t6, $sp
# CHECK-ASM: encoding: [0x44,0x0e,0x1c,0x00]
mul.w $a0, $t6, $sp
-# CHECK-ASM: mulh.w $s4, $s0, $zero
+# CHECK-ASM-AND-OBJ: mulh.w $s4, $s0, $zero
# CHECK-ASM: encoding: [0xfb,0x82,0x1c,0x00]
mulh.w $s4, $s0, $zero
-# CHECK-ASM: mulh.wu $a6, $t5, $s1
+# CHECK-ASM-AND-OBJ: mulh.wu $a6, $t5, $s1
# CHECK-ASM: encoding: [0x2a,0x62,0x1d,0x00]
mulh.wu $a6, $t5, $s1
-# CHECK-ASM: div.w $s7, $t1, $s2
+# CHECK-ASM-AND-OBJ: div.w $s7, $t1, $s2
# CHECK-ASM: encoding: [0xbe,0x65,0x20,0x00]
div.w $s7, $t1, $s2
-# CHECK-ASM: mod.w $ra, $s3, $a6
+# CHECK-ASM-AND-OBJ: mod.w $ra, $s3, $a6
# CHECK-ASM: encoding: [0x41,0xab,0x20,0x00]
mod.w $ra, $s3, $a6
-# CHECK-ASM: div.wu $t7, $s0, $zero
+# CHECK-ASM-AND-OBJ: div.wu $t7, $s0, $zero
# CHECK-ASM: encoding: [0xf3,0x02,0x21,0x00]
div.wu $t7, $s0, $zero
-# CHECK-ASM: mod.wu $s4, $a5, $t5
+# CHECK-ASM-AND-OBJ: mod.wu $s4, $a5, $t5
# CHECK-ASM: encoding: [0x3b,0xc5,0x21,0x00]
mod.wu $s4, $a5, $t5
@@ -132,75 +136,75 @@ mod.wu $s4, $a5, $t5
.ifdef LA64
-# CHECK64-ASM: add.d $tp, $t6, $s4
+# CHECK64-ASM-AND-OBJ: add.d $tp, $t6, $s4
# CHECK64-ASM: encoding: [0x42,0xee,0x10,0x00]
add.d $tp, $t6, $s4
-# CHECK64-ASM: sub.d $a3, $t0, $a3
+# CHECK64-ASM-AND-OBJ: sub.d $a3, $t0, $a3
# CHECK64-ASM: encoding: [0x87,0x9d,0x11,0x00]
sub.d $a3, $t0, $a3
-# CHECK64-ASM: addi.d $s5, $a2, 75
+# CHECK64-ASM-AND-OBJ: addi.d $s5, $a2, 75
# CHECK64-ASM: encoding: [0xdc,0x2c,0xc1,0x02]
addi.d $s5, $a2, 75
-# CHECK64-ASM: addu16i.d $a5, $s0, 23
+# CHECK64-ASM-AND-OBJ: addu16i.d $a5, $s0, 23
# CHECK64-ASM: encoding: [0xe9,0x5e,0x00,0x10]
addu16i.d $a5, $s0, 23
-# CHECK64-ASM: alsl.wu $t7, $a4, $s2, 1
+# CHECK64-ASM-AND-OBJ: alsl.wu $t7, $a4, $s2, 1
# CHECK64-ASM: encoding: [0x13,0x65,0x06,0x00]
alsl.wu $t7, $a4, $s2, 1
-# CHECK64-ASM: alsl.d $t5, $a7, $a1, 3
+# CHECK64-ASM-AND-OBJ: alsl.d $t5, $a7, $a1, 3
# CHECK64-ASM: encoding: [0x71,0x15,0x2d,0x00]
alsl.d $t5, $a7, $a1, 3
-# CHECK64-ASM: lu32i.d $sp, 196
+# CHECK64-ASM-AND-OBJ: lu32i.d $sp, 196
# CHECK64-ASM: encoding: [0x83,0x18,0x00,0x16]
lu32i.d $sp, 196
-# CHECK64-ASM: lu52i.d $t1, $a0, 195
+# CHECK64-ASM-AND-OBJ: lu52i.d $t1, $a0, 195
# CHECK64-ASM: encoding: [0x8d,0x0c,0x03,0x03]
lu52i.d $t1, $a0, 195
-# CHECK64-ASM: pcaddu18i $t0, 26
+# CHECK64-ASM-AND-OBJ: pcaddu18i $t0, 26
# CHECK64-ASM: encoding: [0x4c,0x03,0x00,0x1e]
pcaddu18i $t0, 26
-# CHECK64-ASM: mul.d $ra, $t2, $s1
+# CHECK64-ASM-AND-OBJ: mul.d $ra, $t2, $s1
# CHECK64-ASM: encoding: [0xc1,0xe1,0x1d,0x00]
mul.d $ra, $t2, $s1
-# CHECK64-ASM: mulh.d $s5, $ra, $s4
+# CHECK64-ASM-AND-OBJ: mulh.d $s5, $ra, $s4
# CHECK64-ASM: encoding: [0x3c,0x6c,0x1e,0x00]
mulh.d $s5, $ra, $s4
-# CHECK64-ASM: mulh.du $t1, $s4, $s6
+# CHECK64-ASM-AND-OBJ: mulh.du $t1, $s4, $s6
# CHECK64-ASM: encoding: [0x6d,0xf7,0x1e,0x00]
mulh.du $t1, $s4, $s6
-# CHECK64-ASM: mulw.d.w $s4, $a2, $t5
+# CHECK64-ASM-AND-OBJ: mulw.d.w $s4, $a2, $t5
# CHECK64-ASM: encoding: [0xdb,0x44,0x1f,0x00]
mulw.d.w $s4, $a2, $t5
-# CHECK64-ASM: mulw.d.wu $t5, $fp, $s7
+# CHECK64-ASM-AND-OBJ: mulw.d.wu $t5, $fp, $s7
# CHECK64-ASM: encoding: [0xd1,0xfa,0x1f,0x00]
mulw.d.wu $t5, $fp, $s7
-# CHECK64-ASM: div.d $s0, $a2, $r21
+# CHECK64-ASM-AND-OBJ: div.d $s0, $a2, $r21
# CHECK64-ASM: encoding: [0xd7,0x54,0x22,0x00]
div.d $s0, $a2, $r21
-# CHECK64-ASM: mod.d $t4, $sp, $t3
+# CHECK64-ASM-AND-OBJ: mod.d $t4, $sp, $t3
# CHECK64-ASM: encoding: [0x70,0xbc,0x22,0x00]
mod.d $t4, $sp, $t3
-# CHECK64-ASM: div.du $s8, $s1, $t2
+# CHECK64-ASM-AND-OBJ: div.du $s8, $s1, $t2
# CHECK64-ASM: encoding: [0x1f,0x3b,0x23,0x00]
div.du $s8, $s1, $t2
-# CHECK64-ASM: mod.du $s2, $s0, $s1
+# CHECK64-ASM-AND-OBJ: mod.du $s2, $s0, $s1
# CHECK64-ASM: encoding: [0xf9,0xe2,0x23,0x00]
mod.du $s2, $s0, $s1
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/atomic.s b/llvm/test/MC/LoongArch/Basic/Integer/atomic.s
index 5a3671ec9cd31..64274018081ca 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/atomic.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/atomic.s
@@ -1,19 +1,23 @@
## Test valid atomic memory access instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
#############################################################
-# CHECK-ASM: ll.w $tp, $s4, 220
+# CHECK-ASM-AND-OBJ: ll.w $tp, $s4, 220
# CHECK-ASM: encoding: [0x62,0xdf,0x00,0x20]
ll.w $tp, $s4, 220
-# CHECK-ASM: sc.w $t7, $t2, 56
+# CHECK-ASM-AND-OBJ: sc.w $t7, $t2, 56
# CHECK-ASM: encoding: [0xd3,0x39,0x00,0x21]
sc.w $t7, $t2, 56
@@ -25,155 +29,155 @@ sc.w $t7, $t2, 56
.ifdef LA64
-# CHECK64-ASM: amswap.w $a2, $t0, $s1
+# CHECK64-ASM-AND-OBJ: amswap.w $a2, $t0, $s1
# CHECK64-ASM: encoding: [0x06,0x33,0x60,0x38]
amswap.w $a2, $t0, $s1
-# CHECK64-ASM: amswap.d $tp, $t2, $fp
+# CHECK64-ASM-AND-OBJ: amswap.d $tp, $t2, $fp
# CHECK64-ASM: encoding: [0xc2,0xba,0x60,0x38]
amswap.d $tp, $t2, $fp
-# CHECK64-ASM: amadd.w $a4, $t0, $r21
+# CHECK64-ASM-AND-OBJ: amadd.w $a4, $t0, $r21
# CHECK64-ASM: encoding: [0xa8,0x32,0x61,0x38]
amadd.w $a4, $t0, $r21
-# CHECK64-ASM: amadd.d $a1, $t5, $s6
+# CHECK64-ASM-AND-OBJ: amadd.d $a1, $t5, $s6
# CHECK64-ASM: encoding: [0xa5,0xc7,0x61,0x38]
amadd.d $a1, $t5, $s6
-# CHECK64-ASM: amand.w $a0, $t7, $fp
+# CHECK64-ASM-AND-OBJ: amand.w $a0, $t7, $fp
# CHECK64-ASM: encoding: [0xc4,0x4e,0x62,0x38]
amand.w $a0, $t7, $fp
-# CHECK64-ASM: amand.d $a6, $t6, $s6
+# CHECK64-ASM-AND-OBJ: amand.d $a6, $t6, $s6
# CHECK64-ASM: encoding: [0xaa,0xcb,0x62,0x38]
amand.d $a6, $t6, $s6
-# CHECK64-ASM: amor.w $a2, $t4, $s0
+# CHECK64-ASM-AND-OBJ: amor.w $a2, $t4, $s0
# CHECK64-ASM: encoding: [0xe6,0x42,0x63,0x38]
amor.w $a2, $t4, $s0
-# CHECK64-ASM: amor.d $sp, $t4, $s1
+# CHECK64-ASM-AND-OBJ: amor.d $sp, $t4, $s1
# CHECK64-ASM: encoding: [0x03,0xc3,0x63,0x38]
amor.d $sp, $t4, $s1
-# CHECK64-ASM: amxor.w $tp, $t3, $s0
+# CHECK64-ASM-AND-OBJ: amxor.w $tp, $t3, $s0
# CHECK64-ASM: encoding: [0xe2,0x3e,0x64,0x38]
amxor.w $tp, $t3, $s0
-# CHECK64-ASM: amxor.d $a4, $t8, $s5
+# CHECK64-ASM-AND-OBJ: amxor.d $a4, $t8, $s5
# CHECK64-ASM: encoding: [0x88,0xd3,0x64,0x38]
amxor.d $a4, $t8, $s5
-# CHECK64-ASM: ammax.w $ra, $a7, $s0
+# CHECK64-ASM-AND-OBJ: ammax.w $ra, $a7, $s0
# CHECK64-ASM: encoding: [0xe1,0x2e,0x65,0x38]
ammax.w $ra, $a7, $s0
-# CHECK64-ASM: ammax.d $a5, $t8, $s4
+# CHECK64-ASM-AND-OBJ: ammax.d $a5, $t8, $s4
# CHECK64-ASM: encoding: [0x69,0xd3,0x65,0x38]
ammax.d $a5, $t8, $s4
-# CHECK64-ASM: ammin.w $a5, $t2, $s0
+# CHECK64-ASM-AND-OBJ: ammin.w $a5, $t2, $s0
# CHECK64-ASM: encoding: [0xe9,0x3a,0x66,0x38]
ammin.w $a5, $t2, $s0
-# CHECK64-ASM: ammin.d $a5, $t1, $fp
+# CHECK64-ASM-AND-OBJ: ammin.d $a5, $t1, $fp
# CHECK64-ASM: encoding: [0xc9,0xb6,0x66,0x38]
ammin.d $a5, $t1, $fp
-# CHECK64-ASM: ammax.wu $a5, $a7, $fp
+# CHECK64-ASM-AND-OBJ: ammax.wu $a5, $a7, $fp
# CHECK64-ASM: encoding: [0xc9,0x2e,0x67,0x38]
ammax.wu $a5, $a7, $fp
-# CHECK64-ASM: ammax.du $a2, $t4, $s2
+# CHECK64-ASM-AND-OBJ: ammax.du $a2, $t4, $s2
# CHECK64-ASM: encoding: [0x26,0xc3,0x67,0x38]
ammax.du $a2, $t4, $s2
-# CHECK64-ASM: ammin.wu $a4, $t6, $s7
+# CHECK64-ASM-AND-OBJ: ammin.wu $a4, $t6, $s7
# CHECK64-ASM: encoding: [0xc8,0x4b,0x68,0x38]
ammin.wu $a4, $t6, $s7
-# CHECK64-ASM: ammin.du $a3, $t4, $s2
+# CHECK64-ASM-AND-OBJ: ammin.du $a3, $t4, $s2
# CHECK64-ASM: encoding: [0x27,0xc3,0x68,0x38]
ammin.du $a3, $t4, $s2
-# CHECK64-ASM: amswap_db.w $a2, $t0, $s1
+# CHECK64-ASM-AND-OBJ: amswap_db.w $a2, $t0, $s1
# CHECK64-ASM: encoding: [0x06,0x33,0x69,0x38]
amswap_db.w $a2, $t0, $s1
-# CHECK64-ASM: amswap_db.d $tp, $t2, $fp
+# CHECK64-ASM-AND-OBJ: amswap_db.d $tp, $t2, $fp
# CHECK64-ASM: encoding: [0xc2,0xba,0x69,0x38]
amswap_db.d $tp, $t2, $fp
-# CHECK64-ASM: amadd_db.w $a4, $t0, $r21
+# CHECK64-ASM-AND-OBJ: amadd_db.w $a4, $t0, $r21
# CHECK64-ASM: encoding: [0xa8,0x32,0x6a,0x38]
amadd_db.w $a4, $t0, $r21
-# CHECK64-ASM: amadd_db.d $a1, $t5, $s6
+# CHECK64-ASM-AND-OBJ: amadd_db.d $a1, $t5, $s6
# CHECK64-ASM: encoding: [0xa5,0xc7,0x6a,0x38]
amadd_db.d $a1, $t5, $s6
-# CHECK64-ASM: amand_db.w $a0, $t7, $fp
+# CHECK64-ASM-AND-OBJ: amand_db.w $a0, $t7, $fp
# CHECK64-ASM: encoding: [0xc4,0x4e,0x6b,0x38]
amand_db.w $a0, $t7, $fp
-# CHECK64-ASM: amand_db.d $a6, $t6, $s6
+# CHECK64-ASM-AND-OBJ: amand_db.d $a6, $t6, $s6
# CHECK64-ASM: encoding: [0xaa,0xcb,0x6b,0x38]
amand_db.d $a6, $t6, $s6
-# CHECK64-ASM: amor_db.w $a2, $t4, $s0
+# CHECK64-ASM-AND-OBJ: amor_db.w $a2, $t4, $s0
# CHECK64-ASM: encoding: [0xe6,0x42,0x6c,0x38]
amor_db.w $a2, $t4, $s0
-# CHECK64-ASM: amor_db.d $sp, $t4, $s1
+# CHECK64-ASM-AND-OBJ: amor_db.d $sp, $t4, $s1
# CHECK64-ASM: encoding: [0x03,0xc3,0x6c,0x38]
amor_db.d $sp, $t4, $s1
-# CHECK64-ASM: amxor_db.w $tp, $t3, $s0
+# CHECK64-ASM-AND-OBJ: amxor_db.w $tp, $t3, $s0
# CHECK64-ASM: encoding: [0xe2,0x3e,0x6d,0x38]
amxor_db.w $tp, $t3, $s0
-# CHECK64-ASM: amxor_db.d $a4, $t8, $s5
+# CHECK64-ASM-AND-OBJ: amxor_db.d $a4, $t8, $s5
# CHECK64-ASM: encoding: [0x88,0xd3,0x6d,0x38]
amxor_db.d $a4, $t8, $s5
-# CHECK64-ASM: ammax_db.w $ra, $a7, $s0
+# CHECK64-ASM-AND-OBJ: ammax_db.w $ra, $a7, $s0
# CHECK64-ASM: encoding: [0xe1,0x2e,0x6e,0x38]
ammax_db.w $ra, $a7, $s0
-# CHECK64-ASM: ammax_db.d $a5, $t8, $s4
+# CHECK64-ASM-AND-OBJ: ammax_db.d $a5, $t8, $s4
# CHECK64-ASM: encoding: [0x69,0xd3,0x6e,0x38]
ammax_db.d $a5, $t8, $s4
-# CHECK64-ASM: ammin_db.w $a5, $t2, $s0
+# CHECK64-ASM-AND-OBJ: ammin_db.w $a5, $t2, $s0
# CHECK64-ASM: encoding: [0xe9,0x3a,0x6f,0x38]
ammin_db.w $a5, $t2, $s0
-# CHECK64-ASM: ammin_db.d $a5, $t1, $fp
+# CHECK64-ASM-AND-OBJ: ammin_db.d $a5, $t1, $fp
# CHECK64-ASM: encoding: [0xc9,0xb6,0x6f,0x38]
ammin_db.d $a5, $t1, $fp
-# CHECK64-ASM: ammax_db.wu $a5, $a7, $fp
+# CHECK64-ASM-AND-OBJ: ammax_db.wu $a5, $a7, $fp
# CHECK64-ASM: encoding: [0xc9,0x2e,0x70,0x38]
ammax_db.wu $a5, $a7, $fp
-# CHECK64-ASM: ammax_db.du $a2, $t4, $s2
+# CHECK64-ASM-AND-OBJ: ammax_db.du $a2, $t4, $s2
# CHECK64-ASM: encoding: [0x26,0xc3,0x70,0x38]
ammax_db.du $a2, $t4, $s2
-# CHECK64-ASM: ammin_db.wu $a4, $t6, $s7
+# CHECK64-ASM-AND-OBJ: ammin_db.wu $a4, $t6, $s7
# CHECK64-ASM: encoding: [0xc8,0x4b,0x71,0x38]
ammin_db.wu $a4, $t6, $s7
-# CHECK64-ASM: ammin_db.du $a3, $t4, $s2
+# CHECK64-ASM-AND-OBJ: ammin_db.du $a3, $t4, $s2
# CHECK64-ASM: encoding: [0x27,0xc3,0x71,0x38]
ammin_db.du $a3, $t4, $s2
-# CHECK64-ASM: ll.d $s2, $s4, 16
+# CHECK64-ASM-AND-OBJ: ll.d $s2, $s4, 16
# CHECK64-ASM: encoding: [0x79,0x13,0x00,0x22]
ll.d $s2, $s4, 16
-# CHECK64-ASM: sc.d $t5, $t5, 244
+# CHECK64-ASM-AND-OBJ: sc.d $t5, $t5, 244
# CHECK64-ASM: encoding: [0x31,0xf6,0x00,0x23]
sc.d $t5, $t5, 244
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/barrier.s b/llvm/test/MC/LoongArch/Basic/Integer/barrier.s
index 077ada583b70f..a9462fc380f63 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/barrier.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/barrier.s
@@ -1,15 +1,19 @@
## Test valid barrier instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
-# CHECK-ASM: dbar 0
+# CHECK-ASM-AND-OBJ: dbar 0
# CHECK-ASM: encoding: [0x00,0x00,0x72,0x38]
dbar 0
-# CHECK-ASM: ibar 0
+# CHECK-ASM-AND-OBJ: ibar 0
# CHECK-ASM: encoding: [0x00,0x80,0x72,0x38]
ibar 0
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/bit-manipu.s b/llvm/test/MC/LoongArch/Basic/Integer/bit-manipu.s
index d3604b4d8676e..3cbe90611f273 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/bit-manipu.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/bit-manipu.s
@@ -1,9 +1,13 @@
## Test valid bit manipulation instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
@@ -17,51 +21,51 @@ ext.w.b $t8, $t6
# CHECK-ASM: encoding: [0xf7,0x5a,0x00,0x00]
ext.w.h $s0, $s0
-# CHECK-ASM: clo.w $ra, $sp
+# CHECK-ASM-AND-OBJ: clo.w $ra, $sp
# CHECK-ASM: encoding: [0x61,0x10,0x00,0x00]
clo.w $ra, $sp
-# CHECK-ASM: clz.w $a3, $a6
+# CHECK-ASM-AND-OBJ: clz.w $a3, $a6
# CHECK-ASM: encoding: [0x47,0x15,0x00,0x00]
clz.w $a3, $a6
-# CHECK-ASM: cto.w $tp, $a2
+# CHECK-ASM-AND-OBJ: cto.w $tp, $a2
# CHECK-ASM: encoding: [0xc2,0x18,0x00,0x00]
cto.w $tp, $a2
-# CHECK-ASM: ctz.w $a1, $fp
+# CHECK-ASM-AND-OBJ: ctz.w $a1, $fp
# CHECK-ASM: encoding: [0xc5,0x1e,0x00,0x00]
ctz.w $a1, $fp
-# CHECK-ASM: bytepick.w $s6, $zero, $t4, 0
+# CHECK-ASM-AND-OBJ: bytepick.w $s6, $zero, $t4, 0
# CHECK-ASM: encoding: [0x1d,0x40,0x08,0x00]
bytepick.w $s6, $zero, $t4, 0
-# CHECK-ASM: revb.2h $t8, $a7
+# CHECK-ASM-AND-OBJ: revb.2h $t8, $a7
# CHECK-ASM: encoding: [0x74,0x31,0x00,0x00]
revb.2h $t8, $a7
-# CHECK-ASM: bitrev.4b $r21, $s4
+# CHECK-ASM-AND-OBJ: bitrev.4b $r21, $s4
# CHECK-ASM: encoding: [0x75,0x4b,0x00,0x00]
bitrev.4b $r21, $s4
-# CHECK-ASM: bitrev.w $s2, $a1
+# CHECK-ASM-AND-OBJ: bitrev.w $s2, $a1
# CHECK-ASM: encoding: [0xb9,0x50,0x00,0x00]
bitrev.w $s2, $a1
-# CHECK-ASM: bstrins.w $a4, $a7, 7, 2
+# CHECK-ASM-AND-OBJ: bstrins.w $a4, $a7, 7, 2
# CHECK-ASM: encoding: [0x68,0x09,0x67,0x00]
bstrins.w $a4, $a7, 7, 2
-# CHECK-ASM: bstrpick.w $ra, $a5, 10, 4
+# CHECK-ASM-AND-OBJ: bstrpick.w $ra, $a5, 10, 4
# CHECK-ASM: encoding: [0x21,0x91,0x6a,0x00]
bstrpick.w $ra, $a5, 10, 4
-# CHECK-ASM: maskeqz $t8, $a7, $t6
+# CHECK-ASM-AND-OBJ: maskeqz $t8, $a7, $t6
# CHECK-ASM: encoding: [0x74,0x49,0x13,0x00]
maskeqz $t8, $a7, $t6
-# CHECK-ASM: masknez $t8, $t1, $s3
+# CHECK-ASM-AND-OBJ: masknez $t8, $t1, $s3
# CHECK-ASM: encoding: [0xb4,0xe9,0x13,0x00]
masknez $t8, $t1, $s3
@@ -72,59 +76,59 @@ masknez $t8, $t1, $s3
.ifdef LA64
-# CHECK64-ASM: clo.d $s6, $ra
+# CHECK64-ASM-AND-OBJ: clo.d $s6, $ra
# CHECK64-ASM: encoding: [0x3d,0x20,0x00,0x00]
clo.d $s6, $ra
-# CHECK64-ASM: clz.d $s3, $s3
+# CHECK64-ASM-AND-OBJ: clz.d $s3, $s3
# CHECK64-ASM: encoding: [0x5a,0x27,0x00,0x00]
clz.d $s3, $s3
-# CHECK64-ASM: cto.d $t6, $t8
+# CHECK64-ASM-AND-OBJ: cto.d $t6, $t8
# CHECK64-ASM: encoding: [0x92,0x2a,0x00,0x00]
cto.d $t6, $t8
-# CHECK64-ASM: ctz.d $t5, $a6
+# CHECK64-ASM-AND-OBJ: ctz.d $t5, $a6
# CHECK64-ASM: encoding: [0x51,0x2d,0x00,0x00]
ctz.d $t5, $a6
-# CHECK64-ASM: bytepick.d $t3, $t5, $t8, 4
+# CHECK64-ASM-AND-OBJ: bytepick.d $t3, $t5, $t8, 4
# CHECK64-ASM: encoding: [0x2f,0x52,0x0e,0x00]
bytepick.d $t3, $t5, $t8, 4
-# CHECK64-ASM: revb.4h $t1, $t7
+# CHECK64-ASM-AND-OBJ: revb.4h $t1, $t7
# CHECK64-ASM: encoding: [0x6d,0x36,0x00,0x00]
revb.4h $t1, $t7
-# CHECK64-ASM: revb.2w $s5, $s4
+# CHECK64-ASM-AND-OBJ: revb.2w $s5, $s4
# CHECK64-ASM: encoding: [0x7c,0x3b,0x00,0x00]
revb.2w $s5, $s4
-# CHECK64-ASM: revb.d $zero, $s0
+# CHECK64-ASM-AND-OBJ: revb.d $zero, $s0
# CHECK64-ASM: encoding: [0xe0,0x3e,0x00,0x00]
revb.d $zero, $s0
-# CHECK64-ASM: revh.2w $s5, $a6
+# CHECK64-ASM-AND-OBJ: revh.2w $s5, $a6
# CHECK64-ASM: encoding: [0x5c,0x41,0x00,0x00]
revh.2w $s5, $a6
-# CHECK64-ASM: revh.d $a5, $a3
+# CHECK64-ASM-AND-OBJ: revh.d $a5, $a3
# CHECK64-ASM: encoding: [0xe9,0x44,0x00,0x00]
revh.d $a5, $a3
-# CHECK64-ASM: bitrev.8b $t1, $s2
+# CHECK64-ASM-AND-OBJ: bitrev.8b $t1, $s2
# CHECK64-ASM: encoding: [0x2d,0x4f,0x00,0x00]
bitrev.8b $t1, $s2
-# CHECK64-ASM: bitrev.d $t7, $s0
+# CHECK64-ASM-AND-OBJ: bitrev.d $t7, $s0
# CHECK64-ASM: encoding: [0xf3,0x56,0x00,0x00]
bitrev.d $t7, $s0
-# CHECK64-ASM: bstrins.d $a4, $a7, 7, 2
+# CHECK64-ASM-AND-OBJ: bstrins.d $a4, $a7, 7, 2
# CHECK64-ASM: encoding: [0x68,0x09,0x87,0x00]
bstrins.d $a4, $a7, 7, 2
-# CHECK64-ASM: bstrpick.d $s8, $s4, 39, 22
+# CHECK64-ASM-AND-OBJ: bstrpick.d $s8, $s4, 39, 22
# CHECK64-ASM: encoding: [0x7f,0x5b,0xe7,0x00]
bstrpick.d $s8, $s4, 39, 22
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/bit-shift.s b/llvm/test/MC/LoongArch/Basic/Integer/bit-shift.s
index 2646245bcd740..4b8f00a709fb6 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/bit-shift.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/bit-shift.s
@@ -1,43 +1,47 @@
## Test valid bit shift instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
#############################################################
-# CHECK-ASM: sll.w $s1, $s4, $s0
+# CHECK-ASM-AND-OBJ: sll.w $s1, $s4, $s0
# CHECK-ASM: encoding: [0x78,0x5f,0x17,0x00]
sll.w $s1, $s4, $s0
-# CHECK-ASM: srl.w $s8, $t5, $a3
+# CHECK-ASM-AND-OBJ: srl.w $s8, $t5, $a3
# CHECK-ASM: encoding: [0x3f,0x9e,0x17,0x00]
srl.w $s8, $t5, $a3
-# CHECK-ASM: sra.w $t0, $s5, $a6
+# CHECK-ASM-AND-OBJ: sra.w $t0, $s5, $a6
# CHECK-ASM: encoding: [0x8c,0x2b,0x18,0x00]
sra.w $t0, $s5, $a6
-# CHECK-ASM: rotr.w $ra, $s3, $t6
+# CHECK-ASM-AND-OBJ: rotr.w $ra, $s3, $t6
# CHECK-ASM: encoding: [0x41,0x4b,0x1b,0x00]
rotr.w $ra, $s3, $t6
-# CHECK-ASM: slli.w $s3, $t6, 0
+# CHECK-ASM-AND-OBJ: slli.w $s3, $t6, 0
# CHECK-ASM: encoding: [0x5a,0x82,0x40,0x00]
slli.w $s3, $t6, 0
-# CHECK-ASM: srli.w $a6, $t2, 30
+# CHECK-ASM-AND-OBJ: srli.w $a6, $t2, 30
# CHECK-ASM: encoding: [0xca,0xf9,0x44,0x00]
srli.w $a6, $t2, 30
-# CHECK-ASM: srai.w $a4, $t5, 24
+# CHECK-ASM-AND-OBJ: srai.w $a4, $t5, 24
# CHECK-ASM: encoding: [0x28,0xe2,0x48,0x00]
srai.w $a4, $t5, 24
-# CHECK-ASM: rotri.w $s0, $t8, 23
+# CHECK-ASM-AND-OBJ: rotri.w $s0, $t8, 23
# CHECK-ASM: encoding: [0x97,0xde,0x4c,0x00]
rotri.w $s0, $t8, 23
@@ -48,35 +52,35 @@ rotri.w $s0, $t8, 23
.ifdef LA64
-# CHECK64-ASM: sll.d $t8, $t3, $sp
+# CHECK64-ASM-AND-OBJ: sll.d $t8, $t3, $sp
# CHECK64-ASM: encoding: [0xf4,0x8d,0x18,0x00]
sll.d $t8, $t3, $sp
-# CHECK64-ASM: srl.d $t2, $s2, $zero
+# CHECK64-ASM-AND-OBJ: srl.d $t2, $s2, $zero
# CHECK64-ASM: encoding: [0x2e,0x03,0x19,0x00]
srl.d $t2, $s2, $zero
-# CHECK64-ASM: sra.d $a3, $fp, $s8
+# CHECK64-ASM-AND-OBJ: sra.d $a3, $fp, $s8
# CHECK64-ASM: encoding: [0xc7,0xfe,0x19,0x00]
sra.d $a3, $fp, $s8
-# CHECK64-ASM: rotr.d $s8, $sp, $ra
+# CHECK64-ASM-AND-OBJ: rotr.d $s8, $sp, $ra
# CHECK64-ASM: encoding: [0x7f,0x84,0x1b,0x00]
rotr.d $s8, $sp, $ra
-# CHECK64-ASM: slli.d $a6, $s8, 39
+# CHECK64-ASM-AND-OBJ: slli.d $a6, $s8, 39
# CHECK64-ASM: encoding: [0xea,0x9f,0x41,0x00]
slli.d $a6, $s8, 39
-# CHECK64-ASM: srli.d $s8, $fp, 38
+# CHECK64-ASM-AND-OBJ: srli.d $s8, $fp, 38
# CHECK64-ASM: encoding: [0xdf,0x9a,0x45,0x00]
srli.d $s8, $fp, 38
-# CHECK64-ASM: srai.d $a5, $r21, 27
+# CHECK64-ASM-AND-OBJ: srai.d $a5, $r21, 27
# CHECK64-ASM: encoding: [0xa9,0x6e,0x49,0x00]
srai.d $a5, $r21, 27
-# CHECK64-ASM: rotri.d $s6, $zero, 7
+# CHECK64-ASM-AND-OBJ: rotri.d $s6, $zero, 7
# CHECK64-ASM: encoding: [0x1d,0x1c,0x4d,0x00]
rotri.d $s6, $zero, 7
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/bound-check.s b/llvm/test/MC/LoongArch/Basic/Integer/bound-check.s
index 0d914dd737e7e..cfb7e4ba88de8 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/bound-check.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/bound-check.s
@@ -1,69 +1,71 @@
## Test valid boundary check memory access instructions.
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
-# CHECK-ASM: ldgt.b $a2, $a2, $s6
+# CHECK-ASM-AND-OBJ: ldgt.b $a2, $a2, $s6
# CHECK-ASM: encoding: [0xc6,0x74,0x78,0x38]
ldgt.b $a2, $a2, $s6
-# CHECK-ASM: ldgt.h $a1, $s8, $ra
+# CHECK-ASM-AND-OBJ: ldgt.h $a1, $s8, $ra
# CHECK-ASM: encoding: [0xe5,0x87,0x78,0x38]
ldgt.h $a1, $s8, $ra
-# CHECK-ASM: ldgt.w $t3, $s3, $a4
+# CHECK-ASM-AND-OBJ: ldgt.w $t3, $s3, $a4
# CHECK-ASM: encoding: [0x4f,0x23,0x79,0x38]
ldgt.w $t3, $s3, $a4
-# CHECK-ASM: ldgt.d $s0, $s2, $s8
+# CHECK-ASM-AND-OBJ: ldgt.d $s0, $s2, $s8
# CHECK-ASM: encoding: [0x37,0xff,0x79,0x38]
ldgt.d $s0, $s2, $s8
-# CHECK-ASM: ldle.b $a5, $t0, $t3
+# CHECK-ASM-AND-OBJ: ldle.b $a5, $t0, $t3
# CHECK-ASM: encoding: [0x89,0x3d,0x7a,0x38]
ldle.b $a5, $t0, $t3
-# CHECK-ASM: ldle.h $a7, $a7, $s0
+# CHECK-ASM-AND-OBJ: ldle.h $a7, $a7, $s0
# CHECK-ASM: encoding: [0x6b,0xdd,0x7a,0x38]
ldle.h $a7, $a7, $s0
-# CHECK-ASM: ldle.w $s1, $tp, $tp
+# CHECK-ASM-AND-OBJ: ldle.w $s1, $tp, $tp
# CHECK-ASM: encoding: [0x58,0x08,0x7b,0x38]
ldle.w $s1, $tp, $tp
-# CHECK-ASM: ldle.d $t8, $t3, $t4
+# CHECK-ASM-AND-OBJ: ldle.d $t8, $t3, $t4
# CHECK-ASM: encoding: [0xf4,0xc1,0x7b,0x38]
ldle.d $t8, $t3, $t4
-# CHECK-ASM: stgt.b $s4, $t7, $t8
+# CHECK-ASM-AND-OBJ: stgt.b $s4, $t7, $t8
# CHECK-ASM: encoding: [0x7b,0x52,0x7c,0x38]
stgt.b $s4, $t7, $t8
-# CHECK-ASM: stgt.h $t4, $a0, $a2
+# CHECK-ASM-AND-OBJ: stgt.h $t4, $a0, $a2
# CHECK-ASM: encoding: [0x90,0x98,0x7c,0x38]
stgt.h $t4, $a0, $a2
-# CHECK-ASM: stgt.w $s8, $s5, $t2
+# CHECK-ASM-AND-OBJ: stgt.w $s8, $s5, $t2
# CHECK-ASM: encoding: [0x9f,0x3b,0x7d,0x38]
stgt.w $s8, $s5, $t2
-# CHECK-ASM: stgt.d $s7, $r21, $s1
+# CHECK-ASM-AND-OBJ: stgt.d $s7, $r21, $s1
# CHECK-ASM: encoding: [0xbe,0xe2,0x7d,0x38]
stgt.d $s7, $r21, $s1
-# CHECK-ASM: stle.b $a6, $a0, $t4
+# CHECK-ASM-AND-OBJ: stle.b $a6, $a0, $t4
# CHECK-ASM: encoding: [0x8a,0x40,0x7e,0x38]
stle.b $a6, $a0, $t4
-# CHECK-ASM: stle.h $t5, $t5, $r21
+# CHECK-ASM-AND-OBJ: stle.h $t5, $t5, $r21
# CHECK-ASM: encoding: [0x31,0xd6,0x7e,0x38]
stle.h $t5, $t5, $r21
-# CHECK-ASM: stle.w $s0, $s5, $s6
+# CHECK-ASM-AND-OBJ: stle.w $s0, $s5, $s6
# CHECK-ASM: encoding: [0x97,0x77,0x7f,0x38]
stle.w $s0, $s5, $s6
-# CHECK-ASM: stle.d $s2, $s1, $s6
+# CHECK-ASM-AND-OBJ: stle.d $s2, $s1, $s6
# CHECK-ASM: encoding: [0x19,0xf7,0x7f,0x38]
stle.d $s2, $s1, $s6
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/branch.s b/llvm/test/MC/LoongArch/Basic/Integer/branch.s
index 8e4fb3d11fe79..c4e8edf815cf8 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/branch.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/branch.s
@@ -1,51 +1,55 @@
## Test valid branch instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-
-# CHECK-ASM: beq $a6, $a3, 176
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+
+# CHECK-ASM-AND-OBJ: beq $a6, $a3, 176
# CHECK-ASM: encoding: [0x47,0xb1,0x00,0x58]
beq $a6, $a3, 176
-# CHECK-ASM: bne $s2, $ra, 136
+# CHECK-ASM-AND-OBJ: bne $s2, $ra, 136
# CHECK-ASM: encoding: [0x21,0x8b,0x00,0x5c]
bne $s2, $ra, 136
-# CHECK-ASM: blt $t3, $s7, 168
+# CHECK-ASM-AND-OBJ: blt $t3, $s7, 168
# CHECK-ASM: encoding: [0xfe,0xa9,0x00,0x60]
blt $t3, $s7, 168
-# CHECK-ASM: bge $t0, $t3, 148
+# CHECK-ASM-AND-OBJ: bge $t0, $t3, 148
# CHECK-ASM: encoding: [0x8f,0x95,0x00,0x64]
bge $t0, $t3, 148
-# CHECK-ASM: bltu $t5, $a1, 4
+# CHECK-ASM-AND-OBJ: bltu $t5, $a1, 4
# CHECK-ASM: encoding: [0x25,0x06,0x00,0x68]
bltu $t5, $a1, 4
-# CHECK-ASM: bgeu $a2, $s0, 140
+# CHECK-ASM-AND-OBJ: bgeu $a2, $s0, 140
# CHECK-ASM: encoding: [0xd7,0x8c,0x00,0x6c]
bgeu $a2, $s0, 140
-# CHECK-ASM: beqz $a5, 96
+# CHECK-ASM-AND-OBJ: beqz $a5, 96
# CHECK-ASM: encoding: [0x20,0x61,0x00,0x40]
beqz $a5, 96
-# CHECK-ASM: bnez $sp, 212
+# CHECK-ASM-AND-OBJ: bnez $sp, 212
# CHECK-ASM: encoding: [0x60,0xd4,0x00,0x44]
bnez $sp, 212
-# CHECK-ASM: b 248
+# CHECK-ASM-AND-OBJ: b 248
# CHECK-ASM: encoding: [0x00,0xf8,0x00,0x50]
b 248
-# CHECK-ASM: bl 236
+# CHECK-ASM-AND-OBJ: bl 236
# CHECK-ASM: encoding: [0x00,0xec,0x00,0x54]
bl 236
-# CHECK-ASM: jirl $ra, $a0, 4
+# CHECK-ASM-AND-OBJ: jirl $ra, $a0, 4
# CHECK-ASM: encoding: [0x81,0x04,0x00,0x4c]
jirl $ra, $a0, 4
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/crc.s b/llvm/test/MC/LoongArch/Basic/Integer/crc.s
index 06ccdd93ee31c..e57134d60247d 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/crc.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/crc.s
@@ -1,37 +1,39 @@
## Test valid CRC check instructions.
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
-# CHECK-ASM: crc.w.b.w $s1, $a3, $tp
+# CHECK-ASM-AND-OBJ: crc.w.b.w $s1, $a3, $tp
# CHECK-ASM: encoding: [0xf8,0x08,0x24,0x00]
crc.w.b.w $s1, $a3, $tp
-# CHECK-ASM: crc.w.h.w $s8, $a6, $t6
+# CHECK-ASM-AND-OBJ: crc.w.h.w $s8, $a6, $t6
# CHECK-ASM: encoding: [0x5f,0xc9,0x24,0x00]
crc.w.h.w $s8, $a6, $t6
-# CHECK-ASM: crc.w.w.w $s5, $a2, $a6
+# CHECK-ASM-AND-OBJ: crc.w.w.w $s5, $a2, $a6
# CHECK-ASM: encoding: [0xdc,0x28,0x25,0x00]
crc.w.w.w $s5, $a2, $a6
-# CHECK-ASM: crc.w.d.w $s5, $a7, $s8
+# CHECK-ASM-AND-OBJ: crc.w.d.w $s5, $a7, $s8
# CHECK-ASM: encoding: [0x7c,0xfd,0x25,0x00]
crc.w.d.w $s5, $a7, $s8
-# CHECK-ASM: crcc.w.b.w $t3, $t6, $sp
+# CHECK-ASM-AND-OBJ: crcc.w.b.w $t3, $t6, $sp
# CHECK-ASM: encoding: [0x4f,0x0e,0x26,0x00]
crcc.w.b.w $t3, $t6, $sp
-# CHECK-ASM: crcc.w.h.w $r21, $s6, $t6
+# CHECK-ASM-AND-OBJ: crcc.w.h.w $r21, $s6, $t6
# CHECK-ASM: encoding: [0xb5,0xcb,0x26,0x00]
crcc.w.h.w $r21, $s6, $t6
-# CHECK-ASM: crcc.w.w.w $t5, $t2, $t1
+# CHECK-ASM-AND-OBJ: crcc.w.w.w $t5, $t2, $t1
# CHECK-ASM: encoding: [0xd1,0x35,0x27,0x00]
crcc.w.w.w $t5, $t2, $t1
-# CHECK-ASM: crcc.w.d.w $s7, $r21, $s4
+# CHECK-ASM-AND-OBJ: crcc.w.d.w $s7, $r21, $s4
# CHECK-ASM: encoding: [0xbe,0xee,0x27,0x00]
crcc.w.d.w $s7, $r21, $s4
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/invalid-dis.s b/llvm/test/MC/LoongArch/Basic/Integer/invalid-dis.s
new file mode 100644
index 0000000000000..5aa79ca80ce91
--- /dev/null
+++ b/llvm/test/MC/LoongArch/Basic/Integer/invalid-dis.s
@@ -0,0 +1,10 @@
+# Test that disassembler rejects data smaller than 4 bytes.
+
+# RUN: llvm-mc --filetype=obj --triple=loongarch32 < %s \
+# RUN: | llvm-objdump -d - | FileCheck %s
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 < %s \
+# RUN: | llvm-objdump -d - | FileCheck %s
+
+# CHECK: 11 <unknown>
+# CHECK: 22 <unknown>
+.2byte 0x2211
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/memory.s b/llvm/test/MC/LoongArch/Basic/Integer/memory.s
index 75225f7ac9a2d..729e3496c3b0b 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/memory.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/memory.s
@@ -1,47 +1,51 @@
## Test valid memory access instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
#############################################################
-# CHECK-ASM: ld.b $s1, $a4, 21
+# CHECK-ASM-AND-OBJ: ld.b $s1, $a4, 21
# CHECK-ASM: encoding: [0x18,0x55,0x00,0x28]
ld.b $s1, $a4, 21
-# CHECK-ASM: ld.h $a3, $t6, 80
+# CHECK-ASM-AND-OBJ: ld.h $a3, $t6, 80
# CHECK-ASM: encoding: [0x47,0x42,0x41,0x28]
ld.h $a3, $t6, 80
-# CHECK-ASM: ld.w $t6, $s3, 92
+# CHECK-ASM-AND-OBJ: ld.w $t6, $s3, 92
# CHECK-ASM: encoding: [0x52,0x73,0x81,0x28]
ld.w $t6, $s3, 92
-# CHECK-ASM: ld.bu $t1, $t1, 150
+# CHECK-ASM-AND-OBJ: ld.bu $t1, $t1, 150
# CHECK-ASM: encoding: [0xad,0x59,0x02,0x2a]
ld.bu $t1, $t1, 150
-# CHECK-ASM: ld.hu $t6, $s6, 198
+# CHECK-ASM-AND-OBJ: ld.hu $t6, $s6, 198
# CHECK-ASM: encoding: [0xb2,0x1b,0x43,0x2a]
ld.hu $t6, $s6, 198
-# CHECK-ASM: st.b $sp, $a3, 95
+# CHECK-ASM-AND-OBJ: st.b $sp, $a3, 95
# CHECK-ASM: encoding: [0xe3,0x7c,0x01,0x29]
st.b $sp, $a3, 95
-# CHECK-ASM: st.h $s2, $t4, 122
+# CHECK-ASM-AND-OBJ: st.h $s2, $t4, 122
# CHECK-ASM: encoding: [0x19,0xea,0x41,0x29]
st.h $s2, $t4, 122
-# CHECK-ASM: st.w $t1, $t1, 175
+# CHECK-ASM-AND-OBJ: st.w $t1, $t1, 175
# CHECK-ASM: encoding: [0xad,0xbd,0x82,0x29]
st.w $t1, $t1, 175
-# CHECK-ASM: preld 10, $zero, 23
+# CHECK-ASM-AND-OBJ: preld 10, $zero, 23
# CHECK-ASM: encoding: [0x0a,0x5c,0xc0,0x2a]
preld 10, $zero, 23
@@ -52,71 +56,71 @@ preld 10, $zero, 23
.ifdef LA64
-# CHECK64-ASM: ld.wu $t2, $t7, 31
+# CHECK64-ASM-AND-OBJ: ld.wu $t2, $t7, 31
# CHECK64-ASM: encoding: [0x6e,0x7e,0x80,0x2a]
ld.wu $t2, $t7, 31
-# CHECK64-ASM: st.d $s7, $s7, 60
+# CHECK64-ASM-AND-OBJ: st.d $s7, $s7, 60
# CHECK64-ASM: encoding: [0xde,0xf3,0xc0,0x29]
st.d $s7, $s7, 60
-# CHECK64-ASM: ldx.b $s1, $ra, $tp
+# CHECK64-ASM-AND-OBJ: ldx.b $s1, $ra, $tp
# CHECK64-ASM: encoding: [0x38,0x08,0x00,0x38]
ldx.b $s1, $ra, $tp
-# CHECK64-ASM: ldx.h $fp, $fp, $t5
+# CHECK64-ASM-AND-OBJ: ldx.h $fp, $fp, $t5
# CHECK64-ASM: encoding: [0xd6,0x46,0x04,0x38]
ldx.h $fp, $fp, $t5
-# CHECK64-ASM: ldx.w $s2, $a7, $s0
+# CHECK64-ASM-AND-OBJ: ldx.w $s2, $a7, $s0
# CHECK64-ASM: encoding: [0x79,0x5d,0x08,0x38]
ldx.w $s2, $a7, $s0
-# CHECK64-ASM: ldx.d $t6, $s0, $t8
+# CHECK64-ASM-AND-OBJ: ldx.d $t6, $s0, $t8
# CHECK64-ASM: encoding: [0xf2,0x52,0x0c,0x38]
ldx.d $t6, $s0, $t8
-# CHECK64-ASM: ldx.bu $a7, $a5, $a5
+# CHECK64-ASM-AND-OBJ: ldx.bu $a7, $a5, $a5
# CHECK64-ASM: encoding: [0x2b,0x25,0x20,0x38]
ldx.bu $a7, $a5, $a5
-# CHECK64-ASM: ldx.hu $fp, $s0, $s4
+# CHECK64-ASM-AND-OBJ: ldx.hu $fp, $s0, $s4
# CHECK64-ASM: encoding: [0xf6,0x6e,0x24,0x38]
ldx.hu $fp, $s0, $s4
-# CHECK64-ASM: ldx.wu $a4, $s1, $s5
+# CHECK64-ASM-AND-OBJ: ldx.wu $a4, $s1, $s5
# CHECK64-ASM: encoding: [0x08,0x73,0x28,0x38]
ldx.wu $a4, $s1, $s5
-# CHECK64-ASM: stx.b $t7, $ra, $sp
+# CHECK64-ASM-AND-OBJ: stx.b $t7, $ra, $sp
# CHECK64-ASM: encoding: [0x33,0x0c,0x10,0x38]
stx.b $t7, $ra, $sp
-# CHECK64-ASM: stx.h $zero, $s5, $s3
+# CHECK64-ASM-AND-OBJ: stx.h $zero, $s5, $s3
# CHECK64-ASM: encoding: [0x80,0x6b,0x14,0x38]
stx.h $zero, $s5, $s3
-# CHECK64-ASM: stx.w $a3, $a0, $s8
+# CHECK64-ASM-AND-OBJ: stx.w $a3, $a0, $s8
# CHECK64-ASM: encoding: [0x87,0x7c,0x18,0x38]
stx.w $a3, $a0, $s8
-# CHECK64-ASM: stx.d $a3, $s8, $a6
+# CHECK64-ASM-AND-OBJ: stx.d $a3, $s8, $a6
# CHECK64-ASM: encoding: [0xe7,0x2b,0x1c,0x38]
stx.d $a3, $s8, $a6
-# CHECK64-ASM: ldptr.w $s3, $a2, 60
+# CHECK64-ASM-AND-OBJ: ldptr.w $s3, $a2, 60
# CHECK64-ASM: encoding: [0xda,0x3c,0x00,0x24]
ldptr.w $s3, $a2, 60
-# CHECK64-ASM: ldptr.d $a1, $s6, 244
+# CHECK64-ASM-AND-OBJ: ldptr.d $a1, $s6, 244
# CHECK64-ASM: encoding: [0xa5,0xf7,0x00,0x26]
ldptr.d $a1, $s6, 244
-# CHECK64-ASM: stptr.w $s5, $a1, 216
+# CHECK64-ASM-AND-OBJ: stptr.w $s5, $a1, 216
# CHECK64-ASM: encoding: [0xbc,0xd8,0x00,0x25]
stptr.w $s5, $a1, 216
-# CHECK64-ASM: stptr.d $t2, $s1, 196
+# CHECK64-ASM-AND-OBJ: stptr.d $t2, $s1, 196
# CHECK64-ASM: encoding: [0x0e,0xc7,0x00,0x27]
stptr.d $t2, $s1, 196
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/misc.s b/llvm/test/MC/LoongArch/Basic/Integer/misc.s
index 7ed934bd04d66..182d1da9b237e 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/misc.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/misc.s
@@ -1,31 +1,35 @@
## Test valid misc instructions.
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding --defsym=LA64=1 \
-# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK64-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding --defsym=LA64=1 \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ,CHECK64-ASM,CHECK64-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj --defsym=LA64=1 | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ,CHECK64-ASM-AND-OBJ %s
#############################################################
## Instructions for both loongarch32 and loongarch64
#############################################################
-# CHECK-ASM: syscall 100
+# CHECK-ASM-AND-OBJ: syscall 100
# CHECK-ASM: encoding: [0x64,0x00,0x2b,0x00]
syscall 100
-# CHECK-ASM: break 199
+# CHECK-ASM-AND-OBJ: break 199
# CHECK-ASM: encoding: [0xc7,0x00,0x2a,0x00]
break 199
-# CHECK-ASM: rdtimel.w $s1, $a0
+# CHECK-ASM-AND-OBJ: rdtimel.w $s1, $a0
# CHECK-ASM: encoding: [0x98,0x60,0x00,0x00]
rdtimel.w $s1, $a0
-# CHECK-ASM: rdtimeh.w $a7, $a1
+# CHECK-ASM-AND-OBJ: rdtimeh.w $a7, $a1
# CHECK-ASM: encoding: [0xab,0x64,0x00,0x00]
rdtimeh.w $a7, $a1
-# CHECK-ASM: cpucfg $sp, $a4
+# CHECK-ASM-AND-OBJ: cpucfg $sp, $a4
# CHECK-ASM: encoding: [0x03,0x6d,0x00,0x00]
cpucfg $sp, $a4
@@ -36,15 +40,15 @@ cpucfg $sp, $a4
.ifdef LA64
-# CHECK64-ASM: asrtle.d $t0, $t5
+# CHECK64-ASM-AND-OBJ: asrtle.d $t0, $t5
# CHECK64-ASM: encoding: [0x80,0x45,0x01,0x00]
asrtle.d $t0, $t5
-# CHECK64-ASM: asrtgt.d $t8, $t8
+# CHECK64-ASM-AND-OBJ: asrtgt.d $t8, $t8
# CHECK64-ASM: encoding: [0x80,0xd2,0x01,0x00]
asrtgt.d $t8, $t8
-# CHECK64-ASM: rdtime.d $tp, $t3
+# CHECK64-ASM-AND-OBJ: rdtime.d $tp, $t3
# CHECK64-ASM: encoding: [0xe2,0x69,0x00,0x00]
rdtime.d $tp, $t3
diff --git a/llvm/test/MC/LoongArch/Basic/Integer/pseudos.s b/llvm/test/MC/LoongArch/Basic/Integer/pseudos.s
index 1ace33f7131ae..e718982f3e2cf 100644
--- a/llvm/test/MC/LoongArch/Basic/Integer/pseudos.s
+++ b/llvm/test/MC/LoongArch/Basic/Integer/pseudos.s
@@ -1,14 +1,18 @@
## Test valid pseudo instructions
-# RUN: llvm-mc %s --triple=loongarch32 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
-# RUN: llvm-mc %s --triple=loongarch64 -show-encoding \
-# RUN: | FileCheck --check-prefix=CHECK-ASM %s
+# RUN: llvm-mc %s --triple=loongarch32 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --show-encoding \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch32 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
+# RUN: llvm-mc %s --triple=loongarch64 --filetype=obj | llvm-objdump -d - \
+# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
-# CHECK-ASM: nop
+# CHECK-ASM-AND-OBJ: nop
# CHECK-ASM: encoding: [0x00,0x00,0x40,0x03]
nop
-# CHECK-ASM: move $a4, $a5
+# CHECK-ASM-AND-OBJ: move $a4, $a5
# CHECK-ASM: encoding: [0x28,0x01,0x15,0x00]
move $a4, $a5
diff --git a/llvm/test/MC/LoongArch/Misc/aligned-nops.s b/llvm/test/MC/LoongArch/Misc/aligned-nops.s
new file mode 100644
index 0000000000000..8554b4998223a
--- /dev/null
+++ b/llvm/test/MC/LoongArch/Misc/aligned-nops.s
@@ -0,0 +1,15 @@
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 < %s \
+# RUN: | llvm-objdump -d - | FileCheck %s
+
+# func1 and func2 are 8 byte alignment but the func1's size is 4.
+# So assembler will insert a nop to make sure 8 byte alignment.
+
+.text
+
+.p2align 3
+func1:
+ addi.d $sp, $sp, -16
+# CHECK: addi.d $sp, $sp, -16
+# CHECK-NEXT: nop
+.p2align 3
+func2:
diff --git a/llvm/test/MC/LoongArch/Misc/unaligned-nops.s b/llvm/test/MC/LoongArch/Misc/unaligned-nops.s
new file mode 100644
index 0000000000000..5952540b46d09
--- /dev/null
+++ b/llvm/test/MC/LoongArch/Misc/unaligned-nops.s
@@ -0,0 +1,5 @@
+# RUN: not --crash llvm-mc --filetype=obj --triple=loongarch64 %s -o %t
+.byte 1
+# CHECK: LLVM ERROR: unable to write nop sequence of 3 bytes
+.p2align 2
+foo:
More information about the llvm-commits
mailing list