1248 case base_plus_offset: {
1249 if (_offset == 0 && _base == r) // it's a nop
1250 break;
1251 if (_offset > 0)
1252 __ add(r, _base, _offset);
1253 else
1254 __ sub(r, _base, -_offset);
1255 break;
1256 }
1257 case base_plus_offset_reg: {
1258 __ add(r, _base, _index, _ext.op(), MAX(_ext.shift(), 0));
1259 break;
1260 }
1261 case literal: {
1262 if (rtype == relocInfo::none)
1263 __ mov(r, target());
1264 else
1265 __ movptr(r, (uint64_t)target());
1266 break;
1267 }
1268 default:
1269 ShouldNotReachHere();
1270 }
1271 }
1272
1273 void Assembler::adrp(Register reg1, const Address &dest, unsigned long &byte_offset) {
1274 ShouldNotReachHere();
1275 }
1276
1277 #undef __
1278
1279 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
1280
1281 void Assembler::adr(Register Rd, address adr) {
1282 long offset = adr - pc();
1283 int offset_lo = offset & 3;
1284 offset >>= 2;
1285 starti;
1286 f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
1287 rf(Rd, 0);
|
1248 case base_plus_offset: {
1249 if (_offset == 0 && _base == r) // it's a nop
1250 break;
1251 if (_offset > 0)
1252 __ add(r, _base, _offset);
1253 else
1254 __ sub(r, _base, -_offset);
1255 break;
1256 }
1257 case base_plus_offset_reg: {
1258 __ add(r, _base, _index, _ext.op(), MAX(_ext.shift(), 0));
1259 break;
1260 }
1261 case literal: {
1262 if (rtype == relocInfo::none)
1263 __ mov(r, target());
1264 else
1265 __ movptr(r, (uint64_t)target());
1266 break;
1267 }
1268 case post: {
1269 // Post-indexed, just copy the contents of the register. Offset added afterwards.
1270 if (_base == r) // it's a nop
1271 break;
1272 __ mov(r, _base);
1273 break;
1274 }
1275 default:
1276 ShouldNotReachHere();
1277 }
1278 }
1279
1280 void Assembler::adrp(Register reg1, const Address &dest, unsigned long &byte_offset) {
1281 ShouldNotReachHere();
1282 }
1283
1284 #undef __
1285
1286 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
1287
1288 void Assembler::adr(Register Rd, address adr) {
1289 long offset = adr - pc();
1290 int offset_lo = offset & 3;
1291 offset >>= 2;
1292 starti;
1293 f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
1294 rf(Rd, 0);
|