--- ./pp.c-pre	Tue Sep 30 09:11:50 2003
+++ ./pp.c	Wed Dec 10 02:41:08 2003
@@ -3108,6 +3108,16 @@ PP(pp_vec)
 	LvTARGLEN(TARG) = size;
     }
 
+#if defined(VEC_QUAD) && !defined(UV_IS_QUAD)
+    if (size == 64) {
+	Uquad_t q = ((Uquad_t)do_vecget(src, 2*offset, 32) << 32)
+	  + do_vecget(src, 2*offset + 1, 32);
+
+	sv_setpvf(TARG, "%qu", q);
+	sv_setnv(TARG, (NV)q);
+	SvPOK_on(TARG);			/* Make two-headed */
+    } else
+#endif
     sv_setuv(TARG, do_vecget(src, offset, size));
     PUSHs(TARG);
     RETURN;
--- ./mg.c-pre	Sun Oct 19 10:53:26 2003
+++ ./mg.c	Wed Dec 10 02:55:12 2003
@@ -1785,6 +1785,17 @@ Perl_magic_getvec(pTHX_ SV *sv, MAGIC *m
 	return 0;
     }
 
+#if defined(VEC_QUAD) && !defined(UV_IS_QUAD)
+    if (LvTARGLEN(sv) == 64) {
+	int offset = LvTARGOFF(sv);
+	Uquad_t q = ((Uquad_t)do_vecget(lsv, 2*offset, 32) << 32)
+	  + do_vecget(lsv, 2*offset + 1, 32);
+
+	sv_setpvf(sv, "%qu", q);
+	sv_setnv(sv, (NV)q);
+	SvPOK_on(sv);			/* Make two-headed */
+    } else
+#endif
     sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
     return 0;
 }
--- ./doop.c-pre	Tue Sep 30 09:09:50 2003
+++ ./doop.c	Wed Dec 10 02:30:56 2003
@@ -855,6 +855,12 @@ Perl_do_vecset(pTHX_ SV *sv)
     register I32 size;
     register unsigned char *s;
     register UV lval;
+#if defined(VEC_QUAD) && !defined(UV_IS_QUAD)
+    Uquad_t qlval;
+    I32 osize;
+#else
+#  define osize size
+#endif
     I32 mask;
     STRLEN targlen;
     STRLEN len;
@@ -871,16 +877,24 @@ Perl_do_vecset(pTHX_ SV *sv)
     }
 
     (void)SvPOK_only(targ);
+    size = LvTARGLEN(sv);
+#if defined(VEC_QUAD) && !defined(UV_IS_QUAD)
+    osize = size;
+    if (size == 64) {
+	size = 32;
+	qlval = (Uquad_t)SvNV(sv);
+	lval = (UV)(qlval >> 32);
+    } else
+#endif
     lval = SvUV(sv);
     offset = LvTARGOFF(sv);
     if (offset < 0)
 	Perl_croak(aTHX_ "Negative offset to vec in lvalue context");
-    size = LvTARGLEN(sv);
     if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
 	Perl_croak(aTHX_ "Illegal number of bits in vec");
 
-    offset *= size;			/* turn into bit offset */
-    len = (offset + size + 7) / 8;	/* required number of bytes */
+    offset *= osize;			/* turn into bit offset */
+    len = (offset + osize + 7) / 8;	/* required number of bytes */
     if (len > targlen) {
 	s = (unsigned char*)SvGROW(targ, len + 1);
 	(void)memzero((char *)(s + targlen), len - targlen + 1);
@@ -908,6 +922,14 @@ Perl_do_vecset(pTHX_ SV *sv)
 	    s[offset+1] = (U8)((lval >> 16) & 0xff);
 	    s[offset+2] = (U8)((lval >>  8) & 0xff);
 	    s[offset+3] = (U8)( lval        & 0xff);
+#if defined(VEC_QUAD) && !defined(UV_IS_QUAD)
+	    if (osize == 64) {
+		s[offset+4] = (U8)((qlval >> 24) & 0xff);
+		s[offset+5] = (U8)((qlval >> 16) & 0xff);
+		s[offset+6] = (U8)((qlval >>  8) & 0xff);
+		s[offset+7] = (U8)( qlval        & 0xff);
+	    }
+#endif
 	}
 #ifdef UV_IS_QUAD
 	else if (size == 64) {
@@ -926,6 +948,7 @@ Perl_do_vecset(pTHX_ SV *sv)
 #endif
     }
     SvSETMAGIC(targ);
+#undef osize
 }
 
 void
