diff --git a/dna/JIT.c b/dna/JIT.c index 34227bd..4c11145 100644 --- a/dna/JIT.c +++ b/dna/JIT.c @@ -806,6 +806,12 @@ } else if (pTypeA->stackType == EVALSTACK_INT64) { PushOp(JIT_NEG_I64 + (op - CIL_NEG)); PushStackType(types[TYPE_SYSTEM_INT64]); + } else if (pTypeA->stackType == EVALSTACK_F32) { + PushOp(JIT_NEG_F32); + PushStackType(types[TYPE_SYSTEM_SINGLE]); + } else if (pTypeA->stackType == EVALSTACK_F64) { + PushOp(JIT_NEG_F64); + PushStackType(types[TYPE_SYSTEM_DOUBLE]); } else { Crash("JITit(): Cannot perform unary operand on stack types: %d", pTypeA->stackType); } diff --git a/dna/JIT_Execute.c b/dna/JIT_Execute.c index db7d7e8..24f95a4 100644 --- a/dna/JIT_Execute.c +++ b/dna/JIT_Execute.c @@ -415,6 +415,8 @@ GET_LABELS_DYNAMIC(JIT_NOT_I32, 0); GET_LABELS_DYNAMIC(JIT_NEG_I64, 0); GET_LABELS_DYNAMIC(JIT_NOT_I64, 0); + GET_LABELS_DYNAMIC(JIT_NEG_F32, 0); + GET_LABELS_DYNAMIC(JIT_NEG_F64, 0); GET_LABELS(JIT_BOX_NULLABLE); GET_LABELS_DYNAMIC(JIT_LOAD_F64, 8); @@ -2021,6 +2023,18 @@ JIT_NEG_I64_end: GO_NEXT(); +JIT_NEG_F32_start: + OPCODE_USE(JIT_NEG_F32); + UNARY_OP(float, -); +JIT_NEG_F32_end: + GO_NEXT(); + +JIT_NEG_F64_start: + OPCODE_USE(JIT_NEG_F64); + UNARY_OP(double, -); +JIT_NEG_F64_end: + GO_NEXT(); + JIT_NOT_I32_start: OPCODE_USE(JIT_NOT_I32); UNARY_OP(U32, ~); diff --git a/dna/JIT_OpCodes.h b/dna/JIT_OpCodes.h index 6b08da1..03ed018 100644 --- a/dna/JIT_OpCodes.h +++ b/dna/JIT_OpCodes.h @@ -199,6 +199,8 @@ #define JIT_NOT_I32 0x8b #define JIT_NEG_I64 0x8c #define JIT_NOT_I64 0x8d +#define JIT_NEG_F32 0x1Fc +#define JIT_NEG_F64 0x1Fd #define JIT_BOX_NULLABLE 0x8e #define JIT_LOAD_F64 0x8f