summaryrefslogtreecommitdiff
path: root/Python/wordcode_helpers.h
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2016-12-03 11:24:02 -0800
committerSteve Dower <steve.dower@microsoft.com>2016-12-03 11:24:02 -0800
commit9ca70643e30ef19ceb39644dde496b7dfc7fa6e6 (patch)
tree9dbef5e103e88ce6c36477306f285c16813e0866 /Python/wordcode_helpers.h
parente724fe060b189a4879fd9713a24bbfe6c9eb008e (diff)
parent43ebbf7db2d3d3297e96693fd91ac8a654631438 (diff)
downloadcpython-9ca70643e30ef19ceb39644dde496b7dfc7fa6e6.tar.gz
Issue #28846: Various installer fixes
Diffstat (limited to 'Python/wordcode_helpers.h')
-rw-r--r--Python/wordcode_helpers.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/Python/wordcode_helpers.h b/Python/wordcode_helpers.h
new file mode 100644
index 0000000000..b0e3a91776
--- /dev/null
+++ b/Python/wordcode_helpers.h
@@ -0,0 +1,41 @@
+/* This file contains code shared by the compiler and the peephole
+ optimizer.
+ */
+
+#ifdef WORDS_BIGENDIAN
+# define PACKOPARG(opcode, oparg) ((_Py_CODEUNIT)(((opcode) << 8) | (oparg)))
+#else
+# define PACKOPARG(opcode, oparg) ((_Py_CODEUNIT)(((oparg) << 8) | (opcode)))
+#endif
+
+/* Minimum number of code units necessary to encode instruction with
+ EXTENDED_ARGs */
+static int
+instrsize(unsigned int oparg)
+{
+ return oparg <= 0xff ? 1 :
+ oparg <= 0xffff ? 2 :
+ oparg <= 0xffffff ? 3 :
+ 4;
+}
+
+/* Spits out op/oparg pair using ilen bytes. codestr should be pointed at the
+ desired location of the first EXTENDED_ARG */
+static void
+write_op_arg(_Py_CODEUNIT *codestr, unsigned char opcode,
+ unsigned int oparg, int ilen)
+{
+ switch (ilen) {
+ case 4:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 24) & 0xff);
+ case 3:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 16) & 0xff);
+ case 2:
+ *codestr++ = PACKOPARG(EXTENDED_ARG, (oparg >> 8) & 0xff);
+ case 1:
+ *codestr++ = PACKOPARG(opcode, oparg & 0xff);
+ break;
+ default:
+ assert(0);
+ }
+}