@@ -599,23 +599,47 @@ pub(super) fn write_return_value(
599599 None
600600 } ;
601601 event. write_option ( rwriter, RETVAL , return_type. name ( ) , value) ;
602+ } else if matches ! ( left, ValueType :: i128 | ValueType :: u128 ) {
603+ let val = {
604+ #[ cfg( target_arch = "x86_64" ) ]
605+ {
606+ let rdx_u64 = read_u64 ( & rdx ( ) ) ?;
607+ let rcx_u64 = read_u64 ( & rcx ( ) ) ?;
608+ let res_is_rcx = ( rdx_u64 == 0 && rcx_u64 == 1 )
609+ || ( rdx_u64 == 0 && rcx_u64 == 0 ) ;
610+ if res_is_rcx && ( read_u64 ( & rdx ( ) ) ? & 0xF ) != 0 {
611+ let v = {
612+ let v = [ reg ( "rsi" ) , reg ( "r8" ) ] ;
613+ & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?
614+ } ;
615+ Some ( rwriter. prim_v ( left. primitive_name ( ) , v) )
616+ } else if !res_is_rcx && ( read_u64 ( & rdx ( ) ) ? & 0xF ) != 0 {
617+ let v = {
618+ let v = [ reg ( "rdi" ) , reg ( "r8" ) ] ;
619+ & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?
620+ } ;
621+ Some ( rwriter. prim_v ( left. primitive_name ( ) , v) )
622+ } else {
623+ None
624+ }
625+ }
626+ #[ cfg( target_arch = "aarch64" ) ]
627+ {
628+ if opt != 0 {
629+ let v = {
630+ let v = [ reg ( "x2" ) , reg ( "x3" ) ] ;
631+ & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?
632+ } ;
633+ Some ( rwriter. prim_v ( left. primitive_name ( ) , v) )
634+ } else {
635+ None
636+ }
637+ }
638+ } ;
639+ event. write_option ( rwriter, RETVAL , return_type. name ( ) , val) ;
602640 } else if opt != 0 {
603641 let val = if left_size == 0 {
604642 rwriter. unit_v ( )
605- } else if matches ! ( left, ValueType :: i128 | ValueType :: u128 ) {
606- let v = {
607- #[ cfg( target_arch = "x86_64" ) ]
608- {
609- // we are using rcx too
610- & values_to_bytes :: < 16 , _ > ( [ rdx ( ) , rcx ( ) ] . into_iter ( ) , 2 ) ?
611- }
612- #[ cfg( target_arch = "aarch64" ) ]
613- {
614- let v = [ reg ( "x2" ) , reg ( "x3" ) ] ;
615- & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?
616- }
617- } ;
618- rwriter. prim_v ( left. primitive_name ( ) , v)
619643 } else if matches ! ( left, ValueType :: Slice ( _) ) {
620644 get_slice_from_rax_rdx ( rwriter, & left, & left_type) ?
621645 } else if left. is_thin_ptr ( ) {
@@ -793,17 +817,27 @@ pub(super) fn write_return_value(
793817 {
794818 // Result<i128, i128>, Result<u128, u128>, Result<i128, ()>, Result<(), u128>
795819 log:: trace!( "{} rcx, rdx" , return_type. name( ) ) ;
796- let res = read_u64 ( & rax ( ) ) ?;
797- let v = {
820+ let ( res, v) = {
798821 #[ cfg( target_arch = "x86_64" ) ]
799822 {
800- // we are using rcx too
801- & values_to_bytes :: < 16 , _ > ( [ rdx ( ) , rcx ( ) ] . into_iter ( ) , 2 ) ?
823+ let rdx_u64 = read_u64 ( & rdx ( ) ) ?;
824+ let rcx_u64 = read_u64 ( & rcx ( ) ) ?;
825+ let res_is_rcx = ( rdx_u64 == 0 && rcx_u64 == 1 )
826+ || ( rdx_u64 == 0 && rcx_u64 == 0 ) ;
827+ let has_unit = left_size == 0 || right_size == 0 ;
828+ let res = if res_is_rcx { rcx_u64 } else { rdx_u64 } ;
829+ let v = if res_is_rcx {
830+ [ reg ( "rsi" ) , reg ( "r8" ) ]
831+ } else {
832+ [ reg ( "rdi" ) , reg ( "r8" ) ]
833+ } ;
834+ ( res, & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?)
802835 }
803836 #[ cfg( target_arch = "aarch64" ) ]
804837 {
838+ let res = read_u64 ( & rax ( ) ) ?;
805839 let v = [ reg ( "x2" ) , reg ( "x3" ) ] ;
806- & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?
840+ ( res , & values_to_bytes :: < 16 , _ > ( v. into_iter ( ) , 2 ) ?)
807841 }
808842 } ;
809843 let val = if left_size == 0 && res == 0 {
0 commit comments