mirror of
https://github.com/danog/ir.git
synced 2024-11-30 04:39:43 +01:00
Use ir_ctx.mflags for CPU specific code-generation options
'mflags' and ir_cpuinfo() return value have the same meaning.
This commit is contained in:
parent
d26099c5ac
commit
56b0dbccde
19
ir.h
19
ir.h
@ -482,9 +482,6 @@ void ir_strtab_free(ir_strtab *strtab);
|
|||||||
#define IR_GEN_NATIVE (1<<21)
|
#define IR_GEN_NATIVE (1<<21)
|
||||||
#define IR_GEN_C (1<<22)
|
#define IR_GEN_C (1<<22)
|
||||||
|
|
||||||
/* x86 related */
|
|
||||||
#define IR_AVX (1<<24)
|
|
||||||
|
|
||||||
/* Temporary: Live Ranges */
|
/* Temporary: Live Ranges */
|
||||||
#define IR_LR_HAVE_VARS (1<<25)
|
#define IR_LR_HAVE_VARS (1<<25)
|
||||||
#define IR_LR_HAVE_DESSA_MOVES (1<<26)
|
#define IR_LR_HAVE_DESSA_MOVES (1<<26)
|
||||||
@ -518,6 +515,7 @@ struct _ir_ctx {
|
|||||||
ir_ref consts_count; /* number of constants stored in constants buffer */
|
ir_ref consts_count; /* number of constants stored in constants buffer */
|
||||||
ir_ref consts_limit; /* size of allocated constants buffer (it's extended when overflow) */
|
ir_ref consts_limit; /* size of allocated constants buffer (it's extended when overflow) */
|
||||||
uint32_t flags; /* IR context flags (see IR_* defines above) */
|
uint32_t flags; /* IR context flags (see IR_* defines above) */
|
||||||
|
uint32_t mflags; /* CPU specific flags (see IR_X86_... macros below) */
|
||||||
ir_ref fold_cse_limit; /* CSE finds identical insns backward from "insn_count" to "fold_cse_limit" */
|
ir_ref fold_cse_limit; /* CSE finds identical insns backward from "insn_count" to "fold_cse_limit" */
|
||||||
ir_insn fold_insn; /* temporary storage for folding engine */
|
ir_insn fold_insn; /* temporary storage for folding engine */
|
||||||
ir_hashtab *binding;
|
ir_hashtab *binding;
|
||||||
@ -732,6 +730,19 @@ void ir_consistency_check(void);
|
|||||||
/* Code patching (implementation in ir_patch.c) */
|
/* Code patching (implementation in ir_patch.c) */
|
||||||
int ir_patch(const void *code, size_t size, uint32_t jmp_table_size, const void *from_addr, const void *to_addr);
|
int ir_patch(const void *code, size_t size, uint32_t jmp_table_size, const void *from_addr, const void *to_addr);
|
||||||
|
|
||||||
|
/* CPU information (implementation in ir_cpuinfo.c) */
|
||||||
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
|
# define IR_X86_SSE2 (1<<0)
|
||||||
|
# define IR_X86_SSE3 (1<<1)
|
||||||
|
# define IR_X86_SSSE3 (1<<2)
|
||||||
|
# define IR_X86_SSE41 (1<<3)
|
||||||
|
# define IR_X86_SSE42 (1<<4)
|
||||||
|
# define IR_X86_AVX (1<<5)
|
||||||
|
# define IR_X86_AVX2 (1<<6)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint32_t ir_cpuinfo(void);
|
||||||
|
|
||||||
/* Deoptimization helpers */
|
/* Deoptimization helpers */
|
||||||
const void *ir_emit_exitgroup(uint32_t first_exit_point, uint32_t exit_points_per_group, const void *exit_addr, void *code_buffer, size_t code_buffer_size, size_t *size_ptr);
|
const void *ir_emit_exitgroup(uint32_t first_exit_point, uint32_t exit_points_per_group, const void *exit_addr, void *code_buffer, size_t code_buffer_size, size_t *size_ptr);
|
||||||
|
|
||||||
@ -768,8 +779,6 @@ int ir_mem_protect(void *ptr, size_t size);
|
|||||||
int ir_mem_unprotect(void *ptr, size_t size);
|
int ir_mem_unprotect(void *ptr, size_t size);
|
||||||
int ir_mem_flush(void *ptr, size_t size);
|
int ir_mem_flush(void *ptr, size_t size);
|
||||||
|
|
||||||
uint32_t ir_cpuinfo(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
|
|
||||||
#include "ir_x86.h"
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
IR_ALWAYS_INLINE void ir_cpuid_ex(uint32_t info[4], uint32_t function, uint32_t index)
|
IR_ALWAYS_INLINE void ir_cpuid_ex(uint32_t info[4], uint32_t function, uint32_t index)
|
||||||
{
|
{
|
||||||
|
1
ir_gcm.c
1
ir_gcm.c
@ -659,6 +659,7 @@ restart:
|
|||||||
|
|
||||||
ir_init(&new_ctx, ctx->flags, consts_count, insns_count);
|
ir_init(&new_ctx, ctx->flags, consts_count, insns_count);
|
||||||
new_ctx.insns_count = insns_count;
|
new_ctx.insns_count = insns_count;
|
||||||
|
new_ctx.mflags = ctx->mflags;
|
||||||
new_ctx.spill_base = ctx->spill_base;
|
new_ctx.spill_base = ctx->spill_base;
|
||||||
new_ctx.fixed_stack_red_zone = ctx->fixed_stack_red_zone;
|
new_ctx.fixed_stack_red_zone = ctx->fixed_stack_red_zone;
|
||||||
new_ctx.fixed_stack_frame_size = ctx->fixed_stack_frame_size;
|
new_ctx.fixed_stack_frame_size = ctx->fixed_stack_frame_size;
|
||||||
|
36
ir_main.c
36
ir_main.c
@ -20,7 +20,9 @@ static void help(const char *cmd)
|
|||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -O[012] - optimiztion level\n"
|
" -O[012] - optimiztion level\n"
|
||||||
" -S - dump final target assembler code\n"
|
" -S - dump final target assembler code\n"
|
||||||
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
" -mavx - use AVX instruction set\n"
|
" -mavx - use AVX instruction set\n"
|
||||||
|
#endif
|
||||||
" -muse-fp - use base frame pointer register\n"
|
" -muse-fp - use base frame pointer register\n"
|
||||||
" --emit-c [file-name] - convert to C source\n"
|
" --emit-c [file-name] - convert to C source\n"
|
||||||
" --save [file-name] - save IR\n"
|
" --save [file-name] - save IR\n"
|
||||||
@ -231,6 +233,7 @@ int main(int argc, char **argv)
|
|||||||
bool emit_c = 0, dump_asm = 0, run = 0;
|
bool emit_c = 0, dump_asm = 0, run = 0;
|
||||||
uint32_t dump = 0;
|
uint32_t dump = 0;
|
||||||
int opt_level = 2;
|
int opt_level = 2;
|
||||||
|
uint32_t flags = 0;
|
||||||
uint32_t mflags = 0;
|
uint32_t mflags = 0;
|
||||||
uint64_t debug_regset = 0xffffffffffffffff;
|
uint64_t debug_regset = 0xffffffffffffffff;
|
||||||
bool dump_size = 0;
|
bool dump_size = 0;
|
||||||
@ -316,21 +319,23 @@ int main(int argc, char **argv)
|
|||||||
dump_asm = 1;
|
dump_asm = 1;
|
||||||
} else if (strcmp(argv[i], "--run") == 0) {
|
} else if (strcmp(argv[i], "--run") == 0) {
|
||||||
run = 1;
|
run = 1;
|
||||||
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
} else if (strcmp(argv[i], "-mavx") == 0) {
|
} else if (strcmp(argv[i], "-mavx") == 0) {
|
||||||
mflags |= IR_AVX;
|
mflags |= IR_X86_AVX;
|
||||||
|
#endif
|
||||||
} else if (strcmp(argv[i], "-muse-fp") == 0) {
|
} else if (strcmp(argv[i], "-muse-fp") == 0) {
|
||||||
mflags |= IR_USE_FRAME_POINTER;
|
flags |= IR_USE_FRAME_POINTER;
|
||||||
} else if (strcmp(argv[i], "-mfastcall") == 0) {
|
} else if (strcmp(argv[i], "-mfastcall") == 0) {
|
||||||
mflags |= IR_FASTCALL_FUNC;
|
flags |= IR_FASTCALL_FUNC;
|
||||||
#ifdef IR_DEBUG
|
#ifdef IR_DEBUG
|
||||||
} else if (strcmp(argv[i], "--debug-sccp") == 0) {
|
} else if (strcmp(argv[i], "--debug-sccp") == 0) {
|
||||||
mflags |= IR_DEBUG_SCCP;
|
flags |= IR_DEBUG_SCCP;
|
||||||
} else if (strcmp(argv[i], "--debug-gcm") == 0) {
|
} else if (strcmp(argv[i], "--debug-gcm") == 0) {
|
||||||
mflags |= IR_DEBUG_GCM;
|
flags |= IR_DEBUG_GCM;
|
||||||
} else if (strcmp(argv[i], "--debug-schedule") == 0) {
|
} else if (strcmp(argv[i], "--debug-schedule") == 0) {
|
||||||
mflags |= IR_DEBUG_SCHEDULE;
|
flags |= IR_DEBUG_SCHEDULE;
|
||||||
} else if (strcmp(argv[i], "--debug-ra") == 0) {
|
} else if (strcmp(argv[i], "--debug-ra") == 0) {
|
||||||
mflags |= IR_DEBUG_RA;
|
flags |= IR_DEBUG_RA;
|
||||||
#endif
|
#endif
|
||||||
} else if (strcmp(argv[i], "--debug-regset") == 0) {
|
} else if (strcmp(argv[i], "--debug-regset") == 0) {
|
||||||
if (i + 1 == argc || argv[i + 1][0] == '-') {
|
if (i + 1 == argc || argv[i + 1][0] == '-') {
|
||||||
@ -372,6 +377,20 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
|
uint32_t cpuinfo = ir_cpuinfo();
|
||||||
|
|
||||||
|
if (!(cpuinfo & IR_X86_SSE2)) {
|
||||||
|
fprintf(stderr, "ERROR: incompatible CPU (SSE2 is not supported)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mflags & IR_X86_AVX) & !(cpuinfo & IR_X86_AVX)) {
|
||||||
|
fprintf(stderr, "ERROR: -mAVX is not compatible with CPU (AVX is not supported)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!abort_fault) {
|
if (!abort_fault) {
|
||||||
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT);
|
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT);
|
||||||
@ -381,7 +400,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
ir_loader_init();
|
ir_loader_init();
|
||||||
|
|
||||||
uint32_t flags = IR_FUNCTION | mflags;
|
flags |= IR_FUNCTION;
|
||||||
|
|
||||||
if (opt_level > 0) {
|
if (opt_level > 0) {
|
||||||
flags |= IR_OPT_FOLDING | IR_OPT_CFG | IR_OPT_CODEGEN;
|
flags |= IR_OPT_FOLDING | IR_OPT_CFG | IR_OPT_CODEGEN;
|
||||||
@ -393,6 +412,7 @@ int main(int argc, char **argv)
|
|||||||
flags |= IR_GEN_NATIVE;
|
flags |= IR_GEN_NATIVE;
|
||||||
}
|
}
|
||||||
ir_init(&ctx, flags, 256, 1024);
|
ir_init(&ctx, flags, 256, 1024);
|
||||||
|
ctx.mflags = mflags;
|
||||||
ctx.fixed_regset = ~debug_regset;
|
ctx.fixed_regset = ~debug_regset;
|
||||||
|
|
||||||
if (!ir_load(&ctx, f)) {
|
if (!ir_load(&ctx, f)) {
|
||||||
|
39
ir_test.c
39
ir_test.c
@ -95,11 +95,9 @@ int main(int argc, char **argv)
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
int i;
|
int i;
|
||||||
int opt_level = 2;
|
int opt_level = 2;
|
||||||
|
uint32_t flags = 0;
|
||||||
uint32_t mflags = 0;
|
uint32_t mflags = 0;
|
||||||
uint64_t debug_regset = 0xffffffffffffffff;
|
uint64_t debug_regset = 0xffffffffffffffff;
|
||||||
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
|
||||||
uint32_t cpuinfo = ir_cpuinfo();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ir_consistency_check();
|
ir_consistency_check();
|
||||||
|
|
||||||
@ -114,25 +112,21 @@ int main(int argc, char **argv)
|
|||||||
} else {
|
} else {
|
||||||
/* pass */
|
/* pass */
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "-mavx") == 0) {
|
|
||||||
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
if (!(cpuinfo & IR_X86_AVX)) {
|
} else if (strcmp(argv[i], "-mavx") == 0) {
|
||||||
fprintf(stderr, "ERROR: CPU doesn't support AVX instruction set)\n");
|
mflags |= IR_X86_AVX;
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
mflags |= IR_AVX;
|
|
||||||
} else if (strcmp(argv[i], "-muse-fp") == 0) {
|
} else if (strcmp(argv[i], "-muse-fp") == 0) {
|
||||||
mflags |= IR_USE_FRAME_POINTER;
|
flags |= IR_USE_FRAME_POINTER;
|
||||||
#ifdef IR_DEBUG
|
#ifdef IR_DEBUG
|
||||||
} else if (strcmp(argv[i], "--debug-sccp") == 0) {
|
} else if (strcmp(argv[i], "--debug-sccp") == 0) {
|
||||||
mflags |= IR_DEBUG_SCCP;
|
flags |= IR_DEBUG_SCCP;
|
||||||
} else if (strcmp(argv[i], "--debug-gcm") == 0) {
|
} else if (strcmp(argv[i], "--debug-gcm") == 0) {
|
||||||
mflags |= IR_DEBUG_GCM;
|
flags |= IR_DEBUG_GCM;
|
||||||
} else if (strcmp(argv[i], "--debug-schedule") == 0) {
|
} else if (strcmp(argv[i], "--debug-schedule") == 0) {
|
||||||
mflags |= IR_DEBUG_SCHEDULE;
|
flags |= IR_DEBUG_SCHEDULE;
|
||||||
} else if (strcmp(argv[i], "--debug-ra") == 0) {
|
} else if (strcmp(argv[i], "--debug-ra") == 0) {
|
||||||
mflags |= IR_DEBUG_RA;
|
flags |= IR_DEBUG_RA;
|
||||||
#endif
|
#endif
|
||||||
} else if (strcmp(argv[i], "--debug-regset") == 0) {
|
} else if (strcmp(argv[i], "--debug-regset") == 0) {
|
||||||
if (i + 1 == argc || argv[i + 1][0] == '-') {
|
if (i + 1 == argc || argv[i + 1][0] == '-') {
|
||||||
@ -146,11 +140,26 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t flags = IR_FUNCTION | mflags;
|
#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64)
|
||||||
|
uint32_t cpuinfo = ir_cpuinfo();
|
||||||
|
|
||||||
|
if (!(cpuinfo & IR_X86_SSE2)) {
|
||||||
|
fprintf(stderr, "ERROR: incompatible CPU (SSE2 is not supported)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mflags & IR_X86_AVX) & !(cpuinfo & IR_X86_AVX)) {
|
||||||
|
fprintf(stderr, "ERROR: -mAVX is not compatible with CPU (AVX is not supported)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
flags |= IR_FUNCTION;
|
||||||
if (opt_level > 0) {
|
if (opt_level > 0) {
|
||||||
flags |= IR_OPT_FOLDING | IR_OPT_CFG | IR_OPT_CODEGEN;
|
flags |= IR_OPT_FOLDING | IR_OPT_CFG | IR_OPT_CODEGEN;
|
||||||
}
|
}
|
||||||
ir_init(&ctx, flags, 256, 1024);
|
ir_init(&ctx, flags, 256, 1024);
|
||||||
|
ctx.mflags = mflags;
|
||||||
ctx.fixed_regset = ~debug_regset;
|
ctx.fixed_regset = ~debug_regset;
|
||||||
gen_mandelbrot(&ctx);
|
gen_mandelbrot(&ctx);
|
||||||
// ir_save(&ctx, stderr);
|
// ir_save(&ctx, stderr);
|
||||||
|
88
ir_x86.dasc
88
ir_x86.dasc
@ -286,7 +286,7 @@
|
|||||||
|.endmacro
|
|.endmacro
|
||||||
|
|
||||||
|.macro ASM_FP_REG_REG_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
|.macro ASM_FP_REG_REG_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
||||||
|| if (ctx->flags & IR_AVX) {
|
|| if (ctx->mflags & IR_X86_AVX) {
|
||||||
| ASM_SSE2_REG_REG_OP avx_fop, avx_dop, type, dst, src
|
| ASM_SSE2_REG_REG_OP avx_fop, avx_dop, type, dst, src
|
||||||
|| } else {
|
|| } else {
|
||||||
| ASM_SSE2_REG_REG_OP fop, dop, type, dst, src
|
| ASM_SSE2_REG_REG_OP fop, dop, type, dst, src
|
||||||
@ -295,14 +295,14 @@
|
|||||||
|
|
||||||
|.macro ASM_FP_MEM_REG_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
|.macro ASM_FP_MEM_REG_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
||||||
|| if (type == IR_DOUBLE) {
|
|| if (type == IR_DOUBLE) {
|
||||||
|| if (ctx->flags & IR_AVX) {
|
|| if (ctx->mflags & IR_X86_AVX) {
|
||||||
| avx_dop qword dst, xmm(src-IR_REG_FP_FIRST)
|
| avx_dop qword dst, xmm(src-IR_REG_FP_FIRST)
|
||||||
|| } else {
|
|| } else {
|
||||||
| dop qword dst, xmm(src-IR_REG_FP_FIRST)
|
| dop qword dst, xmm(src-IR_REG_FP_FIRST)
|
||||||
|| }
|
|| }
|
||||||
|| } else {
|
|| } else {
|
||||||
|| IR_ASSERT(type == IR_FLOAT);
|
|| IR_ASSERT(type == IR_FLOAT);
|
||||||
|| if (ctx->flags & IR_AVX) {
|
|| if (ctx->mflags & IR_X86_AVX) {
|
||||||
| avx_fop dword dst, xmm(src-IR_REG_FP_FIRST)
|
| avx_fop dword dst, xmm(src-IR_REG_FP_FIRST)
|
||||||
|| } else {
|
|| } else {
|
||||||
| fop dword dst, xmm(src-IR_REG_FP_FIRST)
|
| fop dword dst, xmm(src-IR_REG_FP_FIRST)
|
||||||
@ -311,7 +311,7 @@
|
|||||||
|.endmacro
|
|.endmacro
|
||||||
|
|
||||||
|.macro ASM_FP_REG_MEM_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
|.macro ASM_FP_REG_MEM_OP, fop, dop, avx_fop, avx_dop, type, dst, src
|
||||||
|| if (ctx->flags & IR_AVX) {
|
|| if (ctx->mflags & IR_X86_AVX) {
|
||||||
| ASM_SSE2_REG_MEM_OP avx_fop, avx_dop, type, dst, src
|
| ASM_SSE2_REG_MEM_OP avx_fop, avx_dop, type, dst, src
|
||||||
|| } else {
|
|| } else {
|
||||||
| ASM_SSE2_REG_MEM_OP fop, dop, type, dst, src
|
| ASM_SSE2_REG_MEM_OP fop, dop, type, dst, src
|
||||||
@ -1188,7 +1188,7 @@ binop_fp:
|
|||||||
} else {
|
} else {
|
||||||
ir_match_fuse_load(ctx, insn->op2, ref);
|
ir_match_fuse_load(ctx, insn->op2, ref);
|
||||||
}
|
}
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
return IR_BINOP_AVX;
|
return IR_BINOP_AVX;
|
||||||
} else {
|
} else {
|
||||||
return IR_BINOP_SSE2;
|
return IR_BINOP_SSE2;
|
||||||
@ -1892,13 +1892,13 @@ static void ir_emit_load_imm_fp(ir_ctx *ctx, ir_type type, ir_reg reg, ir_ref sr
|
|||||||
int label;
|
int label;
|
||||||
|
|
||||||
if (type == IR_FLOAT && insn->val.u32 == 0) {
|
if (type == IR_FLOAT && insn->val.u32 == 0) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
| vxorps xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| xorps xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
| xorps xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
||||||
}
|
}
|
||||||
} else if (type == IR_DOUBLE && insn->val.u64 == 0) {
|
} else if (type == IR_DOUBLE && insn->val.u64 == 0) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorpd xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
| vxorpd xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| xorpd xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
| xorpd xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST)
|
||||||
@ -2074,7 +2074,7 @@ static void ir_emit_prologue(ir_ctx *ctx)
|
|||||||
ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER;
|
ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER;
|
||||||
|
|
||||||
offset -= sizeof(void*);
|
offset -= sizeof(void*);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovsd qword [Ra(fp)+offset], xmm(i-IR_REG_FP_FIRST)
|
| vmovsd qword [Ra(fp)+offset], xmm(i-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| movsd qword [Ra(fp)+offset], xmm(i-IR_REG_FP_FIRST)
|
| movsd qword [Ra(fp)+offset], xmm(i-IR_REG_FP_FIRST)
|
||||||
@ -2110,7 +2110,7 @@ static void ir_emit_epilogue(ir_ctx *ctx)
|
|||||||
ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER;
|
ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER;
|
||||||
|
|
||||||
offset -= sizeof(void*);
|
offset -= sizeof(void*);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovsd xmm(i-IR_REG_FP_FIRST), qword [Ra(fp)+offset]
|
| vmovsd xmm(i-IR_REG_FP_FIRST), qword [Ra(fp)+offset]
|
||||||
} else {
|
} else {
|
||||||
| movsd xmm(i-IR_REG_FP_FIRST), qword [Ra(fp)+offset]
|
| movsd xmm(i-IR_REG_FP_FIRST), qword [Ra(fp)+offset]
|
||||||
@ -3302,7 +3302,7 @@ static void ir_emit_op_fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.dword 0, 0x80000000, 0, 0
|
|.dword 0, 0x80000000, 0, 0
|
||||||
|.code
|
|.code
|
||||||
}
|
}
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorpd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->double_neg_const]
|
| vxorpd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->double_neg_const]
|
||||||
} else {
|
} else {
|
||||||
| xorpd xmm(def_reg-IR_REG_FP_FIRST), [->double_neg_const]
|
| xorpd xmm(def_reg-IR_REG_FP_FIRST), [->double_neg_const]
|
||||||
@ -3317,7 +3317,7 @@ static void ir_emit_op_fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.dword 0x80000000, 0, 0, 0
|
|.dword 0x80000000, 0, 0, 0
|
||||||
|.code
|
|.code
|
||||||
}
|
}
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->float_neg_const]
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->float_neg_const]
|
||||||
} else {
|
} else {
|
||||||
| xorps xmm(def_reg-IR_REG_FP_FIRST), [->float_neg_const]
|
| xorps xmm(def_reg-IR_REG_FP_FIRST), [->float_neg_const]
|
||||||
@ -3333,7 +3333,7 @@ static void ir_emit_op_fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.dword 0xffffffff, 0x7fffffff, 0, 0
|
|.dword 0xffffffff, 0x7fffffff, 0, 0
|
||||||
|.code
|
|.code
|
||||||
}
|
}
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vandpd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->double_abs_const]
|
| vandpd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->double_abs_const]
|
||||||
} else {
|
} else {
|
||||||
| andpd xmm(def_reg-IR_REG_FP_FIRST), [->double_abs_const]
|
| andpd xmm(def_reg-IR_REG_FP_FIRST), [->double_abs_const]
|
||||||
@ -3348,7 +3348,7 @@ static void ir_emit_op_fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.dword 0x7fffffff, 0, 0, 0
|
|.dword 0x7fffffff, 0, 0, 0
|
||||||
|.code
|
|.code
|
||||||
}
|
}
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vandps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->float_abs_const]
|
| vandps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), [->float_abs_const]
|
||||||
} else {
|
} else {
|
||||||
| andps xmm(def_reg-IR_REG_FP_FIRST), [->float_abs_const]
|
| andps xmm(def_reg-IR_REG_FP_FIRST), [->float_abs_const]
|
||||||
@ -4607,7 +4607,7 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovd Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vmovd Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| movd Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| movd Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
@ -4615,7 +4615,7 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.endif
|
|.endif
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovd Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vmovd Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| movd Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| movd Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
@ -4661,7 +4661,7 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
if (dst_type == IR_DOUBLE) {
|
if (dst_type == IR_DOUBLE) {
|
||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovd xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
| vmovd xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
| movd xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
| movd xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
||||||
@ -4669,7 +4669,7 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|.endif
|
|.endif
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(dst_type == IR_FLOAT);
|
IR_ASSERT(dst_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovd xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
| vmovd xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
| movd xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
| movd xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
||||||
@ -4722,7 +4722,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
if (!src64) {
|
if (!src64) {
|
||||||
if (dst_type == IR_DOUBLE) {
|
if (dst_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
@ -4731,7 +4731,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(dst_type == IR_FLOAT);
|
IR_ASSERT(dst_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rd(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
@ -4743,7 +4743,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (dst_type == IR_DOUBLE) {
|
if (dst_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
@ -4752,7 +4752,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(dst_type == IR_FLOAT);
|
IR_ASSERT(dst_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(op1_reg)
|
||||||
} else {
|
} else {
|
||||||
@ -4773,7 +4773,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|
|
||||||
if (!src64) {
|
if (!src64) {
|
||||||
if (dst_type == IR_DOUBLE) {
|
if (dst_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
@ -4782,7 +4782,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(dst_type == IR_FLOAT);
|
IR_ASSERT(dst_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
@ -4794,7 +4794,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (dst_type == IR_DOUBLE) {
|
if (dst_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
| vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
@ -4803,7 +4803,7 @@ static void ir_emit_int2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(dst_type == IR_FLOAT);
|
IR_ASSERT(dst_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
| vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST)
|
||||||
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
| vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
@ -4843,14 +4843,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
if (!dst64) {
|
if (!dst64) {
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtsd2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtsd2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtss2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtss2si Rd(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
@ -4860,14 +4860,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtsd2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtsd2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtss2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtss2si Rq(def_reg), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
@ -4882,14 +4882,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
_insn->const_flags |= IR_CONST_EMIT;
|
_insn->const_flags |= IR_CONST_EMIT;
|
||||||
if (!dst64) {
|
if (!dst64) {
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rd(def_reg), qword [=>label]
|
| vcvtsd2si Rd(def_reg), qword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rd(def_reg), qword [=>label]
|
| cvtsd2si Rd(def_reg), qword [=>label]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rd(def_reg), dword [=>label]
|
| vcvtss2si Rd(def_reg), dword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rd(def_reg), dword [=>label]
|
| cvtss2si Rd(def_reg), dword [=>label]
|
||||||
@ -4899,14 +4899,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rq(def_reg), qword [=>label]
|
| vcvtsd2si Rq(def_reg), qword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rq(def_reg), qword [=>label]
|
| cvtsd2si Rq(def_reg), qword [=>label]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rq(def_reg), dword [=>label]
|
| vcvtss2si Rq(def_reg), dword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rq(def_reg), dword [=>label]
|
| cvtss2si Rq(def_reg), dword [=>label]
|
||||||
@ -4925,14 +4925,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|
|
||||||
if (!dst64) {
|
if (!dst64) {
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rd(def_reg), qword [Ra(op1_reg)+offset]
|
| vcvtsd2si Rd(def_reg), qword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rd(def_reg), qword [Ra(op1_reg)+offset]
|
| cvtsd2si Rd(def_reg), qword [Ra(op1_reg)+offset]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rd(def_reg), dword [Ra(op1_reg)+offset]
|
| vcvtss2si Rd(def_reg), dword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rd(def_reg), dword [Ra(op1_reg)+offset]
|
| cvtss2si Rd(def_reg), dword [Ra(op1_reg)+offset]
|
||||||
@ -4942,14 +4942,14 @@ static void ir_emit_fp2int(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
IR_ASSERT(sizeof(void*) == 8);
|
IR_ASSERT(sizeof(void*) == 8);
|
||||||
|.if X64
|
|.if X64
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2si Rq(def_reg), qword [Ra(op1_reg)+offset]
|
| vcvtsd2si Rq(def_reg), qword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2si Rq(def_reg), qword [Ra(op1_reg)+offset]
|
| cvtsd2si Rq(def_reg), qword [Ra(op1_reg)+offset]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2si Rq(def_reg), dword [Ra(op1_reg)+offset]
|
| vcvtss2si Rq(def_reg), dword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2si Rq(def_reg), dword [Ra(op1_reg)+offset]
|
| cvtss2si Rq(def_reg), dword [Ra(op1_reg)+offset]
|
||||||
@ -4985,14 +4985,14 @@ static void ir_emit_fp2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
ir_emit_fp_mov(ctx, dst_type, def_reg, op1_reg);
|
ir_emit_fp_mov(ctx, dst_type, def_reg, op1_reg);
|
||||||
}
|
}
|
||||||
} else if (src_type == IR_DOUBLE) {
|
} else if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(op1_reg-IR_REG_FP_FIRST)
|
||||||
@ -5004,14 +5004,14 @@ static void ir_emit_fp2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
|
|
||||||
_insn->const_flags |= IR_CONST_EMIT;
|
_insn->const_flags |= IR_CONST_EMIT;
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [=>label]
|
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), qword [=>label]
|
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), qword [=>label]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [=>label]
|
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [=>label]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), dword [=>label]
|
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), dword [=>label]
|
||||||
@ -5027,14 +5027,14 @@ static void ir_emit_fp2fp(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (src_type == IR_DOUBLE) {
|
if (src_type == IR_DOUBLE) {
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
| vcvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
| cvtsd2ss xmm(def_reg-IR_REG_FP_FIRST), qword [Ra(op1_reg)+offset]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IR_ASSERT(src_type == IR_FLOAT);
|
IR_ASSERT(src_type == IR_FLOAT);
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
| vcvtss2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
||||||
} else {
|
} else {
|
||||||
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
| cvtss2sd xmm(def_reg-IR_REG_FP_FIRST), dword [Ra(op1_reg)+offset]
|
||||||
@ -6184,7 +6184,7 @@ static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, ir_reg
|
|||||||
src_reg = fp_reg_params[j-3];
|
src_reg = fp_reg_params[j-3];
|
||||||
dst_reg = int_reg_params[j-3];
|
dst_reg = int_reg_params[j-3];
|
||||||
|.if X64
|
|.if X64
|
||||||
if (ctx->flags & IR_AVX) {
|
if (ctx->mflags & IR_X86_AVX) {
|
||||||
| vmovd Rq(dst_reg), xmm(src_reg-IR_REG_FP_FIRST)
|
| vmovd Rq(dst_reg), xmm(src_reg-IR_REG_FP_FIRST)
|
||||||
} else {
|
} else {
|
||||||
| movd Rq(dst_reg), xmm(src_reg-IR_REG_FP_FIRST)
|
| movd Rq(dst_reg), xmm(src_reg-IR_REG_FP_FIRST)
|
||||||
|
8
ir_x86.h
8
ir_x86.h
@ -221,12 +221,4 @@ struct _ir_target_constraints {
|
|||||||
int8_t hints[IR_MAX_REG_ARGS + 3];
|
int8_t hints[IR_MAX_REG_ARGS + 3];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IR_X86_SSE2 (1<<0)
|
|
||||||
#define IR_X86_SSE3 (1<<1)
|
|
||||||
#define IR_X86_SSSE3 (1<<2)
|
|
||||||
#define IR_X86_SSE41 (1<<3)
|
|
||||||
#define IR_X86_SSE42 (1<<4)
|
|
||||||
#define IR_X86_AVX (1<<5)
|
|
||||||
#define IR_X86_AVX2 (1<<6)
|
|
||||||
|
|
||||||
#endif /* IR_X86_H */
|
#endif /* IR_X86_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user