@@ -150,6 +150,22 @@ MCCodeEmitter *llvm::createXtensaMCCodeEmitter(const MCInstrInfo &MCII,
150
150
return new XtensaMCCodeEmitter (MCII, Ctx, true );
151
151
}
152
152
153
+ static void addFixup (SmallVectorImpl<MCFixup> &Fixups, uint32_t Offset,
154
+ const MCExpr *Value, uint16_t Kind) {
155
+ bool PCRel = false ;
156
+ switch (Kind) {
157
+ case Xtensa::fixup_xtensa_branch_6:
158
+ case Xtensa::fixup_xtensa_branch_8:
159
+ case Xtensa::fixup_xtensa_branch_12:
160
+ case Xtensa::fixup_xtensa_jump_18:
161
+ case Xtensa::fixup_xtensa_call_18:
162
+ case Xtensa::fixup_xtensa_l32r_16:
163
+ case Xtensa::fixup_xtensa_loop_8:
164
+ PCRel = true ;
165
+ }
166
+ Fixups.push_back (MCFixup::create (Offset, Value, Kind, PCRel));
167
+ }
168
+
153
169
void XtensaMCCodeEmitter::encodeInstruction (const MCInst &MI,
154
170
SmallVectorImpl<char > &CB,
155
171
SmallVectorImpl<MCFixup> &Fixups,
@@ -195,8 +211,7 @@ XtensaMCCodeEmitter::getJumpTargetEncoding(const MCInst &MI, unsigned int OpNum,
195
211
return MO.getImm ();
196
212
197
213
const MCExpr *Expr = MO.getExpr ();
198
- Fixups.push_back (
199
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_jump_18)));
214
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_jump_18);
200
215
return 0 ;
201
216
}
202
217
@@ -213,17 +228,14 @@ uint32_t XtensaMCCodeEmitter::getBranchTargetEncoding(
213
228
case Xtensa::BGEZ:
214
229
case Xtensa::BLTZ:
215
230
case Xtensa::BNEZ:
216
- Fixups.push_back (
217
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_branch_12)));
231
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_branch_12);
218
232
return 0 ;
219
233
case Xtensa::BEQZ_N:
220
234
case Xtensa::BNEZ_N:
221
- Fixups.push_back (
222
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_branch_6)));
235
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_branch_6);
223
236
return 0 ;
224
237
default :
225
- Fixups.push_back (
226
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_branch_8)));
238
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_branch_8);
227
239
return 0 ;
228
240
}
229
241
}
@@ -240,8 +252,7 @@ XtensaMCCodeEmitter::getLoopTargetEncoding(const MCInst &MI, unsigned int OpNum,
240
252
241
253
const MCExpr *Expr = MO.getExpr ();
242
254
243
- Fixups.push_back (
244
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_loop_8)));
255
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_loop_8);
245
256
return 0 ;
246
257
}
247
258
@@ -261,8 +272,7 @@ XtensaMCCodeEmitter::getCallEncoding(const MCInst &MI, unsigned int OpNum,
261
272
262
273
assert ((MO.isExpr ()) && " Unexpected operand value!" );
263
274
const MCExpr *Expr = MO.getExpr ();
264
- Fixups.push_back (
265
- MCFixup::create (0 , Expr, MCFixupKind (Xtensa::fixup_xtensa_call_18)));
275
+ addFixup (Fixups, 0 , Expr, Xtensa::fixup_xtensa_call_18);
266
276
return 0 ;
267
277
}
268
278
@@ -281,8 +291,7 @@ XtensaMCCodeEmitter::getL32RTargetEncoding(const MCInst &MI, unsigned OpNum,
281
291
282
292
assert ((MO.isExpr ()) && " Unexpected operand value!" );
283
293
284
- Fixups.push_back (MCFixup::create (0 , MO.getExpr (),
285
- MCFixupKind (Xtensa::fixup_xtensa_l32r_16)));
294
+ addFixup (Fixups, 0 , MO.getExpr (), Xtensa::fixup_xtensa_l32r_16);
286
295
return 0 ;
287
296
}
288
297
0 commit comments