ARM: VIXL32: Implement VIXL-based assembler.

This patch introduces new ARM assembler (Thumb2) based on VIXL and
ARM VIXL JNI Macro Assembler. Both are turned off by default (JNI
one will be turned on in the following patch).

Change-Id: I5f7eb35da5318d7170b3c7e8553364ebe29cc991
diff --git a/compiler/utils/assembler_thumb_test_expected.cc.inc b/compiler/utils/assembler_thumb_test_expected.cc.inc
index 6736015..81c6ec5 100644
--- a/compiler/utils/assembler_thumb_test_expected.cc.inc
+++ b/compiler/utils/assembler_thumb_test_expected.cc.inc
@@ -5468,6 +5468,199 @@
   nullptr
 };
 
+const char* const VixlJniHelpersResults[] = {
+  "   0:  e92d 4de0   stmdb sp!, {r5, r6, r7, r8, sl, fp, lr}\n",
+  "   4:  ed2d 8a10   vpush {s16-s31}\n",
+  "   8:  b089        sub sp, #36 ; 0x24\n",
+  "   a:  9000        str r0, [sp, #0]\n",
+  "   c:  9121        str r1, [sp, #132]  ; 0x84\n",
+  "   e:  ed8d 0a22   vstr  s0, [sp, #136]  ; 0x88\n",
+  "  12:  9223        str r2, [sp, #140]  ; 0x8c\n",
+  "  14:  9324        str r3, [sp, #144]  ; 0x90\n",
+  "  16:  b088        sub sp, #32\n",
+  "  18:  f5ad 5d80   sub.w sp, sp, #4096 ; 0x1000\n",
+  "  1c:  9808        ldr r0, [sp, #32]\n",
+  "  1e:  981f        ldr r0, [sp, #124]  ; 0x7c\n",
+  "  20:  9821        ldr r0, [sp, #132]  ; 0x84\n",
+  "  22:  98ff        ldr r0, [sp, #1020] ; 0x3fc\n",
+  "  24:  f8dd 0400   ldr.w r0, [sp, #1024] ; 0x400\n",
+  "  28:  f8dd cffc   ldr.w ip, [sp, #4092] ; 0xffc\n",
+  "  2c:  f50d 5c80   add.w ip, sp, #4096 ; 0x1000\n",
+  "  30:  f8dc c000   ldr.w ip, [ip]\n",
+  "  34:  f8d9 c200   ldr.w ip, [r9, #512]  ; 0x200\n",
+  "  38:  f8dc 0080   ldr.w r0, [ip, #128]  ; 0x80\n",
+  "  3c:  9008        str r0, [sp, #32]\n",
+  "  3e:  901f        str r0, [sp, #124]  ; 0x7c\n",
+  "  40:  9021        str r0, [sp, #132]  ; 0x84\n",
+  "  42:  90ff        str r0, [sp, #1020] ; 0x3fc\n",
+  "  44:  f8cd 0400   str.w r0, [sp, #1024] ; 0x400\n",
+  "  48:  f8cd cffc   str.w ip, [sp, #4092] ; 0xffc\n",
+  "  4c:  f84d 5d04   str.w r5, [sp, #-4]!\n",
+  "  50:  f50d 5580   add.w r5, sp, #4096 ; 0x1000\n",
+  "  54:  f8c5 c004   str.w ip, [r5, #4]\n",
+  "  58:  f85d 5b04   ldr.w r5, [sp], #4\n",
+  "  5c:  f04f 0cff   mov.w ip, #255  ; 0xff\n",
+  "  60:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  64:  f06f 4c7f   mvn.w ip, #4278190080 ; 0xff000000\n",
+  "  68:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  6c:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  70:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  74:  900c        str r0, [sp, #48] ; 0x30\n",
+  "  76:  f8dd c030   ldr.w ip, [sp, #48] ; 0x30\n",
+  "  7a:  f8cd c034   str.w ip, [sp, #52] ; 0x34\n",
+  "  7e:  f50d 5c80   add.w ip, sp, #4096 ; 0x1000\n",
+  "  82:  f8c9 c200   str.w ip, [r9, #512]  ; 0x200\n",
+  "  86:  f8c9 d200   str.w sp, [r9, #512]  ; 0x200\n",
+  "  8a:  f8d0 c030   ldr.w ip, [r0, #48] ; 0x30\n",
+  "  8e:  47e0        blx ip\n",
+  "  90:  f8dd c02c   ldr.w ip, [sp, #44] ; 0x2c\n",
+  "  94:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  98:  f8d9 c200   ldr.w ip, [r9, #512]  ; 0x200\n",
+  "  9c:  f8cd c02c   str.w ip, [sp, #44] ; 0x2c\n",
+  "  a0:  f8dd c02c   ldr.w ip, [sp, #44] ; 0x2c\n",
+  "  a4:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  a8:  4648        mov r0, r9\n",
+  "  aa:  f8cd 9030   str.w r9, [sp, #48] ; 0x30\n",
+  "  ae:  4684        mov ip, r0\n",
+  "  b0:  f1bc 0f00   cmp.w ip, #0\n",
+  "  b4:  bf18        it  ne\n",
+  "  b6:  f10d 0c30   addne.w ip, sp, #48 ; 0x30\n",
+  "  ba:  f10d 0c30   add.w ip, sp, #48 ; 0x30\n",
+  "  be:  f1bc 0f00   cmp.w ip, #0\n",
+  "  c2:  bf0c        ite eq\n",
+  "  c4:  2000        moveq r0, #0\n",
+  "  c6:  a80c        addne r0, sp, #48 ; 0x30\n",
+  "  c8:  f8dd c040   ldr.w ip, [sp, #64] ; 0x40\n",
+  "  cc:  f1bc 0f00   cmp.w ip, #0\n",
+  "  d0:  bf18        it  ne\n",
+  "  d2:  f10d 0c40   addne.w ip, sp, #64 ; 0x40\n",
+  "  d6:  f8cd c030   str.w ip, [sp, #48] ; 0x30\n",
+  "  da:  f1bc 0f00   cmp.w ip, #0\n",
+  "  de:  bf0c        ite eq\n",
+  "  e0:  2000        moveq r0, #0\n",
+  "  e2:  4668        movne r0, sp\n",
+  "  e4:  f1bc 0f00   cmp.w ip, #0\n",
+  "  e8:  bf0c        ite eq\n",
+  "  ea:  2000        moveq r0, #0\n",
+  "  ec:  f20d 4001   addwne  r0, sp, #1025 ; 0x401\n",
+  "  f0:  f1bc 0f00   cmp.w ip, #0\n",
+  "  f4:  bf18        it  ne\n",
+  "  f6:  f20d 4c01   addwne  ip, sp, #1025 ; 0x401\n",
+  "  fa:  f8d9 c084   ldr.w ip, [r9, #132]  ; 0x84\n",
+  "  fe:  f1bc 0f00   cmp.w ip, #0\n",
+  " 102:  d107        bne.n 114 <VixlJniHelpers+0x114>\n",
+  " 104:  f50d 5d80   add.w sp, sp, #4096 ; 0x1000\n",
+  " 108:  b008        add sp, #32\n",
+  " 10a:  b009        add sp, #36 ; 0x24\n",
+  " 10c:  ecbd 8a10   vpop  {s16-s31}\n",
+  " 110:  e8bd 8de0   ldmia.w sp!, {r5, r6, r7, r8, sl, fp, pc}\n",
+  " 114:  4660        mov r0, ip\n",
+  " 116:  f8d9 c2ac   ldr.w ip, [r9, #684]  ; 0x2ac\n",
+  " 11a:  47e0        blx ip\n",
+  nullptr
+};
+
+const char* const VixlLoadFromOffsetResults[] = {
+  "   0:  68e2        ldr r2, [r4, #12]\n",
+  "   2:  f8d4 2fff   ldr.w r2, [r4, #4095] ; 0xfff\n",
+  "   6:  f504 5280   add.w r2, r4, #4096 ; 0x1000\n",
+  "   a:  6812        ldr r2, [r2, #0]\n",
+  "   c:  f504 1280   add.w r2, r4, #1048576  ; 0x100000\n",
+  "  10:  f8d2 20a4   ldr.w r2, [r2, #164]  ; 0xa4\n",
+  "  14:  f44f 5280   mov.w r2, #4096 ; 0x1000\n",
+  "  18:  f2c0 0210   movt  r2, #16\n",
+  "  1c:  4422        add r2, r4\n",
+  "  1e:  6812        ldr r2, [r2, #0]\n",
+  "  20:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  24:  f2c0 0c10   movt  ip, #16\n",
+  "  28:  4464        add r4, ip\n",
+  "  2a:  6824        ldr r4, [r4, #0]\n",
+  "  2c:  89a2        ldrh  r2, [r4, #12]\n",
+  "  2e:  f8b4 2fff   ldrh.w  r2, [r4, #4095] ; 0xfff\n",
+  "  32:  f504 5280   add.w r2, r4, #4096 ; 0x1000\n",
+  "  36:  8812        ldrh  r2, [r2, #0]\n",
+  "  38:  f504 1280   add.w r2, r4, #1048576  ; 0x100000\n",
+  "  3c:  f8b2 20a4   ldrh.w  r2, [r2, #164]  ; 0xa4\n",
+  "  40:  f44f 5280   mov.w r2, #4096 ; 0x1000\n",
+  "  44:  f2c0 0210   movt  r2, #16\n",
+  "  48:  4422        add r2, r4\n",
+  "  4a:  8812        ldrh  r2, [r2, #0]\n",
+  "  4c:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  50:  f2c0 0c10   movt  ip, #16\n",
+  "  54:  4464        add r4, ip\n",
+  "  56:  8824        ldrh  r4, [r4, #0]\n",
+  "  58:  e9d4 2303   ldrd  r2, r3, [r4, #12]\n",
+  "  5c:  e9d4 23ff   ldrd  r2, r3, [r4, #1020] ; 0x3fc\n",
+  "  60:  f504 6280   add.w r2, r4, #1024 ; 0x400\n",
+  "  64:  e9d2 2300   ldrd  r2, r3, [r2]\n",
+  "  68:  f504 2280   add.w r2, r4, #262144 ; 0x40000\n",
+  "  6c:  e9d2 2329   ldrd  r2, r3, [r2, #164]  ; 0xa4\n",
+  "  70:  f44f 6280   mov.w r2, #1024 ; 0x400\n",
+  "  74:  f2c0 0204   movt  r2, #4\n",
+  "  78:  4422        add r2, r4\n",
+  "  7a:  e9d2 2300   ldrd  r2, r3, [r2]\n",
+  "  7e:  f44f 6c80   mov.w ip, #1024 ; 0x400\n",
+  "  82:  f2c0 0c04   movt  ip, #4\n",
+  "  86:  4464        add r4, ip\n",
+  "  88:  e9d4 4500   ldrd  r4, r5, [r4]\n",
+  "  8c:  f8dc 000c   ldr.w r0, [ip, #12]\n",
+  "  90:  f5a4 1280   sub.w r2, r4, #1048576  ; 0x100000\n",
+  "  94:  f8d2 20a4   ldr.w r2, [r2, #164]  ; 0xa4\n",
+  "  98:  f994 200c   ldrsb.w r2, [r4, #12]\n",
+  "  9c:  7b22        ldrb  r2, [r4, #12]\n",
+  "  9e:  f9b4 200c   ldrsh.w r2, [r4, #12]\n",
+  nullptr
+};
+const char* const VixlStoreToOffsetResults[] = {
+  "   0:  60e2        str r2, [r4, #12]\n",
+  "   2:  f8c4 2fff   str.w r2, [r4, #4095] ; 0xfff\n",
+  "   6:  f504 5c80   add.w ip, r4, #4096 ; 0x1000\n",
+  "   a:  f8cc 2000   str.w r2, [ip]\n",
+  "   e:  f504 1c80   add.w ip, r4, #1048576  ; 0x100000\n",
+  "  12:  f8cc 20a4   str.w r2, [ip, #164]  ; 0xa4\n",
+  "  16:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  1a:  f2c0 0c10   movt  ip, #16\n",
+  "  1e:  44a4        add ip, r4\n",
+  "  20:  f8cc 2000   str.w r2, [ip]\n",
+  "  24:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  28:  f2c0 0c10   movt  ip, #16\n",
+  "  2c:  44a4        add ip, r4\n",
+  "  2e:  f8cc 4000   str.w r4, [ip]\n",
+  "  32:  81a2        strh  r2, [r4, #12]\n",
+  "  34:  f8a4 2fff   strh.w  r2, [r4, #4095] ; 0xfff\n",
+  "  38:  f504 5c80   add.w ip, r4, #4096 ; 0x1000\n",
+  "  3c:  f8ac 2000   strh.w  r2, [ip]\n",
+  "  40:  f504 1c80   add.w ip, r4, #1048576  ; 0x100000\n",
+  "  44:  f8ac 20a4   strh.w  r2, [ip, #164]  ; 0xa4\n",
+  "  48:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  4c:  f2c0 0c10   movt  ip, #16\n",
+  "  50:  44a4        add ip, r4\n",
+  "  52:  f8ac 2000   strh.w  r2, [ip]\n",
+  "  56:  f44f 5c80   mov.w ip, #4096 ; 0x1000\n",
+  "  5a:  f2c0 0c10   movt  ip, #16\n",
+  "  5e:  44a4        add ip, r4\n",
+  "  60:  f8ac 4000   strh.w  r4, [ip]\n",
+  "  64:  e9c4 2303   strd  r2, r3, [r4, #12]\n",
+  "  68:  e9c4 23ff   strd  r2, r3, [r4, #1020] ; 0x3fc\n",
+  "  6c:  f504 6c80   add.w ip, r4, #1024 ; 0x400\n",
+  "  70:  e9cc 2300   strd  r2, r3, [ip]\n",
+  "  74:  f504 2c80   add.w ip, r4, #262144 ; 0x40000\n",
+  "  78:  e9cc 2329   strd  r2, r3, [ip, #164]  ; 0xa4\n",
+  "  7c:  f44f 6c80   mov.w ip, #1024 ; 0x400\n",
+  "  80:  f2c0 0c04   movt  ip, #4\n",
+  "  84:  44a4        add ip, r4\n",
+  "  86:  e9cc 2300   strd  r2, r3, [ip]\n",
+  "  8a:  f44f 6c80   mov.w ip, #1024 ; 0x400\n",
+  "  8e:  f2c0 0c04   movt  ip, #4\n",
+  "  92:  44a4        add ip, r4\n",
+  "  94:  e9cc 4500   strd  r4, r5, [ip]\n",
+  "  98:  f8cc 000c   str.w r0, [ip, #12]\n",
+  "  9c:  f5a4 1c80   sub.w ip, r4, #1048576  ; 0x100000\n",
+  "  a0:  f8cc 20a4   str.w r2, [ip, #164]  ; 0xa4\n",
+  "  a4:  7322        strb  r2, [r4, #12]\n",
+  nullptr
+};
+
 std::map<std::string, const char* const*> test_results;
 void setup_results() {
     test_results["SimpleMov"] = SimpleMovResults;
@@ -5520,4 +5713,7 @@
     test_results["CompareAndBranch"] = CompareAndBranchResults;
     test_results["AddConstant"] = AddConstantResults;
     test_results["CmpConstant"] = CmpConstantResults;
+    test_results["VixlJniHelpers"] = VixlJniHelpersResults;
+    test_results["VixlStoreToOffset"] = VixlStoreToOffsetResults;
+    test_results["VixlLoadFromOffset"] = VixlLoadFromOffsetResults;
 }