merged from trunk rev. 4466-4469:
ktietz70: Add shift left/right 128 intrinsics

git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/stable/v2.x@4498 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 61724db..771a6a9 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -262,7 +262,8 @@
   intrincs/readgsbyte.c  intrincs/readgsword.c   intrincs/readgsdword.c  intrincs/readgsqword.c    \
   intrincs/writegsbyte.c intrincs/writegsword.c  intrincs/writegsdword.c intrincs/writegsqword.c   \
   intrincs/mul128ex.c    intrincs/umul128ex.c    intrincs/_mul128.c      intrincs/_umul128.c       \
-  intrincs/__movsq.c     intrincs/__stosq.c      intrincs/_rotl64.c      intrincs/_rotr64.c
+  intrincs/__movsq.c     intrincs/__shiftright128.c                      intrincs/__shiftleft128.c \
+  intrincs/__stosq.c     intrincs/_rotl64.c      intrincs/_rotr64.c
 
 # these only go into the 32 bit version:
 src_libmingwex32=\
diff --git a/mingw-w64-crt/Makefile.in b/mingw-w64-crt/Makefile.in
index 1029ff9..3fe0e8f 100644
--- a/mingw-w64-crt/Makefile.in
+++ b/mingw-w64-crt/Makefile.in
@@ -1427,8 +1427,9 @@
 	intrincs/writegsbyte.c intrincs/writegsword.c \
 	intrincs/writegsdword.c intrincs/writegsqword.c \
 	intrincs/mul128ex.c intrincs/umul128ex.c intrincs/_mul128.c \
-	intrincs/_umul128.c intrincs/__movsq.c intrincs/__stosq.c \
-	intrincs/_rotl64.c intrincs/_rotr64.c
+	intrincs/_umul128.c intrincs/__movsq.c \
+	intrincs/__shiftright128.c intrincs/__shiftleft128.c \
+	intrincs/__stosq.c intrincs/_rotl64.c intrincs/_rotr64.c
 am__objects_31 = crt/lib64_libmingwex_a-dllentry.$(OBJEXT) \
 	crt/lib64_libmingwex_a-dllmain.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-inbyte.$(OBJEXT) \
@@ -1925,6 +1926,8 @@
 	intrincs/lib64_libmingwex_a-_mul128.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-_umul128.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-__movsq.$(OBJEXT) \
+	intrincs/lib64_libmingwex_a-__shiftright128.$(OBJEXT) \
+	intrincs/lib64_libmingwex_a-__shiftleft128.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-__stosq.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-_rotl64.$(OBJEXT) \
 	intrincs/lib64_libmingwex_a-_rotr64.$(OBJEXT)
@@ -3353,7 +3356,8 @@
   intrincs/readgsbyte.c  intrincs/readgsword.c   intrincs/readgsdword.c  intrincs/readgsqword.c    \
   intrincs/writegsbyte.c intrincs/writegsword.c  intrincs/writegsdword.c intrincs/writegsqword.c   \
   intrincs/mul128ex.c    intrincs/umul128ex.c    intrincs/_mul128.c      intrincs/_umul128.c       \
-  intrincs/__movsq.c     intrincs/__stosq.c      intrincs/_rotl64.c      intrincs/_rotr64.c
+  intrincs/__movsq.c     intrincs/__shiftright128.c                      intrincs/__shiftleft128.c \
+  intrincs/__stosq.c     intrincs/_rotl64.c      intrincs/_rotr64.c
 
 
 # these only go into the 32 bit version:
@@ -6962,6 +6966,10 @@
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 intrincs/lib64_libmingwex_a-__movsq.$(OBJEXT):  \
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
+intrincs/lib64_libmingwex_a-__shiftright128.$(OBJEXT):  \
+	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
+intrincs/lib64_libmingwex_a-__shiftleft128.$(OBJEXT):  \
+	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 intrincs/lib64_libmingwex_a-__stosq.$(OBJEXT):  \
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 intrincs/lib64_libmingwex_a-_rotl64.$(OBJEXT):  \
@@ -8363,6 +8371,8 @@
 	-rm -f intrincs/lib64_libmingwex_a-__movsd.$(OBJEXT)
 	-rm -f intrincs/lib64_libmingwex_a-__movsq.$(OBJEXT)
 	-rm -f intrincs/lib64_libmingwex_a-__movsw.$(OBJEXT)
+	-rm -f intrincs/lib64_libmingwex_a-__shiftleft128.$(OBJEXT)
+	-rm -f intrincs/lib64_libmingwex_a-__shiftright128.$(OBJEXT)
 	-rm -f intrincs/lib64_libmingwex_a-__stosb.$(OBJEXT)
 	-rm -f intrincs/lib64_libmingwex_a-__stosd.$(OBJEXT)
 	-rm -f intrincs/lib64_libmingwex_a-__stosq.$(OBJEXT)
@@ -9857,6 +9867,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__movsd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__movsq.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__movsw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosb.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosq.Po@am__quote@
@@ -27675,6 +27687,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libmingwex_a-__movsq.obj `if test -f 'intrincs/__movsq.c'; then $(CYGPATH_W) 'intrincs/__movsq.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__movsq.c'; fi`
 
+intrincs/lib64_libmingwex_a-__shiftright128.o: intrincs/__shiftright128.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libmingwex_a-__shiftright128.o -MD -MP -MF intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Tpo -c -o intrincs/lib64_libmingwex_a-__shiftright128.o `test -f 'intrincs/__shiftright128.c' || echo '$(srcdir)/'`intrincs/__shiftright128.c
+@am__fastdepCC_TRUE@	$(am__mv) intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Tpo intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='intrincs/__shiftright128.c' object='intrincs/lib64_libmingwex_a-__shiftright128.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libmingwex_a-__shiftright128.o `test -f 'intrincs/__shiftright128.c' || echo '$(srcdir)/'`intrincs/__shiftright128.c
+
+intrincs/lib64_libmingwex_a-__shiftright128.obj: intrincs/__shiftright128.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libmingwex_a-__shiftright128.obj -MD -MP -MF intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Tpo -c -o intrincs/lib64_libmingwex_a-__shiftright128.obj `if test -f 'intrincs/__shiftright128.c'; then $(CYGPATH_W) 'intrincs/__shiftright128.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__shiftright128.c'; fi`
+@am__fastdepCC_TRUE@	$(am__mv) intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Tpo intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftright128.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='intrincs/__shiftright128.c' object='intrincs/lib64_libmingwex_a-__shiftright128.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libmingwex_a-__shiftright128.obj `if test -f 'intrincs/__shiftright128.c'; then $(CYGPATH_W) 'intrincs/__shiftright128.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__shiftright128.c'; fi`
+
+intrincs/lib64_libmingwex_a-__shiftleft128.o: intrincs/__shiftleft128.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libmingwex_a-__shiftleft128.o -MD -MP -MF intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Tpo -c -o intrincs/lib64_libmingwex_a-__shiftleft128.o `test -f 'intrincs/__shiftleft128.c' || echo '$(srcdir)/'`intrincs/__shiftleft128.c
+@am__fastdepCC_TRUE@	$(am__mv) intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Tpo intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='intrincs/__shiftleft128.c' object='intrincs/lib64_libmingwex_a-__shiftleft128.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libmingwex_a-__shiftleft128.o `test -f 'intrincs/__shiftleft128.c' || echo '$(srcdir)/'`intrincs/__shiftleft128.c
+
+intrincs/lib64_libmingwex_a-__shiftleft128.obj: intrincs/__shiftleft128.c
+@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libmingwex_a-__shiftleft128.obj -MD -MP -MF intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Tpo -c -o intrincs/lib64_libmingwex_a-__shiftleft128.obj `if test -f 'intrincs/__shiftleft128.c'; then $(CYGPATH_W) 'intrincs/__shiftleft128.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__shiftleft128.c'; fi`
+@am__fastdepCC_TRUE@	$(am__mv) intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Tpo intrincs/$(DEPDIR)/lib64_libmingwex_a-__shiftleft128.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='intrincs/__shiftleft128.c' object='intrincs/lib64_libmingwex_a-__shiftleft128.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libmingwex_a-__shiftleft128.obj `if test -f 'intrincs/__shiftleft128.c'; then $(CYGPATH_W) 'intrincs/__shiftleft128.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__shiftleft128.c'; fi`
+
 intrincs/lib64_libmingwex_a-__stosq.o: intrincs/__stosq.c
 @am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libmingwex_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libmingwex_a-__stosq.o -MD -MP -MF intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosq.Tpo -c -o intrincs/lib64_libmingwex_a-__stosq.o `test -f 'intrincs/__stosq.c' || echo '$(srcdir)/'`intrincs/__stosq.c
 @am__fastdepCC_TRUE@	$(am__mv) intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosq.Tpo intrincs/$(DEPDIR)/lib64_libmingwex_a-__stosq.Po
diff --git a/mingw-w64-crt/intrincs/__shiftleft128.c b/mingw-w64-crt/intrincs/__shiftleft128.c
new file mode 100644
index 0000000..621eef2
--- /dev/null
+++ b/mingw-w64-crt/intrincs/__shiftleft128.c
@@ -0,0 +1,27 @@
+#include <_mingw.h>
+
+#ifdef _WIN64
+
+unsigned __int64 __shiftleft128 (unsigned __int64  LowPart,
+ unsigned __int64 HighPart, unsigned char Shift);
+
+unsigned __int64 __shiftleft128 (unsigned __int64  LowPart,
+ unsigned __int64 HighPart, unsigned char Shift)
+{
+  if (Shift >= 128)
+    return 0ULL;
+  if (!Shift)
+    return HighPart;
+  if (Shift >= 64)
+    {
+      HighPart = LowPart;
+      Shift -= 64;
+      LowPart = 0;
+    }
+  HighPart <<= Shift;
+  LowPart >>= (64 - Shift);
+  return (HighPart | LowPart);
+}
+
+#endif
+
diff --git a/mingw-w64-crt/intrincs/__shiftright128.c b/mingw-w64-crt/intrincs/__shiftright128.c
new file mode 100644
index 0000000..b61899b
--- /dev/null
+++ b/mingw-w64-crt/intrincs/__shiftright128.c
@@ -0,0 +1,27 @@
+#include <_mingw.h>
+
+#ifdef _WIN64
+
+unsigned __int64 __shiftright128 (unsigned __int64  LowPart,
+ unsigned __int64 HighPart, unsigned char Shift);
+
+unsigned __int64 __shiftright128 (unsigned __int64  LowPart,
+ unsigned __int64 HighPart, unsigned char Shift)
+{
+  if (Shift >= 128)
+    return 0ULL;
+  if (!Shift)
+    return LowPart;
+  if (Shift >= 64)
+    {
+      LowPart = HighPart;
+      Shift -= 64;
+      HighPart = 0;
+    }
+  LowPart >>= Shift;
+  HighPart <<= (64 - Shift);
+  return (HighPart | LowPart);
+}
+
+#endif
+