diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 2765263..5f87a7b 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4632,7 +4632,8 @@ rs6000_option_override_internal (bool global_init_p)
       /* Set aix_struct_return last, after the ABI is determined.
 	 If -maix-struct-return or -msvr4-struct-return was explicitly
 	 used, don't override with the ABI default.  */
-      if (!global_options_set.x_aix_struct_return)
+      if (!global_options_set.x_aix_struct_return
+	 && !rs6000_current_svr4_struct_return)
 	aix_struct_return = (DEFAULT_ABI != ABI_V4 || DRAFT_V4_STRUCT_RET);
 
 #if 0
@@ -10616,13 +10617,23 @@ rs6000_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
 static bool
 rs6000_return_in_msb (const_tree valtype)
 {
-  return (DEFAULT_ABI == ABI_ELFv2
-	  && BYTES_BIG_ENDIAN
-	  && AGGREGATE_TYPE_P (valtype)
-	  && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
-	      == PAD_UPWARD));
-}
+  if (DEFAULT_ABI == ABI_ELFv2
+      && BYTES_BIG_ENDIAN
+      && AGGREGATE_TYPE_P (valtype)
+      && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
+          == PAD_UPWARD))
+    return true;
+
+  if (DEFAULT_ABI == ABI_V4
+      && rs6000_current_svr4_struct_return == 2
+      && BYTES_BIG_ENDIAN
+      && AGGREGATE_TYPE_P (valtype)
+      && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
+          == PAD_UPWARD))
+    return true;
 
+  return false;
+}
 #ifdef HAVE_AS_GNU_ATTRIBUTE
 /* Return TRUE if a call to function FNDECL may be one that
    potentially affects the function calling ABI of the object file.  */
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 7042859..a5f36a6 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -262,6 +262,14 @@ msvr4-struct-return
 Target Report RejectNegative Var(aix_struct_return,0) Save
 Return small structures in registers (SVR4 default).
 
+msvr4-struct-return=standard
+Target RejectNegative  Var(rs6000_current_svr4_struct_return,2) UInteger Save
+-msvr4-struct-return=[standard,gnu] Return small structures in registers (MSB aligned).
+
+msvr4-struct-return=gnu
+Target RejectNegative  Var(rs6000_current_svr4_struct_return,1) UInteger Save
+-msvr4-struct-return=[standard,gnu] Return small structures in registers (LSB aligned).
+
 mxl-compat
 Target Report Var(TARGET_XL_COMPAT) Save
 Conform more closely to IBM XLC semantics.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr84762-1.c b/gcc/testsuite/gcc.target/powerpc/pr84762-1.c
new file mode 100644
index 0000000..350e5ed
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr84762-1.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+void abort (void);
+struct smallstruct {  char a; char b; char c;};
+
+struct smallstruct f(void)
+{
+
+  struct smallstruct s = { 0x11, 0x22, 0x33 };
+  return s;
+}
+
+int main ()
+{
+  struct smallstruct sample;
+  sample  = f();
+  if ( sample.a == 0x11 )
+   return 0;
+  abort();
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr84762-2.c b/gcc/testsuite/gcc.target/powerpc/pr84762-2.c
new file mode 100644
index 0000000..536c996
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr84762-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile { target powerpc*-*-* rs6000-*-* } } */
+/* { dg-options "-O2 -msvr4-struct-return=gnu" } */
+/* { dg-final { scan-assembler-times "lis" 1 } } */
+/* { dg-final { scan-assembler-times "ori" 1 } } */
+struct smallstruct { char a; char b; char c; };
+
+struct smallstruct f(void)
+{
+  struct smallstruct s = { 0x11, 0x22, 0x33 };
+
+  return s;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr84762-3.c b/gcc/testsuite/gcc.target/powerpc/pr84762-3.c
new file mode 100644
index 0000000..df3392d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr84762-3.c
@@ -0,0 +1,12 @@
+/* { dg-do compile { target powerpc*-*-* rs6000-*-* } } */
+/* { dg-options "-O2 -msvr4-struct-return=standard" } */
+/* { dg-final { scan-assembler-times "lis" 1 } } */
+/* { dg-final { scan-assembler-times "ori" 1 } } */
+struct smallstruct { char a; char b; char c; };
+
+struct smallstruct f(void)
+{
+  struct smallstruct s = { 0x11, 0x22, 0x33 };
+
+  return s;
+}
