@@ -7296,6 +7296,17 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
72967296 case OP_XONES :
72977297 amd64_sse_pcmpeqb_reg_reg (code , ins -> dreg , ins -> dreg );
72987298 break ;
7299+ case OP_XCONST : {
7300+ if (cfg -> compile_aot && cfg -> code_exec_only ) {
7301+ mono_add_patch_info (cfg , offset , MONO_PATCH_INFO_X128_GOT , ins -> inst_p0 );
7302+ amd64_mov_reg_membase (code , AMD64_R11 , AMD64_RIP , 0 , sizeof (gpointer ));
7303+ amd64_sse_movups_reg_membase (code , ins -> dreg , AMD64_R11 , 0 );
7304+ } else {
7305+ mono_add_patch_info (cfg , offset , MONO_PATCH_INFO_X128 , ins -> inst_p0 );
7306+ amd64_sse_movups_reg_membase (code , ins -> dreg , AMD64_RIP , 0 );
7307+ }
7308+ break ;
7309+ }
72997310 case OP_ICONV_TO_R4_RAW :
73007311 amd64_movd_xreg_reg_size (code , ins -> dreg , ins -> sreg1 , 4 );
73017312 if (!cfg -> r4fp )
@@ -8140,11 +8151,13 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
81408151 for (patch_info = cfg -> patch_info ; patch_info ; patch_info = patch_info -> next ) {
81418152 if (patch_info -> type == MONO_PATCH_INFO_EXC )
81428153 code_size += 40 ;
8143- if (patch_info -> type == MONO_PATCH_INFO_R8 )
8154+ else if (patch_info -> type == MONO_PATCH_INFO_X128 )
8155+ code_size += 16 + 15 ; /* sizeof (Vector128<T>) + alignment */
8156+ else if (patch_info -> type == MONO_PATCH_INFO_R8 )
81448157 code_size += 8 + 15 ; /* sizeof (double) + alignment */
8145- if (patch_info -> type == MONO_PATCH_INFO_R4 )
8158+ else if (patch_info -> type == MONO_PATCH_INFO_R4 )
81468159 code_size += 4 + 15 ; /* sizeof (float) + alignment */
8147- if (patch_info -> type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR )
8160+ else if (patch_info -> type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR )
81488161 code_size += 8 + 7 ; /*sizeof (void*) + alignment */
81498162 }
81508163
@@ -8218,6 +8231,10 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
82188231 guint8 * pos , * patch_pos ;
82198232 guint32 target_pos ;
82208233
8234+ // FIXME: R8 and R4 only need 8 and 4 byte alignment, respectively
8235+ // They should be handled separately with anything needing 16 byte
8236+ // alignment using X128
8237+
82218238 /* The SSE opcodes require a 16 byte alignment */
82228239 code = (guint8 * )ALIGN_TO (code , 16 );
82238240
@@ -8244,6 +8261,31 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
82448261 remove = TRUE;
82458262 break ;
82468263 }
8264+ case MONO_PATCH_INFO_X128 : {
8265+ guint8 * pos , * patch_pos ;
8266+ guint32 target_pos ;
8267+
8268+ /* The SSE opcodes require a 16 byte alignment */
8269+ code = (guint8 * )ALIGN_TO (code , 16 );
8270+
8271+ pos = cfg -> native_code + patch_info -> ip .i ;
8272+ if (IS_REX (pos [0 ])) {
8273+ patch_pos = pos + 4 ;
8274+ target_pos = GPTRDIFF_TO_UINT32 (code - pos - 8 );
8275+ }
8276+ else {
8277+ patch_pos = pos + 3 ;
8278+ target_pos = GPTRDIFF_TO_UINT32 (code - pos - 7 );
8279+ }
8280+
8281+ memcpy (code , patch_info -> data .target , 16 );
8282+ code += 16 ;
8283+
8284+ * (guint32 * )(patch_pos ) = target_pos ;
8285+
8286+ remove = TRUE;
8287+ break ;
8288+ }
82478289 case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR : {
82488290 guint8 * pos ;
82498291
0 commit comments