Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/mono/arch/arm/arm-codegen.h b/mono/arch/arm/arm-codegen.h
- index e7dc99f..2460fc4 100644
- --- a/mono/arch/arm/arm-codegen.h
- +++ b/mono/arch/arm/arm-codegen.h
- @@ -1084,6 +1084,16 @@ typedef union {
- #define ARM_MOVT_REG_IMM_COND(p, rd, imm16, cond) ARM_EMIT(p, (((cond) << 28) | (3 << 24) | (4 << 20) | ((((guint32)(imm16)) >> 12) << 16) | ((rd) << 12) | (((guint32)(imm16)) & 0xfff)))
- #define ARM_MOVT_REG_IMM(p, rd, imm16) ARM_MOVT_REG_IMM_COND ((p), (rd), (imm16), ARMCOND_AL)
- +/* MCR */
- +#define ARM_DEF_MCR_COND(coproc, opc1, rt, crn, crm, opc2, cond) \
- + ARM_DEF_COND ((cond)) | ((0xe << 24) | (((opc1) & 0x7) << 21) | (0 << 20) | (((crn) & 0xf) << 16) | (((rt) & 0xf) << 12) | (((coproc) & 0xf) << 8) | (((opc2) & 0x7) << 5) | (1 << 4) | (((crm) & 0xf) << 0))
- +
- +#define ARM_MCR_COND(p, coproc, opc1, rt, crn, crm, opc2, cond) \
- + ARM_EMIT(p, ARM_DEF_MCR_COND ((coproc), (opc1), (rt), (crn), (crm), (opc2), (cond)))
- +
- +#define ARM_MCR(p, coproc, opc1, rt, crn, crm, opc2) \
- + ARM_MCR_COND ((p), (coproc), (opc1), (rt), (crn), (crm), (opc2), ARMCOND_AL)
- +
- #ifdef __cplusplus
- }
- #endif
- diff --git a/mono/mini/cpu-arm.md b/mono/mini/cpu-arm.md
- index 1b253dd..3894753 100644
- --- a/mono/mini/cpu-arm.md
- +++ b/mono/mini/cpu-arm.md
- @@ -46,7 +46,7 @@
- #
- # See the code in mini-x86.c for more details on how the specifiers are used.
- #
- -memory_barrier: len:4
- +memory_barrier: len:8 clob:a
- nop: len:4
- relaxed_nop: len:4
- break: len:4
- diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c
- index c42bb50..72d84aa 100644
- --- a/mono/mini/mini-arm.c
- +++ b/mono/mini/mini-arm.c
- @@ -3257,6 +3257,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
- switch (ins->opcode) {
- case OP_MEMORY_BARRIER:
- + ARM_MOV_REG_IMM8 (code, ARMREG_R0, 0);
- + ARM_MCR (code, 15, 0, ARMREG_R0, 7, 10, 5);
- break;
- case OP_TLS_GET:
- #ifdef HAVE_AEABI_READ_TP
- diff --git a/mono/utils/mono-membar.h b/mono/utils/mono-membar.h
- index 13ed6e7..1c343b0 100644
- --- a/mono/utils/mono-membar.h
- +++ b/mono/utils/mono-membar.h
- @@ -129,7 +129,7 @@ static inline void mono_memory_write_barrier (void)
- #elif defined(__arm__)
- static inline void mono_memory_barrier (void)
- {
- - __asm__ __volatile__ ("" : : : "memory");
- + __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory");
- }
- static inline void mono_memory_read_barrier (void)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement