@@ -90,85 +90,103 @@ void XtensaInstPrinter::printMemOperand(const MCInst *MI, int OpNum,
9090 printOperand (MI, OpNum + 1 , OS);
9191}
9292
93- void XtensaInstPrinter::printBranchTarget (const MCInst *MI, int OpNum ,
94- raw_ostream &OS ) {
93+ void XtensaInstPrinter::printBranchTarget (const MCInst *MI, uint64_t Address ,
94+ int OpNum, raw_ostream &O ) {
9595 const MCOperand &MC = MI->getOperand (OpNum);
9696 if (MI->getOperand (OpNum).isImm ()) {
9797 int64_t Val = MC.getImm () + 4 ;
98- OS << " . " ;
99- if (Val > 0 )
100- OS << ' +' ;
101- OS << Val;
98+ printPCRelImm (Address, Val, O);
10299 } else if (MC.isExpr ())
103- MC.getExpr ()->print (OS , &MAI);
100+ MC.getExpr ()->print (O , &MAI);
104101 else
105102 llvm_unreachable (" Invalid operand" );
106103}
107104
108- void XtensaInstPrinter::printLoopTarget (const MCInst *MI, int OpNum ,
109- raw_ostream &OS ) {
105+ void XtensaInstPrinter::printLoopTarget (const MCInst *MI, uint64_t Address ,
106+ int OpNum, raw_ostream &O ) {
110107 const MCOperand &MC = MI->getOperand (OpNum);
111108 if (MI->getOperand (OpNum).isImm ()) {
112109 int64_t Val = MC.getImm () + 4 ;
113- OS << " . " ;
114- if (Val > 0 )
115- OS << ' +' ;
116- OS << Val;
110+ printPCRelImm (Address, Val, O);
117111 } else if (MC.isExpr ())
118- MC.getExpr ()->print (OS , &MAI, true );
112+ MC.getExpr ()->print (O , &MAI, true );
119113 else
120114 llvm_unreachable (" Invalid operand" );
121115}
122116
123- void XtensaInstPrinter::printJumpTarget (const MCInst *MI, int OpNum ,
124- raw_ostream &OS ) {
117+ void XtensaInstPrinter::printJumpTarget (const MCInst *MI, uint64_t Address ,
118+ int OpNum, raw_ostream &O ) {
125119 const MCOperand &MC = MI->getOperand (OpNum);
126120 if (MC.isImm ()) {
127121 int64_t Val = MC.getImm () + 4 ;
128- OS << " . " ;
129- if (Val > 0 )
130- OS << ' +' ;
131- OS << Val;
122+ printPCRelImm (Address, Val, O);
132123 } else if (MC.isExpr ())
133- MC.getExpr ()->print (OS , &MAI);
124+ MC.getExpr ()->print (O , &MAI);
134125 else
135126 llvm_unreachable (" Invalid operand" );
136127 ;
137128}
138129
139- void XtensaInstPrinter::printCallOperand (const MCInst *MI, int OpNum ,
140- raw_ostream &OS ) {
130+ void XtensaInstPrinter::printCallOperand (const MCInst *MI, uint64_t Address ,
131+ int OpNum, raw_ostream &O ) {
141132 const MCOperand &MC = MI->getOperand (OpNum);
142133 if (MC.isImm ()) {
143134 int64_t Val = MC.getImm () + 4 ;
144- OS << " . " ;
145- if (Val > 0 )
146- OS << ' +' ;
147- OS << Val;
135+ if (PrintBranchImmAsAddress) {
136+ uint64_t Target = Address;
137+ Target &= ~0x3 ;
138+ Target += Val & (~0x3 );
139+ O << formatHex (Target);
140+ } else {
141+ O << " . " ;
142+ if (Val > 0 )
143+ O << ' +' ;
144+ O << Val;
145+ }
148146 } else if (MC.isExpr ())
149- MC.getExpr ()->print (OS , &MAI);
147+ MC.getExpr ()->print (O , &MAI);
150148 else
151149 llvm_unreachable (" Invalid operand" );
152150}
153151
154- void XtensaInstPrinter::printL32RTarget (const MCInst *MI, int OpNum ,
155- raw_ostream &O) {
152+ void XtensaInstPrinter::printL32RTarget (const MCInst *MI, uint64_t Address ,
153+ int OpNum, raw_ostream &O) {
156154 const MCOperand &MC = MI->getOperand (OpNum);
157155 if (MC.isImm ()) {
158156 int64_t Value = MI->getOperand (OpNum).getImm ();
159- int64_t InstrOff = Value & 0x3 ;
160- Value -= InstrOff;
161- assert ((Value >= -262144 && Value <= -4 ) &&
162- " Invalid argument, value must be in ranges [-262144,-4]" );
163- Value += ((InstrOff + 0x3 ) & 0x4 ) - InstrOff;
164- O << " . " ;
165- O << Value;
157+ if (PrintBranchImmAsAddress) {
158+ uint64_t Target = (Address + 0x3 ) & (~0x3 );
159+ Value &= ~0x3 ;
160+ Target += Value;
161+ O << formatHex (Target);
162+ } else {
163+ int64_t InstrOff = Value & 0x3 ;
164+ Value -= InstrOff;
165+ assert ((Value >= -262144 && Value <= -4 ) &&
166+ " Invalid argument, value must be in ranges [-262144,-4]" );
167+ Value += ((InstrOff + 0x3 ) & 0x4 ) - InstrOff;
168+ printPCRelImm (Address, Value, O);
169+ }
166170 } else if (MC.isExpr ())
167171 MC.getExpr ()->print (O, &MAI);
168172 else
169173 llvm_unreachable (" Invalid operand" );
170174}
171175
176+ void XtensaInstPrinter::printPCRelImm (uint64_t Address, int64_t Offset,
177+ raw_ostream &O) {
178+ if (PrintBranchImmAsAddress) {
179+ uint64_t Target = Address + Offset;
180+ Target &= 0xffffffff ;
181+ O << formatHex (Target);
182+ } else {
183+ O << " . " ;
184+ if (Offset > 0 )
185+ O << ' +' ;
186+ O << Offset;
187+ }
188+ }
189+
172190void XtensaInstPrinter::printImm8_AsmOperand (const MCInst *MI, int OpNum,
173191 raw_ostream &O) {
174192 if (MI->getOperand (OpNum).isImm ()) {
0 commit comments