[llvm] [AVR] Fix parsing & emitting relative jumps (PR #106722)
Patryk Wychowaniec via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 30 05:47:49 PDT 2024
https://github.com/Patryk27 created https://github.com/llvm/llvm-project/pull/106722
Extracted the essence from https://github.com/llvm/llvm-project/pull/102936.
cc @aykevl
>From 2bb0acb67d05b0d3815a2c6a81792363aca15ceb Mon Sep 17 00:00:00 2001
From: Patryk Wychowaniec <pwychowaniec at pm.me>
Date: Mon, 12 Aug 2024 18:47:44 +0200
Subject: [PATCH] [AVR] Fix parsing & emitting relative jumps
---
.../lib/Target/AVR/AsmParser/AVRAsmParser.cpp | 15 +-
.../Target/AVR/MCTargetDesc/AVRAsmBackend.cpp | 12 +-
llvm/test/CodeGen/AVR/jmp.ll | 25 ++
llvm/test/MC/AVR/inst-brbc.s | 23 +-
llvm/test/MC/AVR/inst-brbs.s | 22 +-
llvm/test/MC/AVR/inst-brcc.s | 28 ++
llvm/test/MC/AVR/inst-brcs.s | 28 ++
llvm/test/MC/AVR/inst-breq.s | 28 ++
llvm/test/MC/AVR/inst-brge.s | 24 ++
llvm/test/MC/AVR/inst-brhc.s | 24 ++
llvm/test/MC/AVR/inst-brhs.s | 24 ++
llvm/test/MC/AVR/inst-brid.s | 24 ++
llvm/test/MC/AVR/inst-brie.s | 24 ++
llvm/test/MC/AVR/inst-brlo.s | 24 ++
llvm/test/MC/AVR/inst-brlt.s | 24 ++
llvm/test/MC/AVR/inst-brmi.s | 24 ++
llvm/test/MC/AVR/inst-brne.s | 28 ++
llvm/test/MC/AVR/inst-brpl.s | 24 ++
llvm/test/MC/AVR/inst-brsh.s | 24 ++
llvm/test/MC/AVR/inst-brtc.s | 24 ++
llvm/test/MC/AVR/inst-brts.s | 24 ++
llvm/test/MC/AVR/inst-brvc.s | 24 ++
llvm/test/MC/AVR/inst-brvs.s | 24 ++
llvm/test/MC/AVR/inst-family-cond-branch.s | 321 ------------------
llvm/test/MC/AVR/inst-rcall.s | 33 +-
llvm/test/MC/AVR/inst-rjmp.s | 69 ++--
26 files changed, 567 insertions(+), 401 deletions(-)
create mode 100644 llvm/test/CodeGen/AVR/jmp.ll
create mode 100644 llvm/test/MC/AVR/inst-brcc.s
create mode 100644 llvm/test/MC/AVR/inst-brcs.s
create mode 100644 llvm/test/MC/AVR/inst-breq.s
create mode 100644 llvm/test/MC/AVR/inst-brge.s
create mode 100644 llvm/test/MC/AVR/inst-brhc.s
create mode 100644 llvm/test/MC/AVR/inst-brhs.s
create mode 100644 llvm/test/MC/AVR/inst-brid.s
create mode 100644 llvm/test/MC/AVR/inst-brie.s
create mode 100644 llvm/test/MC/AVR/inst-brlo.s
create mode 100644 llvm/test/MC/AVR/inst-brlt.s
create mode 100644 llvm/test/MC/AVR/inst-brmi.s
create mode 100644 llvm/test/MC/AVR/inst-brne.s
create mode 100644 llvm/test/MC/AVR/inst-brpl.s
create mode 100644 llvm/test/MC/AVR/inst-brsh.s
create mode 100644 llvm/test/MC/AVR/inst-brtc.s
create mode 100644 llvm/test/MC/AVR/inst-brts.s
create mode 100644 llvm/test/MC/AVR/inst-brvc.s
create mode 100644 llvm/test/MC/AVR/inst-brvs.s
delete mode 100644 llvm/test/MC/AVR/inst-family-cond-branch.s
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: (.Ltmp1+2)+2, kind: fixup_7_pcrel
+; CHECK: brbc 1, (.Ltmp2+10)+2 ; encoding: [0bAAAAA001,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+10)+2, kind: fixup_7_pcrel
+; CHECK: brbc 1, bar ; encoding: [0bAAAAA001,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 29 f4 brne .+10
+; INST-NEXT: 09 f4 brne .+2
+; INST-NEXT: 29 f4 brne .+10
+; INST-NEXT: 01 f4 brne .+0
diff --git a/llvm/test/MC/AVR/inst-brpl.s b/llvm/test/MC/AVR/inst-brpl.s
new file mode 100644
index 00000000000000..393365ee35339e
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brpl.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:
+ brpl .-12
+ brpl .+18
+ brpl bar
+
+bar:
+
+; CHECK: brpl (.Ltmp0-12)+2 ; encoding: [0bAAAAA010,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0-12)+2, kind: fixup_7_pcrel
+; CHECK: brpl (.Ltmp1+18)+2 ; encoding: [0bAAAAA010,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+18)+2, kind: fixup_7_pcrel
+; CHECK: brpl bar ; encoding: [0bAAAAA010,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: d2 f7 brpl .-12
+; INST-NEXT: 4a f4 brpl .+18
+; INST-NEXT: 02 f4 brpl .+0
diff --git a/llvm/test/MC/AVR/inst-brsh.s b/llvm/test/MC/AVR/inst-brsh.s
new file mode 100644
index 00000000000000..0bacd64d3d8d05
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brsh.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:
+ brsh .+32
+ brsh .+70
+ brsh bar
+
+bar:
+
+; CHECK: brsh (.Ltmp0+32)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+32)+2, kind: fixup_7_pcrel
+; CHECK: brsh (.Ltmp1+70)+2 ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+70)+2, kind: fixup_7_pcrel
+; CHECK: brsh bar ; encoding: [0bAAAAA000,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 80 f4 brsh .+32
+; INST-NEXT: 18 f5 brsh .+70
+; INST-NEXT: 00 f4 brsh .+0
diff --git a/llvm/test/MC/AVR/inst-brtc.s b/llvm/test/MC/AVR/inst-brtc.s
new file mode 100644
index 00000000000000..eb4ee211628721
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brtc.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:
+ brtc .+52
+ brtc .+50
+ brtc bar
+
+bar:
+
+; CHECK: brtc (.Ltmp0+52)+2 ; encoding: [0bAAAAA110,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+52)+2, kind: fixup_7_pcrel
+; CHECK: brtc (.Ltmp1+50)+2 ; encoding: [0bAAAAA110,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+50)+2, kind: fixup_7_pcrel
+; CHECK: brtc bar ; encoding: [0bAAAAA110,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: d6 f4 brtc .+52
+; INST-NEXT: ce f4 brtc .+50
+; INST-NEXT: 06 f4 brtc .+0
diff --git a/llvm/test/MC/AVR/inst-brts.s b/llvm/test/MC/AVR/inst-brts.s
new file mode 100644
index 00000000000000..ccd794a9225894
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brts.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:
+ brts .+18
+ brts .+22
+ brts bar
+
+bar:
+
+; CHECK: brts (.Ltmp0+18)+2 ; encoding: [0bAAAAA110,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+18)+2, kind: fixup_7_pcrel
+; CHECK: brts (.Ltmp1+22)+2 ; encoding: [0bAAAAA110,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+22)+2, kind: fixup_7_pcrel
+; CHECK: brts bar ; encoding: [0bAAAAA110,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 4e f0 brts .+18
+; INST-NEXT: 5e f0 brts .+22
+; INST-NEXT: 06 f0 brts .+0
diff --git a/llvm/test/MC/AVR/inst-brvc.s b/llvm/test/MC/AVR/inst-brvc.s
new file mode 100644
index 00000000000000..573f779c0dcd6a
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brvc.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:
+ brvc .-28
+ brvc .-62
+ brvc bar
+
+bar:
+
+; CHECK: brvc (.Ltmp0-28)+2 ; encoding: [0bAAAAA011,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0-28)+2, kind: fixup_7_pcrel
+; CHECK: brvc (.Ltmp1-62)+2 ; encoding: [0bAAAAA011,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-62)+2, kind: fixup_7_pcrel
+; CHECK: brvc bar ; encoding: [0bAAAAA011,0b111101AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 93 f7 brvc .-28
+; INST-NEXT: 0b f7 brvc .-62
+; INST-NEXT: 03 f4 brvc .+0
diff --git a/llvm/test/MC/AVR/inst-brvs.s b/llvm/test/MC/AVR/inst-brvs.s
new file mode 100644
index 00000000000000..d50a1a9ec5b62f
--- /dev/null
+++ b/llvm/test/MC/AVR/inst-brvs.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:
+ brvs .+18
+ brvs .+32
+ brvs bar
+
+bar:
+
+; CHECK: brvs (.Ltmp0+18)+2 ; encoding: [0bAAAAA011,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+18)+2, kind: fixup_7_pcrel
+; CHECK: brvs (.Ltmp1+32)+2 ; encoding: [0bAAAAA011,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1+32)+2, kind: fixup_7_pcrel
+; CHECK: brvs bar ; encoding: [0bAAAAA011,0b111100AA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
+
+; INST-LABEL: <foo>:
+; INST-NEXT: 4b f0 brvs .+18
+; INST-NEXT: 83 f0 brvs .+32
+; INST-NEXT: 03 f0 brvs .+0
diff --git a/llvm/test/MC/AVR/inst-family-cond-branch.s b/llvm/test/MC/AVR/inst-family-cond-branch.s
deleted file mode 100644
index dc36425a884f3b..00000000000000
--- a/llvm/test/MC/AVR/inst-family-cond-branch.s
+++ /dev/null
@@ -1,321 +0,0 @@
-; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
-; RUN: llvm-mc -filetype=obj -triple avr < %s \
-; RUN: | llvm-objdump -d - | FileCheck --check-prefix=INST %s
-
-
-foo:
- ; BREQ
- breq .-18
- breq .-12
- brbs 1, .-18
- brbs 1, baz
-
-; CHECK: breq .Ltmp0-18 ; encoding: [0bAAAAA001,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp0-18, kind: fixup_7_pcrel
-; CHECK: breq .Ltmp1-12 ; encoding: [0bAAAAA001,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp1-12, kind: fixup_7_pcrel
-; CHECK: brbs 1, .Ltmp2-18 ; encoding: [0bAAAAA001,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp2-18, kind: fixup_7_pcrel
-; CHECK: brbs 1, baz ; encoding: [0bAAAAA001,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: baz, kind: fixup_7_pcrel
-
-; INST-LABEL: <foo>:
-; INST: breq .-18
-; INST: breq .-12
-; INST: breq .-18
-; INST: breq .+0
-
- ; BRNE
- brne .+10
- brne .+2
- brbc 1, .+10
- brbc 1, bar
-
-; CHECK: brne .Ltmp3+10 ; encoding: [0bAAAAA001,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp3+10, kind: fixup_7_pcrel
-; CHECK: brne .Ltmp4+2 ; encoding: [0bAAAAA001,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp4+2, kind: fixup_7_pcrel
-; CHECK: brbc 1, .Ltmp5+10 ; encoding: [0bAAAAA001,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp5+10, kind: fixup_7_pcrel
-; CHECK: brbc 1, bar ; encoding: [0bAAAAA001,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: bar, kind: fixup_7_pcrel
-
-; INST: brne .+10
-; INST: brne .+2
-; INST: brne .+10
-; INST: brne .+0
-
-bar:
- ; BRCS
- brcs .+8
- brcs .+4
- brbs 0, .+8
- brbs 0, end
-
-; CHECK: brcs .Ltmp6+8 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp6+8, kind: fixup_7_pcrel
-; CHECK: brcs .Ltmp7+4 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp7+4, kind: fixup_7_pcrel
-; CHECK: brcs .Ltmp8+8 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp8+8, kind: fixup_7_pcrel
-; CHECK: brcs end ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST-LABEL: <bar>:
-; INST: brlo .+8
-; INST: brlo .+4
-; INST: brlo .+8
-; INST: brlo .+0
-
- ; BRCC
- brcc .+66
- brcc .-22
- brbc 0, .+66
- brbc 0, baz
-
-; CHECK: brcc .Ltmp9+66 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp9+66, kind: fixup_7_pcrel
-; CHECK: brcc .Ltmp10-22 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp10-22, kind: fixup_7_pcrel
-; CHECK: brcc .Ltmp11+66 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp11+66, kind: fixup_7_pcrel
-; CHECK: brcc baz ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: baz, kind: fixup_7_pcrel
-
-; INST: brsh .+66
-; INST: brsh .-22
-; INST: brsh .+66
-; INST: brsh .+0
-
-; BRSH
- brsh .+32
- brsh .+70
- brsh car
-
-; CHECK: brsh .Ltmp12+32 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp12+32, kind: fixup_7_pcrel
-; CHECK: brsh .Ltmp13+70 ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp13+70, kind: fixup_7_pcrel
-; CHECK: brsh car ; encoding: [0bAAAAA000,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
-
-; INST: brsh .+32
-; INST: brsh .+70
-; INST: brsh .+0
-
-baz:
-
- ; BRLO
- brlo .+12
- brlo .+28
- brlo car
-
-; CHECK: brlo .Ltmp14+12 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp14+12, kind: fixup_7_pcrel
-; CHECK: brlo .Ltmp15+28 ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp15+28, kind: fixup_7_pcrel
-; CHECK: brlo car ; encoding: [0bAAAAA000,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
-
-; INST-LABEL: <baz>:
-; INST: brlo .+12
-; INST: brlo .+28
-; INST: brlo .+0
-
- ; BRMI
- brmi .+66
- brmi .+58
- brmi car
-
-; CHECK: brmi .Ltmp16+66 ; encoding: [0bAAAAA010,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp16+66, kind: fixup_7_pcrel
-; CHECK: brmi .Ltmp17+58 ; encoding: [0bAAAAA010,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp17+58, kind: fixup_7_pcrel
-; CHECK: brmi car ; encoding: [0bAAAAA010,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
-
-; INST: brmi .+66
-; INST: brmi .+58
-; INST: brmi .+0
-
- ; BRPL
- brpl .-12
- brpl .+18
- brpl car
-
-; CHECK: brpl .Ltmp18-12 ; encoding: [0bAAAAA010,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp18-12, kind: fixup_7_pcrel
-; CHECK: brpl .Ltmp19+18 ; encoding: [0bAAAAA010,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp19+18, kind: fixup_7_pcrel
-; CHECK: brpl car ; encoding: [0bAAAAA010,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
-
-; INST: brpl .-12
-; INST: brpl .+18
-; INST: brpl .+0
-
-; BRGE
- brge .+50
- brge .+42
- brge car
-
-; CHECK: brge .Ltmp20+50 ; encoding: [0bAAAAA100,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp20+50, kind: fixup_7_pcrel
-; CHECK: brge .Ltmp21+42 ; encoding: [0bAAAAA100,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp21+42, kind: fixup_7_pcrel
-; CHECK: brge car ; encoding: [0bAAAAA100,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: car, kind: fixup_7_pcrel
-
-; INST: brge .+50
-; INST: brge .+42
-; INST: brge .+0
-
-car:
- ; BRLT
- brlt .+16
- brlt .+2
- brlt end
-
-; CHECK: brlt .Ltmp22+16 ; encoding: [0bAAAAA100,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp22+16, kind: fixup_7_pcrel
-; CHECK: brlt .Ltmp23+2 ; encoding: [0bAAAAA100,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp23+2, kind: fixup_7_pcrel
-; CHECK: brlt end ; encoding: [0bAAAAA100,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST-LABEL: <car>:
-; INST: brlt .+16
-; INST: brlt .+2
-; INST: brlt .+0
-
- ; BRHS
- brhs .-66
- brhs .+14
- brhs just_another_label
-
-; CHECK: brhs .Ltmp24-66 ; encoding: [0bAAAAA101,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp24-66, kind: fixup_7_pcrel
-; CHECK: brhs .Ltmp25+14 ; encoding: [0bAAAAA101,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp25+14, kind: fixup_7_pcrel
-; CHECK: brhs just_another_label ; encoding: [0bAAAAA101,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
-
-; INST: brhs .-66
-; INST: brhs .+14
-; INST: brhs .+0
-
- ; BRHC
- brhc .+12
- brhc .+14
- brhc just_another_label
-
-; CHECK: brhc .Ltmp26+12 ; encoding: [0bAAAAA101,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp26+12, kind: fixup_7_pcrel
-; CHECK: brhc .Ltmp27+14 ; encoding: [0bAAAAA101,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp27+14, kind: fixup_7_pcrel
-; CHECK: brhc just_another_label ; encoding: [0bAAAAA101,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
-
-; INST: brhc .+12
-; INST: brhc .+14
-; INST: brhc .+0
-
- ; BRTS
- brts .+18
- brts .+22
- brts just_another_label
-
-; CHECK: brts .Ltmp28+18 ; encoding: [0bAAAAA110,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp28+18, kind: fixup_7_pcrel
-; CHECK: brts .Ltmp29+22 ; encoding: [0bAAAAA110,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp29+22, kind: fixup_7_pcrel
-; CHECK: brts just_another_label ; encoding: [0bAAAAA110,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: just_another_label, kind: fixup_7_pcrel
-
-; INST: brts .+18
-; INST: brts .+22
-; INST: brts .+0
-
-just_another_label:
- ; BRTC
- brtc .+52
- brtc .+50
- brtc end
-
-; CHECK: brtc .Ltmp30+52 ; encoding: [0bAAAAA110,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp30+52, kind: fixup_7_pcrel
-; CHECK: brtc .Ltmp31+50 ; encoding: [0bAAAAA110,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp31+50, kind: fixup_7_pcrel
-; CHECK: brtc end ; encoding: [0bAAAAA110,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST-LABEL: <just_another_label>:
-; INST: brtc .+52
-; INST: brtc .+50
-; INST: brtc .+0
-
- ; BRVS
- brvs .+18
- brvs .+32
- brvs end
-
-; CHECK: brvs .Ltmp32+18 ; encoding: [0bAAAAA011,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp32+18, kind: fixup_7_pcrel
-; CHECK: brvs .Ltmp33+32 ; encoding: [0bAAAAA011,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp33+32, kind: fixup_7_pcrel
-; CHECK: brvs end ; encoding: [0bAAAAA011,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST: brvs .+18
-; INST: brvs .+32
-; INST: brvs .+0
-
- ; BRVC
- brvc .-28
- brvc .-62
- brvc end
-
-; CHECK: brvc .Ltmp34-28 ; encoding: [0bAAAAA011,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp34-28, kind: fixup_7_pcrel
-; CHECK: brvc .Ltmp35-62 ; encoding: [0bAAAAA011,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp35-62, kind: fixup_7_pcrel
-; CHECK: brvc end ; encoding: [0bAAAAA011,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST: brvc .-28
-; INST: brvc .-62
-; INST: brvc .+0
-
- ; BRIE
- brie .+20
- brie .+40
- brie end
-
-; CHECK: brie .Ltmp36+20 ; encoding: [0bAAAAA111,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp36+20, kind: fixup_7_pcrel
-; CHECK: brie .Ltmp37+40 ; encoding: [0bAAAAA111,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp37+40, kind: fixup_7_pcrel
-; CHECK: brie end ; encoding: [0bAAAAA111,0b111100AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST: brie .+20
-; INST: brie .+40
-; INST: brie .+0
-
- ; BRID
- brid .+42
- brid .+62
- brid end
-
-; CHECK: brid .Ltmp38+42 ; encoding: [0bAAAAA111,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp38+42, kind: fixup_7_pcrel
-; CHECK: brid .Ltmp39+62 ; encoding: [0bAAAAA111,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp39+62, kind: fixup_7_pcrel
-; CHECK: brid end ; encoding: [0bAAAAA111,0b111101AA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_7_pcrel
-
-; INST: brid .+42
-; INST: brid .+62
-; INST: brid .+0
-
-end:
diff --git a/llvm/test/MC/AVR/inst-rcall.s b/llvm/test/MC/AVR/inst-rcall.s
index 006013aa6ea946..a4ec32d05b1a43 100644
--- a/llvm/test/MC/AVR/inst-rcall.s
+++ b/llvm/test/MC/AVR/inst-rcall.s
@@ -1,27 +1,28 @@
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
; RUN: llvm-mc -filetype=obj -triple avr < %s \
-; RUN: | llvm-objdump -d - | FileCheck --check-prefix=INST %s
-
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
foo:
-
rcall .+0
rcall .-8
rcall .+12
rcall .+46
.short 0xdfea
-; CHECK: rcall .Ltmp0+0 ; encoding: [A,0b1101AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp0+0, kind: fixup_13_pcrel
-; CHECK: rcall .Ltmp1-8 ; encoding: [A,0b1101AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp1-8, kind: fixup_13_pcrel
-; CHECK: rcall .Ltmp2+12 ; encoding: [A,0b1101AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp2+12, kind: fixup_13_pcrel
-; CHECK: rcall .Ltmp3+46 ; encoding: [A,0b1101AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp3+46, kind: fixup_13_pcrel
+; CHECK: rcall (.Ltmp0+0)+2 ; encoding: [A,0b1101AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+0)+2, kind: fixup_13_pcrel
+; CHECK: rcall (.Ltmp1-8)+2 ; encoding: [A,0b1101AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-8)+2, kind: fixup_13_pcrel
+; CHECK: rcall (.Ltmp2+12)+2 ; encoding: [A,0b1101AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+12)+2, kind: fixup_13_pcrel
+; CHECK: rcall (.Ltmp3+46)+2 ; encoding: [A,0b1101AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+46)+2, kind: fixup_13_pcrel
-; INST: 00 d0 rcall .+0
-; INST: fc df rcall .-8
-; INST: 06 d0 rcall .+12
-; INST: 17 d0 rcall .+46
-; INST: ea df rcall .-44
+; INST-LABEL: <foo>:
+; INST-NEXT: 00 d0 rcall .+0
+; INST-NEXT: fc df rcall .-8
+; INST-NEXT: 06 d0 rcall .+12
+; INST-NEXT: 17 d0 rcall .+46
+; INST-NEXT: ea df rcall .-44
diff --git a/llvm/test/MC/AVR/inst-rjmp.s b/llvm/test/MC/AVR/inst-rjmp.s
index 3dbac39e055ddf..cc843a58b55d2c 100644
--- a/llvm/test/MC/AVR/inst-rjmp.s
+++ b/llvm/test/MC/AVR/inst-rjmp.s
@@ -1,49 +1,56 @@
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
+;
; RUN: llvm-mc -filetype=obj -triple avr < %s \
-; RUN: | llvm-objdump -d - | FileCheck --check-prefix=INST %s
-
+; RUN: | llvm-objdump -d - \
+; RUN: | FileCheck --check-prefix=INST %s
foo:
-
rjmp .+2
rjmp .-2
rjmp foo
rjmp .+8
rjmp end
rjmp .+0
+
end:
rjmp .-4
rjmp .-6
+
x:
rjmp x
.short 0xc00f
-; CHECK: rjmp .Ltmp0+2 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp0+2, kind: fixup_13_pcrel
-; CHECK: rjmp .Ltmp1-2 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp1-2, kind: fixup_13_pcrel
-; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
-; CHECK: rjmp .Ltmp2+8 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp2+8, kind: fixup_13_pcrel
-; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
-; CHECK: rjmp .Ltmp3+0 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp3+0, kind: fixup_13_pcrel
-; CHECK: rjmp .Ltmp4-4 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp4-4, kind: fixup_13_pcrel
-; CHECK: rjmp .Ltmp5-6 ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: .Ltmp5-6, kind: fixup_13_pcrel
-; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
-; CHECK: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp0+2)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp0+2)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp1-2)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp1-2)+2, kind: fixup_13_pcrel
+; CHECK: rjmp foo ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: foo, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp2+8)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp2+8)+2, kind: fixup_13_pcrel
+; CHECK: rjmp end ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: end, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp3+0)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp3+0)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp4-4)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp4-4)+2, kind: fixup_13_pcrel
+; CHECK: rjmp (.Ltmp5-6)+2 ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: (.Ltmp5-6)+2, kind: fixup_13_pcrel
+; CHECK: rjmp x ; encoding: [A,0b1100AAAA]
+; CHECK-NEXT: ; fixup A - offset: 0, value: x, kind: fixup_13_pcrel
-; INST: 01 c0 rjmp .+2
-; INST: ff cf rjmp .-2
-; INST: 00 c0 rjmp .+0
-; INST: 04 c0 rjmp .+8
-; INST: 00 c0 rjmp .+0
-; INST: 00 c0 rjmp .+0
-; INST: fe cf rjmp .-4
-; INST: fd cf rjmp .-6
-; INST: 00 c0 rjmp .+0
-; INST: 0f c0 rjmp .+30
+; INST-LABEL: <foo>:
+; INST-NEXT: 01 c0 rjmp .+2
+; INST-NEXT: ff cf rjmp .-2
+; INST-NEXT: fd cf rjmp .-6
+; INST-NEXT: 04 c0 rjmp .+8
+; INST-NEXT: 01 c0 rjmp .+2
+; INST-NEXT: 00 c0 rjmp .+0
+; INST-EMPTY:
+; INST-LABEL: <end>:
+; INST-NEXT: fe cf rjmp .-4
+; INST-NEXT: fd cf rjmp .-6
+; INST-EMPTY:
+; INST-LABEL: <x>:
+; INST-NEXT: ff cf rjmp .-2
+; INST-NEXT: 0f c0 rjmp .+30
More information about the llvm-commits
mailing list