171 lines · plain
1# RUN: split-file %s %t2# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+experimental-xqcilb %t/pass.s -o - \3# RUN: | llvm-objdump -dr -M no-aliases - --mattr=+experimental-xqcilb | FileCheck %s4# RUN: not llvm-mc -filetype=obj -triple riscv32 -mattr=+experimental-xqcilb %t/fail.s \5# RUN: 2>&1 | FileCheck %t/fail.s --check-prefix=ERROR6 7## This testcase shows how `c.j`, `c.jal` and `jal` can be relaxed to `qc.e.j` and `qc.e.jal`8## with Xqcilb, when the branches are out of range, but also that these can be compressed9## when referencing close labels.10 11## The only problem we have here is when `jal` references an out-of-range label, and `rd` is12## not `x0` or `x1` - for which we have no equivalent sequence, so we just fail to relax, and13## emit a fixup-value-out-of-range error.14 15#--- pass.s16 17EXT_JUMP_NEGATIVE:18 c.nop19.space 0x10000020 21FAR_JUMP_NEGATIVE:22 c.nop23.space 0x100024 25NEAR_NEGATIVE:26 c.nop27 28start:29 c.j NEAR30# CHECK: c.j {{0x[0-9a-f]+}} <NEAR>31 c.j NEAR_NEGATIVE32# CHECK: c.j {{0x[0-9a-f]+}} <NEAR_NEGATIVE>33 c.j FAR_JUMP34# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP>35 c.j FAR_JUMP_NEGATIVE36# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>37 c.j EXT_JUMP38# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP>39 c.j EXT_JUMP_NEGATIVE40# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>41 c.j undef42# CHECK: qc.e.j {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>43# CHECK: R_RISCV_CUSTOM195 undef44 45 c.jal NEAR46# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR>47 c.jal NEAR_NEGATIVE48# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR_NEGATIVE>49 c.jal FAR_JUMP50# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP>51 c.jal FAR_JUMP_NEGATIVE52# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>53 c.jal EXT_JUMP54# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP>55 c.jal EXT_JUMP_NEGATIVE56# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>57 c.jal undef58# CHECK: qc.e.jal {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>59# CHECK: R_RISCV_CUSTOM195 undef60 61 jal zero, NEAR62# CHECK: c.j {{0x[0-9a-f]+}} <NEAR>63 jal zero, NEAR_NEGATIVE64# CHECK: c.j {{0x[0-9a-f]+}} <NEAR_NEGATIVE>65 jal zero, FAR_JUMP66# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP>67 jal zero, FAR_JUMP_NEGATIVE68# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>69 jal zero, EXT_JUMP70# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP>71 jal zero, EXT_JUMP_NEGATIVE72# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>73 jal zero, undef74# CHECK: qc.e.j {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>75# CHECK: R_RISCV_CUSTOM195 undef76 77 jal ra, NEAR78# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR>79 jal ra, NEAR_NEGATIVE80# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR_NEGATIVE>81 jal ra, FAR_JUMP82# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP>83 jal ra, FAR_JUMP_NEGATIVE84# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>85 jal ra, EXT_JUMP86# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP>87 jal ra, EXT_JUMP_NEGATIVE88# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>89 jal ra, undef90# CHECK: qc.e.jal {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>91# CHECK: R_RISCV_CUSTOM195 undef92 93 qc.e.j NEAR94# CHECK: c.j {{0x[0-9a-f]+}} <NEAR>95 qc.e.j NEAR_NEGATIVE96# CHECK: c.j {{0x[0-9a-f]+}} <NEAR_NEGATIVE>97 qc.e.j FAR_JUMP98# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP>99 qc.e.j FAR_JUMP_NEGATIVE100# CHECK: jal zero, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>101 qc.e.j EXT_JUMP102# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP>103 qc.e.j EXT_JUMP_NEGATIVE104# CHECK: qc.e.j {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>105 qc.e.j undef106# CHECK: qc.e.j {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>107# CHECK: R_RISCV_CUSTOM195 undef108 109 qc.e.jal NEAR110# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR>111 qc.e.jal NEAR_NEGATIVE112# CHECK: c.jal {{0x[0-9a-f]+}} <NEAR_NEGATIVE>113 qc.e.jal FAR_JUMP114# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP>115 qc.e.jal FAR_JUMP_NEGATIVE116# CHECK: jal ra, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>117 qc.e.jal EXT_JUMP118# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP>119 qc.e.jal EXT_JUMP_NEGATIVE120# CHECK: qc.e.jal {{0x[0-9a-f]+}} <EXT_JUMP_NEGATIVE>121 qc.e.jal undef122# CHECK: qc.e.jal {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>123# CHECK: R_RISCV_CUSTOM195 undef124 125 126 127 jal t1, NEAR128# CHECK: jal t1, {{0x[0-9a-f]+}} <NEAR>129 jal t1, NEAR_NEGATIVE130# CHECK: jal t1, {{0x[0-9a-f]+}} <NEAR_NEGATIVE>131 jal t1, FAR_JUMP132# CHECK: jal t1, {{0x[0-9a-f]+}} <FAR_JUMP>133 jal t1, FAR_JUMP_NEGATIVE134# CHECK: jal t1, {{0x[0-9a-f]+}} <FAR_JUMP_NEGATIVE>135 136## The two cases with EXT_JUMP and EXT_JUMP_NEGATIVE are137## in fail.s, below.138 139 jal t1, undef140# CHECK: jal t1, {{0x[0-9a-f]+}} <start+{{0x[0-9a-f]+}}>141# CHECK: R_RISCV_JAL undef142 143 144NEAR:145 c.nop146.space 0x1000147FAR_JUMP:148 c.nop149.space 0x100000150EXT_JUMP:151 c.nop152 153 154#--- fail.s155 156 157EXT_JUMP_NEGATIVE:158 c.nop159.space 0x100000160.space 0x1000161 162 jal t1, EXT_JUMP163# ERROR: [[@LINE-1]]:11: error: fixup value out of range164 jal t1, EXT_JUMP_NEGATIVE165# ERROR: [[@LINE-1]]:11: error: fixup value out of range166 167.space 0x1000168.space 0x100000169EXT_JUMP:170 c.nop171