+ // Floating point (new with glulx spec 3.1.2)
+
+ do_numtof:\r
+ F1 = (git_float) L1;\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_ftonumz:\r
+ F1 = DECODE_FLOAT(L1);\r
+ if (!signbit(F1)) {\r
+ if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
+ S1 = 0x7FFFFFFF;\r
+ else\r
+ S1 = (git_sint32) truncf(F1);\r
+ } else {\r
+ if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
+ S1 = 0x80000000;\r
+ else\r
+ S1 = (git_sint32) truncf(F1);\r
+ }\r
+ NEXT;\r
+\r
+ do_ftonumn:\r
+ F1 = DECODE_FLOAT(L1);\r
+ if (!signbit(F1)) {\r
+ if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
+ S1 = 0x7FFFFFFF;\r
+ else\r
+ S1 = (git_sint32) roundf(F1);\r
+ } else {\r
+ if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
+ S1 = 0x80000000;\r
+ else\r
+ S1 = (git_sint32) roundf(F1);\r
+ }\r
+ NEXT;\r
+\r
+ do_ceil:\r
+ F1 = ceilf(DECODE_FLOAT(L1));\r
+ L2 = ENCODE_FLOAT(F1);\r
+ if ((L2 == 0x0) || (L2 == 0x80000000))\r
+ L2 = L1 & 0x80000000;\r
+ S1 = L2;\r
+ NEXT;\r
+\r
+ do_floor:\r
+ F1 = floorf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_sqrt:\r
+ F1 = sqrtf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_exp:\r
+ F1 = expf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_log:\r
+ F1 = logf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_pow:\r
+#ifdef USE_OWN_POWF\r
+ F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
+#else\r
+ F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
+#endif\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_atan2:\r
+ F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_fmod:\r
+ F1 = DECODE_FLOAT(L1);\r
+ F2 = DECODE_FLOAT(L2);\r
+ F3 = fmodf(F1, F2);\r
+ F4 = (F1 - F3) / F2;\r
+ L4 = ENCODE_FLOAT(F4);\r
+ if ((L4 == 0) || (L4 == 0x80000000))\r
+ L4 = (L1 ^ L2) & 0x80000000;\r
+ S1 = ENCODE_FLOAT(F3);\r
+ S2 = L4;\r
+ NEXT;\r
+\r
+ do_sin:\r
+ F1 = sinf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_cos:\r
+ F1 = cosf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_tan:\r
+ F1 = tanf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_asin:\r
+ F1 = asinf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_acos:\r
+ F1 = acosf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+\r
+ do_atan:\r
+ F1 = atanf(DECODE_FLOAT(L1));\r
+ S1 = ENCODE_FLOAT(F1);\r
+ NEXT;\r
+