1 define(choose, `loadStore($1, &MacroAssembler::$3, $2, $4,
   2                $5, $6, $7, $8);dnl
   3 
   4   %}')dnl
   5 define(access, `
   6     $3Register $1_reg = as_$3Register($$1$$reg);
   7     $4choose(MacroAssembler(&cbuf), $1_reg,$2,$mem->opcode(),
   8         as_Register($mem$$base),$mem$$index,$mem$$scale,$mem$$disp)')dnl
   9 define(load,`
  10   enc_class aarch64_enc_$2($1 dst, memory mem) %{dnl
  11 access(dst,$2,$3)')dnl
  12 load(iRegI,ldrsbw)
  13 load(iRegI,ldrsb)
  14 load(iRegI,ldrb)
  15 load(iRegL,ldrb)
  16 load(iRegI,ldrshw)
  17 load(iRegI,ldrsh)
  18 load(iRegI,ldrh)
  19 load(iRegL,ldrh)
  20 load(iRegI,ldrw)
  21 load(iRegL,ldrw)
  22 load(iRegL,ldrsw)
  23 load(iRegL,ldr)
  24 load(vRegF,ldrs,Float)
  25 load(vRegD,ldrd,Float)
  26 define(STORE,`
  27   enc_class aarch64_enc_$2($1 src, memory mem) %{dnl
  28 access(src,$2,$3,$4)')dnl
  29 define(STORE0,`
  30   enc_class aarch64_enc_$2`'0(memory mem) %{
  31     MacroAssembler _masm(&cbuf);
  32     choose(_masm,zr,$2,$mem->opcode(),
  33         as_$3Register($mem$$base),$mem$$index,$mem$$scale,$mem$$disp)')dnl
  34 STORE(iRegI,strb)
  35 STORE0(iRegI,strb)
  36 STORE(iRegI,strh)
  37 STORE0(iRegI,strh)
  38 STORE(iRegI,strw)
  39 STORE0(iRegI,strw)
  40 STORE(iRegL,str,,
  41 `// we sometimes get asked to store the stack pointer into the
  42     // current thread -- we cannot do that directly on AArch64
  43     if (src_reg == r31_sp) {
  44       MacroAssembler _masm(&cbuf);
  45       assert(as_Register($mem$$base) == rthread, "unexpected store for sp");
  46       __ mov(rscratch2, sp);
  47       src_reg = rscratch2;
  48     }
  49     ')
  50 STORE0(iRegL,str)
  51 STORE(vRegF,strs,Float)
  52 STORE(vRegD,strd,Float)
  53 
  54   enc_class aarch64_enc_strw_immn(immN src, memory mem) %{
  55     MacroAssembler _masm(&cbuf);
  56     address con = (address)$src$$constant;
  57     // need to do this the hard way until we can manage relocs
  58     // for 32 bit constants
  59     __ movoop(rscratch2, (jobject)con);
  60     if (con) __ encode_heap_oop_not_null(rscratch2);
  61     choose(_masm,rscratch2,strw,$mem->opcode(),
  62         as_Register($mem$$base),$mem$$index,$mem$$scale,$mem$$disp)
  63 
  64   enc_class aarch64_enc_strw_immnk(immN src, memory mem) %{
  65     MacroAssembler _masm(&cbuf);
  66     address con = (address)$src$$constant;
  67     // need to do this the hard way until we can manage relocs
  68     // for 32 bit constants
  69     __ movoop(rscratch2, (jobject)con);
  70     __ encode_klass_not_null(rscratch2);
  71     choose(_masm,rscratch2,strw,$mem->opcode(),
  72         as_Register($mem$$base),$mem$$index,$mem$$scale,$mem$$disp)
  73