[llvm-branch-commits] [llvm] release/19.x: [AVR] Fix parsing & emitting relative jumps (#106722) (PR #107082)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 3 03:53:20 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mc
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport 86a60e7f1e8f361f84ccb6e656e848dd4fbaa713
Requested by: @<!-- -->aykevl
---
Patch is 46.04 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/107082.diff
26 Files Affected:
- (modified) llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp (+11-4)
- (modified) llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp (+5-7)
- (added) llvm/test/CodeGen/AVR/jmp.ll (+25)
- (modified) llvm/test/MC/AVR/inst-brbc.s (+12-11)
- (modified) llvm/test/MC/AVR/inst-brbs.s (+11-11)
- (added) llvm/test/MC/AVR/inst-brcc.s (+28)
- (added) llvm/test/MC/AVR/inst-brcs.s (+28)
- (added) llvm/test/MC/AVR/inst-breq.s (+28)
- (added) llvm/test/MC/AVR/inst-brge.s (+24)
- (added) llvm/test/MC/AVR/inst-brhc.s (+24)
- (added) llvm/test/MC/AVR/inst-brhs.s (+24)
- (added) llvm/test/MC/AVR/inst-brid.s (+24)
- (added) llvm/test/MC/AVR/inst-brie.s (+24)
- (added) llvm/test/MC/AVR/inst-brlo.s (+24)
- (added) llvm/test/MC/AVR/inst-brlt.s (+24)
- (added) llvm/test/MC/AVR/inst-brmi.s (+24)
- (added) llvm/test/MC/AVR/inst-brne.s (+28)
- (added) llvm/test/MC/AVR/inst-brpl.s (+24)
- (added) llvm/test/MC/AVR/inst-brsh.s (+24)
- (added) llvm/test/MC/AVR/inst-brtc.s (+24)
- (added) llvm/test/MC/AVR/inst-brts.s (+24)
- (added) llvm/test/MC/AVR/inst-brvc.s (+24)
- (added) llvm/test/MC/AVR/inst-brvs.s (+24)
- (removed) llvm/test/MC/AVR/inst-family-cond-branch.s (-321)
- (modified) llvm/test/MC/AVR/inst-rcall.s (+17-16)
- (modified) llvm/test/MC/AVR/inst-rjmp.s (+38-31)
``````````diff
diff --git a/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp b/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
index 383dfcc31117c1..c016b2dd91dc67 100644
--- a/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
+++ b/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
@@ -72,7 +72,7 @@ class AVRAsmParser : public MCTargetAsmParser {
int parseRegisterName();
int parseRegister(bool RestoreOnFailure = false);
bool tryParseRegisterOperand(OperandVector &Operands);
- bool tryParseExpression(OperandVector &Operands);
+ bool tryParseExpression(OperandVector &Operands, int64_t offset);
bool tryParseRelocExpression(OperandVector &Operands);
void eatComma();
@@ -418,7 +418,7 @@ bool AVRAsmParser::tryParseRegisterOperand(OperandVector &Operands) {
return false;
}
-bool AVRAsmParser::tryParseExpression(OperandVector &Operands) {
+bool AVRAsmParser::tryParseExpression(OperandVector &Operands, int64_t offset) {
SMLoc S = Parser.getTok().getLoc();
if (!tryParseRelocExpression(Operands))
@@ -437,6 +437,11 @@ bool AVRAsmParser::tryParseExpression(OperandVector &Operands) {
if (getParser().parseExpression(Expression))
return true;
+ if (offset) {
+ Expression = MCBinaryExpr::createAdd(
+ Expression, MCConstantExpr::create(offset, getContext()), getContext());
+ }
+
SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
Operands.push_back(AVROperand::CreateImm(Expression, S, E));
return false;
@@ -529,8 +534,9 @@ bool AVRAsmParser::parseOperand(OperandVector &Operands, bool maybeReg) {
[[fallthrough]];
case AsmToken::LParen:
case AsmToken::Integer:
+ return tryParseExpression(Operands, 0);
case AsmToken::Dot:
- return tryParseExpression(Operands);
+ return tryParseExpression(Operands, 2);
case AsmToken::Plus:
case AsmToken::Minus: {
// If the sign preceeds a number, parse the number,
@@ -540,7 +546,7 @@ bool AVRAsmParser::parseOperand(OperandVector &Operands, bool maybeReg) {
case AsmToken::BigNum:
case AsmToken::Identifier:
case AsmToken::Real:
- if (!tryParseExpression(Operands))
+ if (!tryParseExpression(Operands, 0))
return false;
break;
default:
@@ -643,6 +649,7 @@ bool AVRAsmParser::ParseInstruction(ParseInstructionInfo &Info,
// These specific operands should be treated as addresses/symbols/labels,
// other than registers.
bool maybeReg = true;
+
if (OperandNum == 1) {
std::array<StringRef, 8> Insts = {"lds", "adiw", "sbiw", "ldi"};
for (auto Inst : Insts) {
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
index 0d29912bee2646..388d58a82214d1 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRAsmBackend.cpp
@@ -94,6 +94,9 @@ static void adjustRelativeBranch(unsigned Size, const MCFixup &Fixup,
// Rightshifts the value by one.
AVR::fixups::adjustBranchTarget(Value);
+
+ // Jumps are relative to the current instruction.
+ Value -= 1;
}
/// 22-bit absolute fixup.
@@ -513,15 +516,10 @@ bool AVRAsmBackend::shouldForceRelocation(const MCAssembler &Asm,
switch ((unsigned)Fixup.getKind()) {
default:
return Fixup.getKind() >= FirstLiteralRelocationKind;
- // Fixups which should always be recorded as relocations.
case AVR::fixup_7_pcrel:
case AVR::fixup_13_pcrel:
- // Do not force relocation for PC relative branch like 'rjmp .',
- // 'rcall . - off' and 'breq . + off'.
- if (const auto *SymA = Target.getSymA())
- if (SymA->getSymbol().getName().size() == 0)
- return false;
- [[fallthrough]];
+ // Always resolve relocations for PC-relative branches
+ return false;
case AVR::fixup_call:
return true;
}
diff --git a/llvm/test/CodeGen/AVR/jmp.ll b/llvm/test/CodeGen/AVR/jmp.ll
new file mode 100644
index 00000000000000..95dfff4836b4e8
--- /dev/null
+++ b/llvm/test/CodeGen/AVR/jmp.ll
@@ -0,0 +1,25 @@
+; RUN: llc -filetype=obj -mtriple=avr < %s | llvm-objdump -dr --no-show-raw-insn - | FileCheck %s
+
+define i8 @foo(i8 %a) {
+bb0:
+ %0 = tail call i8 @bar(i8 %a)
+ %1 = icmp eq i8 %0, 123
+ br i1 %1, label %bb1, label %bb2
+
+bb1:
+ ret i8 100
+
+bb2:
+ ret i8 200
+}
+
+declare i8 @bar(i8);
+
+; CHECK: rcall .-2
+; CHECK-NEXT: 00000000: R_AVR_13_PCREL bar
+; CHECK-NEXT: cpi r24, 0x7b
+; CHECK-NEXT: brne .+4
+; CHECK-NEXT: ldi r24, 0x64
+; CHECK-NEXT: ret
+; CHECK-NEXT: ldi r24, 0xc8
+; CHECK-NEXT: ret
diff --git a/llvm/test/MC/AVR/inst-brbc.s b/llvm/test/MC/AVR/inst-brbc.s
index 4d7d684da4468a..3ef3664cf07bfc 100644
--- a/llvm/test/MC/AVR/inst-brbc.s
+++ b/llvm/test/MC/AVR/inst-brbc.s
@@ -3,7 +3,6 @@
; RUN: | llvm-objdump -d - | FileCheck --check-prefix=INST %s
foo:
-
brbc 3, .+8
brbc 0, .-16
.short 0xf759
@@ -11,14 +10,16 @@ foo:
.short 0xf74c
.short 0xf4c7
-; CHECK: brvc .Ltmp0+8 ; encoding: [0bAAAAA011,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp0+8, kind: fixup_7_pcrel
-; CHECK: brcc .Ltmp1-16 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp1-16, kind: fixup_7_pcrel
+; CHECK: brvc (.Ltmp0+8)+2 ; encoding: [0bAAAAA011,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+8)+2, kind: fixup_7_pcrel
+;
+; CHECK: brcc (.Ltmp1-16)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-16)+2, kind: fixup_7_pcrel
-; INST: 23 f4 brvc .+8
-; INST: c0 f7 brsh .-16
-; INST: 59 f7 brne .-42
-; INST: 52 f7 brpl .-44
-; INST: 4c f7 brge .-46
-; INST: c7 f4 brid .+48
+; INST-LABEL: <foo>:
+; INST-NEXT: 23 f4 brvc .+8
+; INST-NEXT: c0 f7 brsh .-16
+; INST-NEXT: 59 f7 brne .-42
+; INST-NEXT: 52 f7 brpl .-44
+; INST-NEXT: 4c f7 brge .-46
+; INST-NEXT: c7 f4 brid .+48
diff --git a/llvm/test/MC/AVR/inst-brbs.s b/llvm/test/MC/AVR/inst-brbs.s
index 7987feeec654a1..f15a779a53654f 100644
--- a/llvm/test/MC/AVR/inst-brbs.s
+++ b/llvm/test/MC/AVR/inst-brbs.s
@@ -3,7 +3,6 @@
; RUN: | llvm-objdump -d - | FileCheck --check-prefix=INST %s
foo:
-
brbs 3, .+8
brbs 0, .-12
.short 0xf359
@@ -11,14 +10,15 @@ foo:
.short 0xf34c
.short 0xf077
-; CHECK: brvs .Ltmp0+8 ; encoding: [0bAAAAA011,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp0+8, kind: fixup_7_pcrel
-; CHECK: brcs .Ltmp1-12 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp1-12, kind: fixup_7_pcrel
+; CHECK: brvs (.Ltmp0+8)+2 ; encoding: [0bAAAAA011,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+8)+2, kind: fixup_7_pcrel
+; CHECK: brcs (.Ltmp1-12)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-12)+2, kind: fixup_7_pcrel
-; INST: 23 f0 brvs .+8
-; INST: d0 f3 brlo .-12
-; INST: 59 f3 breq .-42
-; INST: 52 f3 brmi .-44
-; INST: 4c f3 brlt .-46
-; INST: 77 f0 brie .+28
+; INST-LABEL: <foo>:
+; INST-NEXT: 23 f0 brvs .+8
+; INST-NEXT: d0 f3 brlo .-12
+; INST-NEXT: 59 f3 breq .-42
+; INST-NEXT: 52 f3 brmi .-44
+; INST-NEXT: 4c f3 brlt .-46
+; INST-NEXT: 77 f0 brie .+28
diff --git a/llvm/test/MC/AVR/inst-brcc.s b/llvm/test/MC/AVR/inst-brcc.s
new file mode 100644
index 00000000000000..d9218bc61e787f
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brcc.s
@@ -0,0 +1,28 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brcc .+66
+ brcc .-22
+ brbc 0, .+66
+ brbc 0, bar
+
+bar:
+
+; CHECK: brcc (.Ltmp0+66)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+66)+2, kind: fixup_7_pcrel
+; CHECK: brcc (.Ltmp1-22)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-22)+2, kind: fixup_7_pcrel
+; CHECK: brcc (.Ltmp2+66)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+66)+2, kind: fixup_7_pcrel
+; CHECK: brcc bar ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 08 f5 brsh .+66
+; INST-NEXT: a8 f7 brsh .-22
+; INST-NEXT: 08 f5 brsh .+66
+; INST-NEXT: 00 f4 brsh .+0
diff --git a/llvm/test/MC/AVR/inst-brcs.s b/llvm/test/MC/AVR/inst-brcs.s
new file mode 100644
index 00000000000000..0012cb31f61269
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brcs.s
@@ -0,0 +1,28 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brcs .+8
+ brcs .+4
+ brbs 0, .+8
+ brbs 0, bar
+
+bar:
+
+; CHECK: brcs (.Ltmp0+8)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+8)+2, kind: fixup_7_pcrel
+; CHECK: brcs (.Ltmp1+4)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+4)+2, kind: fixup_7_pcrel
+; CHECK: brcs (.Ltmp2+8)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_7_pcrel
+; CHECK: brcs bar ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 20 f0 brlo .+8
+; INST-NEXT: 10 f0 brlo .+4
+; INST-NEXT: 20 f0 brlo .+8
+; INST-NEXT: 00 f0 brlo .+0
diff --git a/llvm/test/MC/AVR/inst-breq.s b/llvm/test/MC/AVR/inst-breq.s
new file mode 100644
index 00000000000000..f82010f02ba617
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-breq.s
@@ -0,0 +1,28 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ breq .-18
+ breq .-12
+ brbs 1, .-18
+ brbs 1, bar
+
+bar:
+
+; CHECK: breq (.Ltmp0-18)+2 ; encoding: [0bAAAAA001,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0-18)+2, kind: fixup_7_pcrel
+; CHECK: breq (.Ltmp1-12)+2 ; encoding: [0bAAAAA001,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-12)+2, kind: fixup_7_pcrel
+; CHECK: brbs 1, (.Ltmp2-18)+2 ; encoding: [0bAAAAA001,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2-18)+2, kind: fixup_7_pcrel
+; CHECK: brbs 1, bar ; encoding: [0bAAAAA001,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: b9 f3 breq .-18
+; INST-NEXT: d1 f3 breq .-12
+; INST-NEXT: b9 f3 breq .-18
+; INST-NEXT: 01 f0 breq .+0
diff --git a/llvm/test/MC/AVR/inst-brge.s b/llvm/test/MC/AVR/inst-brge.s
new file mode 100644
index 00000000000000..1121284a114689
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brge.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brge .+50
+ brge .+42
+ brge bar
+
+bar:
+
+; CHECK: brge (.Ltmp0+50)+2 ; encoding: [0bAAAAA100,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+50)+2, kind: fixup_7_pcrel
+; CHECK: brge (.Ltmp1+42)+2 ; encoding: [0bAAAAA100,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+42)+2, kind: fixup_7_pcrel
+; CHECK: brge bar ; encoding: [0bAAAAA100,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: cc f4 brge .+50
+; INST-NEXT: ac f4 brge .+42
+; INST-NEXT: 04 f4 brge .+0
diff --git a/llvm/test/MC/AVR/inst-brhc.s b/llvm/test/MC/AVR/inst-brhc.s
new file mode 100644
index 00000000000000..eb16ac2ef7a64e
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brhc.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brhc .+12
+ brhc .+14
+ brhc bar
+
+bar:
+
+; CHECK: brhc (.Ltmp0+12)+2 ; encoding: [0bAAAAA101,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+12)+2, kind: fixup_7_pcrel
+; CHECK: brhc (.Ltmp1+14)+2 ; encoding: [0bAAAAA101,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+14)+2, kind: fixup_7_pcrel
+; CHECK: brhc bar ; encoding: [0bAAAAA101,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 35 f4 brhc .+12
+; INST-NEXT: 3d f4 brhc .+14
+; INST-NEXT: 05 f4 brhc .+0
diff --git a/llvm/test/MC/AVR/inst-brhs.s b/llvm/test/MC/AVR/inst-brhs.s
new file mode 100644
index 00000000000000..77c49596b3b0b8
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brhs.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brhs .-66
+ brhs .+14
+ brhs bar
+
+bar:
+
+; CHECK: brhs (.Ltmp0-66)+2 ; encoding: [0bAAAAA101,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0-66)+2, kind: fixup_7_pcrel
+; CHECK: brhs (.Ltmp1+14)+2 ; encoding: [0bAAAAA101,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+14)+2, kind: fixup_7_pcrel
+; CHECK: brhs bar ; encoding: [0bAAAAA101,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: fd f2 brhs .-66
+; INST-NEXT: 3d f0 brhs .+14
+; INST-NEXT: 05 f0 brhs .+0
diff --git a/llvm/test/MC/AVR/inst-brid.s b/llvm/test/MC/AVR/inst-brid.s
new file mode 100644
index 00000000000000..70d0ea83c49b2a
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brid.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brid .+42
+ brid .+62
+ brid bar
+
+bar:
+
+; CHECK: brid (.Ltmp0+42)+2 ; encoding: [0bAAAAA111,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+42)+2, kind: fixup_7_pcrel
+; CHECK: brid (.Ltmp1+62)+2 ; encoding: [0bAAAAA111,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+62)+2, kind: fixup_7_pcrel
+; CHECK: brid bar ; encoding: [0bAAAAA111,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: af f4 brid .+42
+; INST-NEXT: ff f4 brid .+62
+; INST-NEXT: 07 f4 brid .+0
diff --git a/llvm/test/MC/AVR/inst-brie.s b/llvm/test/MC/AVR/inst-brie.s
new file mode 100644
index 00000000000000..717c686e2ed44e
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brie.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brie .+20
+ brie .+40
+ brie bar
+
+bar:
+
+; CHECK: brie (.Ltmp0+20)+2 ; encoding: [0bAAAAA111,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+20)+2, kind: fixup_7_pcrel
+; CHECK: brie (.Ltmp1+40)+2 ; encoding: [0bAAAAA111,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+40)+2, kind: fixup_7_pcrel
+; CHECK: brie bar ; encoding: [0bAAAAA111,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 57 f0 brie .+20
+; INST-NEXT: a7 f0 brie .+40
+; INST-NEXT: 07 f0 brie .+0
diff --git a/llvm/test/MC/AVR/inst-brlo.s b/llvm/test/MC/AVR/inst-brlo.s
new file mode 100644
index 00000000000000..4b56d66ffdfe00
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brlo.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brlo .+12
+ brlo .+28
+ brlo bar
+
+bar:
+
+; CHECK: brlo (.Ltmp0+12)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+12)+2, kind: fixup_7_pcrel
+; CHECK: brlo (.Ltmp1+28)+2 ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+28)+2, kind: fixup_7_pcrel
+; CHECK: brlo bar ; encoding: [0bAAAAA000,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 30 f0 brlo .+12
+; INST-NEXT: 70 f0 brlo .+28
+; INST-NEXT: 00 f0 brlo .+0
diff --git a/llvm/test/MC/AVR/inst-brlt.s b/llvm/test/MC/AVR/inst-brlt.s
new file mode 100644
index 00000000000000..8a7c543f9444b1
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brlt.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brlt .+16
+ brlt .+2
+ brlt bar
+
+bar:
+
+; CHECK: brlt (.Ltmp0+16)+2 ; encoding: [0bAAAAA100,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+16)+2, kind: fixup_7_pcrel
+; CHECK: brlt (.Ltmp1+2)+2 ; encoding: [0bAAAAA100,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+2)+2, kind: fixup_7_pcrel
+; CHECK: brlt bar ; encoding: [0bAAAAA100,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 44 f0 brlt .+16
+; INST-NEXT: 0c f0 brlt .+2
+; INST-NEXT: 04 f0 brlt .+0
diff --git a/llvm/test/MC/AVR/inst-brmi.s b/llvm/test/MC/AVR/inst-brmi.s
new file mode 100644
index 00000000000000..878612d294dd95
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brmi.s
@@ -0,0 +1,24 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brmi .+66
+ brmi .+58
+ brmi bar
+
+bar:
+
+; CHECK: brmi (.Ltmp0+66)+2 ; encoding: [0bAAAAA010,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+66)+2, kind: fixup_7_pcrel
+; CHECK: brmi (.Ltmp1+58)+2 ; encoding: [0bAAAAA010,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+58)+2, kind: fixup_7_pcrel
+; CHECK: brmi bar ; encoding: [0bAAAAA010,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 0a f1 brmi .+66
+; INST-NEXT: ea f0 brmi .+58
+; INST-NEXT: 02 f0 brmi .+0
diff --git a/llvm/test/MC/AVR/inst-brne.s b/llvm/test/MC/AVR/inst-brne.s
new file mode 100644
index 00000000000000..9d6bee4b754d95
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brne.s
@@ -0,0 +1,28 @@
+; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
+; RUN: llvm-mc -filetype=obj -triple avr < %s \
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
+
+foo:
+ brne .+10
+ brne .+2
+ brbc 1, .+10
+ brbc 1, bar
+
+bar:
+
+; CHECK: brne (.Ltmp0+10)+2 ; encoding: [0bAAAAA001,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+10)+2, kind: fixup_7_pcrel
+; CHECK: brne (.Ltmp1+2)+2 ; encoding: [0bAAAAA001,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/107082
More information about the llvm-branch-commits
mailing list