[vm, compiler] Fix passing untagged pointer to store barrier check on ARM/ARM64.

Add missing store barrier check for RISCV.

TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/55754
Change-Id: I90156c5fbb9f49b26ef19319dde7899b512670d7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366894
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index c47a3e0..a20c382 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1825,6 +1825,9 @@
       __ Bind(&done);
     }  // kFieldReg = R1, kNullReg = R9
 
+    __ AddImmediate(AllocateObjectABI::kResultReg,
+                    AllocateObjectABI::kResultReg, kHeapObjectTag);
+
     // Store parameterized type.
     if (is_cls_parameterized) {
       Label not_parameterized_case;
@@ -1843,18 +1846,15 @@
                            host_type_arguments_field_offset_in_words_offset()));
 
       // Set the type arguments in the new object.
-      __ StoreIntoObjectNoBarrier(
-          AllocateObjectABI::kResultReg,
-          Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, LSL,
-                  target::kWordSizeLog2),
-          AllocateObjectABI::kTypeArgumentsReg);
+      __ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+             Operand(kTypeOffsetReg, LSL, target::kWordSizeLog2));
+      __ StoreIntoObjectNoBarrier(AllocateObjectABI::kResultReg,
+                                  FieldAddress(kTypeOffsetReg, 0),
+                                  AllocateObjectABI::kTypeArgumentsReg);
 
       __ Bind(&not_parameterized_case);
     }  // kClsIdReg = R1, kTypeOffsetReg = R9
 
-    __ AddImmediate(AllocateObjectABI::kResultReg,
-                    AllocateObjectABI::kResultReg, kHeapObjectTag);
-
     __ Ret();
 
     __ Bind(&slow_case);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 7782e13..71190d6 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -2146,6 +2146,9 @@
       __ WriteAllocationCanary(kNewTopReg);  // Fix overshoot.
     }  // kFieldReg = R4
 
+    __ AddImmediate(AllocateObjectABI::kResultReg,
+                    AllocateObjectABI::kResultReg, kHeapObjectTag);
+
     if (is_cls_parameterized) {
       Label not_parameterized_case;
 
@@ -2164,18 +2167,15 @@
           kFourBytes);
 
       // Set the type arguments in the new object.
+      __ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+             Operand(kTypeOffsetReg, LSL, target::kCompressedWordSizeLog2));
       __ StoreCompressedIntoObjectNoBarrier(
-          AllocateObjectABI::kResultReg,
-          Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, UXTX,
-                  Address::Scaled),
+          AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
           AllocateObjectABI::kTypeArgumentsReg);
 
       __ Bind(&not_parameterized_case);
     }  // kClsIdReg = R4, kTypeOffsetReg = R5
 
-    __ AddImmediate(AllocateObjectABI::kResultReg,
-                    AllocateObjectABI::kResultReg, kHeapObjectTag);
-
     __ ret();
 
     __ Bind(&slow_case);
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index 8af980b..b4b5f62 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -1927,6 +1927,9 @@
       __ WriteAllocationCanary(kNewTopReg);  // Fix overshoot.
     }  // kFieldReg = T4
 
+    __ AddImmediate(AllocateObjectABI::kResultReg,
+                    AllocateObjectABI::kResultReg, kHeapObjectTag);
+
     if (is_cls_parameterized) {
       Label not_parameterized_case;
 
@@ -1944,16 +1947,15 @@
                            host_type_arguments_field_offset_in_words_offset()));
 
       // Set the type arguments in the new object.
-      __ slli(kTypeOffsetReg, kTypeOffsetReg, target::kWordSizeLog2);
-      __ add(kTypeOffsetReg, kTypeOffsetReg, AllocateObjectABI::kResultReg);
-      __ sx(AllocateObjectABI::kTypeArgumentsReg, Address(kTypeOffsetReg, 0));
+      __ AddShifted(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+                    kTypeOffsetReg, target::kWordSizeLog2);
+      __ StoreCompressedIntoObjectNoBarrier(
+          AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
+          AllocateObjectABI::kTypeArgumentsReg);
 
       __ Bind(&not_parameterized_case);
     }  // kClsIdReg = R4, kTypeOffsetReg = R5
 
-    __ AddImmediate(AllocateObjectABI::kResultReg,
-                    AllocateObjectABI::kResultReg, kHeapObjectTag);
-
     __ ret();
 
     __ Bind(&slow_case);