Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. diff --git a/mono/arch/arm/arm-codegen.h b/mono/arch/arm/arm-codegen.h
  2. index e7dc99f..2460fc4 100644
  3. --- a/mono/arch/arm/arm-codegen.h
  4. +++ b/mono/arch/arm/arm-codegen.h
  5. @@ -1084,6 +1084,16 @@ typedef union {
  6. #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)))
  7. #define ARM_MOVT_REG_IMM(p, rd, imm16) ARM_MOVT_REG_IMM_COND ((p), (rd), (imm16), ARMCOND_AL)
  8.  
  9. +/* MCR */
  10. +#define ARM_DEF_MCR_COND(coproc, opc1, rt, crn, crm, opc2, cond) \
  11. + 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))
  12. +
  13. +#define ARM_MCR_COND(p, coproc, opc1, rt, crn, crm, opc2, cond) \
  14. + ARM_EMIT(p, ARM_DEF_MCR_COND ((coproc), (opc1), (rt), (crn), (crm), (opc2), (cond)))
  15. +
  16. +#define ARM_MCR(p, coproc, opc1, rt, crn, crm, opc2) \
  17. + ARM_MCR_COND ((p), (coproc), (opc1), (rt), (crn), (crm), (opc2), ARMCOND_AL)
  18. +
  19. #ifdef __cplusplus
  20. }
  21. #endif
  22. diff --git a/mono/mini/cpu-arm.md b/mono/mini/cpu-arm.md
  23. index 1b253dd..3894753 100644
  24. --- a/mono/mini/cpu-arm.md
  25. +++ b/mono/mini/cpu-arm.md
  26. @@ -46,7 +46,7 @@
  27. #
  28. # See the code in mini-x86.c for more details on how the specifiers are used.
  29. #
  30. -memory_barrier: len:4
  31. +memory_barrier: len:8 clob:a
  32. nop: len:4
  33. relaxed_nop: len:4
  34. break: len:4
  35. diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c
  36. index c42bb50..72d84aa 100644
  37. --- a/mono/mini/mini-arm.c
  38. +++ b/mono/mini/mini-arm.c
  39. @@ -3257,6 +3257,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
  40.  
  41. switch (ins->opcode) {
  42. case OP_MEMORY_BARRIER:
  43. + ARM_MOV_REG_IMM8 (code, ARMREG_R0, 0);
  44. + ARM_MCR (code, 15, 0, ARMREG_R0, 7, 10, 5);
  45. break;
  46. case OP_TLS_GET:
  47. #ifdef HAVE_AEABI_READ_TP
  48. diff --git a/mono/utils/mono-membar.h b/mono/utils/mono-membar.h
  49. index 13ed6e7..1c343b0 100644
  50. --- a/mono/utils/mono-membar.h
  51. +++ b/mono/utils/mono-membar.h
  52. @@ -129,7 +129,7 @@ static inline void mono_memory_write_barrier (void)
  53. #elif defined(__arm__)
  54. static inline void mono_memory_barrier (void)
  55. {
  56. - __asm__ __volatile__ ("" : : : "memory");
  57. + __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory");
  58. }
  59.  
  60. static inline void mono_memory_read_barrier (void)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement