| OLD | NEW |
| 1 ; This tries to be a comprehensive test of i64 operations, in | 1 ; This tries to be a comprehensive test of i64 operations, in |
| 2 ; particular the patterns for lowering i64 operations into constituent | 2 ; particular the patterns for lowering i64 operations into constituent |
| 3 ; i32 operations on x86-32. | 3 ; i32 operations on x86-32. |
| 4 | 4 |
| 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 6 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ | 6 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ |
| 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s | 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
| 8 | 8 |
| 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 10 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ | 10 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ |
| (...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 ; | 963 ; |
| 964 ; OPTM1-LABEL: trunc64To1 | 964 ; OPTM1-LABEL: trunc64To1 |
| 965 ; OPTM1: mov eax,DWORD PTR [esp+ | 965 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 966 ; OPTM1: and al,0x1 | 966 ; OPTM1: and al,0x1 |
| 967 ; OPTM1-NOT: and eax,0x1 | 967 ; OPTM1-NOT: and eax,0x1 |
| 968 | 968 |
| 969 ; ARM32-LABEL: trunc64To1 | 969 ; ARM32-LABEL: trunc64To1 |
| 970 ; ARM32-OM1: and r0, r0, #1 | 970 ; ARM32-OM1: and r0, r0, #1 |
| 971 ; ARM32-O2: and r0, r0, #1 | 971 ; ARM32-O2: and r0, r0, #1 |
| 972 | 972 |
| 973 ; MIPS32-LABEL: trunc64To1 |
| 974 ; MIPS32: andi {{.*}},a0,0x1 |
| 975 ; MIPS32: move v0,{{.*}} |
| 976 |
| 973 define internal i64 @sext32To64(i32 %a) { | 977 define internal i64 @sext32To64(i32 %a) { |
| 974 entry: | 978 entry: |
| 975 %conv = sext i32 %a to i64 | 979 %conv = sext i32 %a to i64 |
| 976 ret i64 %conv | 980 ret i64 %conv |
| 977 } | 981 } |
| 978 ; CHECK-LABEL: sext32To64 | 982 ; CHECK-LABEL: sext32To64 |
| 979 ; CHECK: mov | 983 ; CHECK: mov |
| 980 ; CHECK: sar {{.*}},0x1f | 984 ; CHECK: sar {{.*}},0x1f |
| 981 ; | 985 ; |
| 982 ; OPTM1-LABEL: sext32To64 | 986 ; OPTM1-LABEL: sext32To64 |
| 983 ; OPTM1: mov | 987 ; OPTM1: mov |
| 984 ; OPTM1: sar {{.*}},0x1f | 988 ; OPTM1: sar {{.*}},0x1f |
| 985 | 989 |
| 986 ; ARM32-LABEL: sext32To64 | 990 ; ARM32-LABEL: sext32To64 |
| 987 ; ARM32: asr {{.*}}, #31 | 991 ; ARM32: asr {{.*}}, #31 |
| 988 | 992 |
| 989 ; MIPS32-LABEL: sext32To64 | 993 ; MIPS32-LABEL: sext32To64 |
| 990 ; MIPS32-LABEL: sra v1,a0,0x1f | 994 ; MIPS32-LABEL: sra {{.*}},a0,0x1f |
| 991 ; MIPS32-LABEL: move v0,a0 | 995 ; MIPS32-LABEL: move v1,{{.*}} |
| 996 ; MIPS32-LABEL: move v0,{{.*}} |
| 992 | 997 |
| 993 define internal i64 @sext16To64(i32 %a) { | 998 define internal i64 @sext16To64(i32 %a) { |
| 994 entry: | 999 entry: |
| 995 %a.arg_trunc = trunc i32 %a to i16 | 1000 %a.arg_trunc = trunc i32 %a to i16 |
| 996 %conv = sext i16 %a.arg_trunc to i64 | 1001 %conv = sext i16 %a.arg_trunc to i64 |
| 997 ret i64 %conv | 1002 ret i64 %conv |
| 998 } | 1003 } |
| 999 ; CHECK-LABEL: sext16To64 | 1004 ; CHECK-LABEL: sext16To64 |
| 1000 ; CHECK: movsx | 1005 ; CHECK: movsx |
| 1001 ; CHECK: sar {{.*}},0x1f | 1006 ; CHECK: sar {{.*}},0x1f |
| 1002 ; | 1007 ; |
| 1003 ; OPTM1-LABEL: sext16To64 | 1008 ; OPTM1-LABEL: sext16To64 |
| 1004 ; OPTM1: movsx | 1009 ; OPTM1: movsx |
| 1005 ; OPTM1: sar {{.*}},0x1f | 1010 ; OPTM1: sar {{.*}},0x1f |
| 1006 | 1011 |
| 1007 ; ARM32-LABEL: sext16To64 | 1012 ; ARM32-LABEL: sext16To64 |
| 1008 ; ARM32: sxth | 1013 ; ARM32: sxth |
| 1009 ; ARM32: asr {{.*}}, #31 | 1014 ; ARM32: asr {{.*}}, #31 |
| 1010 | 1015 |
| 1011 ; MIPS32-LABEL: sext16To64 | 1016 ; MIPS32-LABEL: sext16To64 |
| 1012 ; MIPS32: sll a0,a0,0x10 | 1017 ; MIPS32: sll {{.*}},{{.*}},0x10 |
| 1013 ; MIPS32: sra a0,a0,0x10 | 1018 ; MIPS32: sra {{.*}},{{.*}},0x10 |
| 1014 ; MIPS32: sra v1,a0,0x1f | 1019 ; MIPS32: sra {{.*}},{{.*}},0x1f |
| 1015 ; MIPS32: move v0,a0 | 1020 ; MIPS32: move v1,{{.*}} |
| 1021 ; MIPS32: move v0,{{.*}} |
| 1016 | 1022 |
| 1017 define internal i64 @sext8To64(i32 %a) { | 1023 define internal i64 @sext8To64(i32 %a) { |
| 1018 entry: | 1024 entry: |
| 1019 %a.arg_trunc = trunc i32 %a to i8 | 1025 %a.arg_trunc = trunc i32 %a to i8 |
| 1020 %conv = sext i8 %a.arg_trunc to i64 | 1026 %conv = sext i8 %a.arg_trunc to i64 |
| 1021 ret i64 %conv | 1027 ret i64 %conv |
| 1022 } | 1028 } |
| 1023 ; CHECK-LABEL: sext8To64 | 1029 ; CHECK-LABEL: sext8To64 |
| 1024 ; CHECK: movsx | 1030 ; CHECK: movsx |
| 1025 ; CHECK: sar {{.*}},0x1f | 1031 ; CHECK: sar {{.*}},0x1f |
| 1026 ; | 1032 ; |
| 1027 ; OPTM1-LABEL: sext8To64 | 1033 ; OPTM1-LABEL: sext8To64 |
| 1028 ; OPTM1: movsx | 1034 ; OPTM1: movsx |
| 1029 ; OPTM1: sar {{.*}},0x1f | 1035 ; OPTM1: sar {{.*}},0x1f |
| 1030 | 1036 |
| 1031 ; ARM32-LABEL: sext8To64 | 1037 ; ARM32-LABEL: sext8To64 |
| 1032 ; ARM32: sxtb | 1038 ; ARM32: sxtb |
| 1033 ; ARM32: asr {{.*}}, #31 | 1039 ; ARM32: asr {{.*}}, #31 |
| 1034 | 1040 |
| 1035 ; MIPS32-LABEL: sext8To64 | 1041 ; MIPS32-LABEL: sext8To64 |
| 1036 ; MIPS32: sll a0,a0,0x18 | 1042 ; MIPS32: sll {{.*}},a0,0x18 |
| 1037 ; MIPS32: sra a0,a0,0x18 | 1043 ; MIPS32: sra {{.*}},{{.*}},0x18 |
| 1038 ; MIPS32: sra v1,a0,0x1f | 1044 ; MIPS32: sra {{.*}},{{.*}},0x1f |
| 1039 ; MIPS32: move v0,a0 | 1045 ; MIPS32: move v1,{{.*}} |
| 1046 ; MIPS32: move v0,{{.*}} |
| 1040 | 1047 |
| 1041 define internal i64 @sext1To64(i32 %a) { | 1048 define internal i64 @sext1To64(i32 %a) { |
| 1042 entry: | 1049 entry: |
| 1043 %a.arg_trunc = trunc i32 %a to i1 | 1050 %a.arg_trunc = trunc i32 %a to i1 |
| 1044 %conv = sext i1 %a.arg_trunc to i64 | 1051 %conv = sext i1 %a.arg_trunc to i64 |
| 1045 ret i64 %conv | 1052 ret i64 %conv |
| 1046 } | 1053 } |
| 1047 ; CHECK-LABEL: sext1To64 | 1054 ; CHECK-LABEL: sext1To64 |
| 1048 ; CHECK: mov | 1055 ; CHECK: mov |
| 1049 ; CHECK: shl {{.*}},0x1f | 1056 ; CHECK: shl {{.*}},0x1f |
| 1050 ; CHECK: sar {{.*}},0x1f | 1057 ; CHECK: sar {{.*}},0x1f |
| 1051 ; | 1058 ; |
| 1052 ; OPTM1-LABEL: sext1To64 | 1059 ; OPTM1-LABEL: sext1To64 |
| 1053 ; OPTM1: mov | 1060 ; OPTM1: mov |
| 1054 ; OPTM1: shl {{.*}},0x1f | 1061 ; OPTM1: shl {{.*}},0x1f |
| 1055 ; OPTM1: sar {{.*}},0x1f | 1062 ; OPTM1: sar {{.*}},0x1f |
| 1056 | 1063 |
| 1057 ; ARM32-LABEL: sext1To64 | 1064 ; ARM32-LABEL: sext1To64 |
| 1058 ; ARM32: mov {{.*}}, #0 | 1065 ; ARM32: mov {{.*}}, #0 |
| 1059 ; ARM32: tst {{.*}}, #1 | 1066 ; ARM32: tst {{.*}}, #1 |
| 1060 ; ARM32: mvn {{.*}}, #0 | 1067 ; ARM32: mvn {{.*}}, #0 |
| 1061 ; ARM32: movne | 1068 ; ARM32: movne |
| 1062 | 1069 |
| 1070 ; MIPS32-LABEL: sext1To64 |
| 1071 ; MIPS32: sll {{.*}},a0,0x1f |
| 1072 ; MIPS32: sra {{.*}},{{.*}},0x1f |
| 1073 ; MIPS32: move v1,{{.*}} |
| 1074 ; MIPS32: move v0,{{.*}} |
| 1075 |
| 1063 define internal i64 @zext32To64(i32 %a) { | 1076 define internal i64 @zext32To64(i32 %a) { |
| 1064 entry: | 1077 entry: |
| 1065 %conv = zext i32 %a to i64 | 1078 %conv = zext i32 %a to i64 |
| 1066 ret i64 %conv | 1079 ret i64 %conv |
| 1067 } | 1080 } |
| 1068 ; CHECK-LABEL: zext32To64 | 1081 ; CHECK-LABEL: zext32To64 |
| 1069 ; CHECK: mov | 1082 ; CHECK: mov |
| 1070 ; CHECK: mov {{.*}},0x0 | 1083 ; CHECK: mov {{.*}},0x0 |
| 1071 ; | 1084 ; |
| 1072 ; OPTM1-LABEL: zext32To64 | 1085 ; OPTM1-LABEL: zext32To64 |
| 1073 ; OPTM1: mov | 1086 ; OPTM1: mov |
| 1074 ; OPTM1: mov {{.*}},0x0 | 1087 ; OPTM1: mov {{.*}},0x0 |
| 1075 | 1088 |
| 1076 ; ARM32-LABEL: zext32To64 | 1089 ; ARM32-LABEL: zext32To64 |
| 1077 ; ARM32: mov {{.*}}, #0 | 1090 ; ARM32: mov {{.*}}, #0 |
| 1078 | 1091 |
| 1079 ; MIPS32-LABEL: zext32To64 | 1092 ; MIPS32-LABEL: zext32To64 |
| 1080 ; MIPS32: li v1,0 | 1093 ; MIPS32: li {{.*}},0 |
| 1081 ; MIPS32: move v0,a0 | 1094 ; MIPS32: move v1,{{.*}} |
| 1095 ; MIPS32: move v0,{{.*}} |
| 1082 | 1096 |
| 1083 define internal i64 @zext16To64(i32 %a) { | 1097 define internal i64 @zext16To64(i32 %a) { |
| 1084 entry: | 1098 entry: |
| 1085 %a.arg_trunc = trunc i32 %a to i16 | 1099 %a.arg_trunc = trunc i32 %a to i16 |
| 1086 %conv = zext i16 %a.arg_trunc to i64 | 1100 %conv = zext i16 %a.arg_trunc to i64 |
| 1087 ret i64 %conv | 1101 ret i64 %conv |
| 1088 } | 1102 } |
| 1089 ; CHECK-LABEL: zext16To64 | 1103 ; CHECK-LABEL: zext16To64 |
| 1090 ; CHECK: movzx | 1104 ; CHECK: movzx |
| 1091 ; CHECK: mov {{.*}},0x0 | 1105 ; CHECK: mov {{.*}},0x0 |
| 1092 ; | 1106 ; |
| 1093 ; OPTM1-LABEL: zext16To64 | 1107 ; OPTM1-LABEL: zext16To64 |
| 1094 ; OPTM1: movzx | 1108 ; OPTM1: movzx |
| 1095 ; OPTM1: mov {{.*}},0x0 | 1109 ; OPTM1: mov {{.*}},0x0 |
| 1096 | 1110 |
| 1097 ; ARM32-LABEL: zext16To64 | 1111 ; ARM32-LABEL: zext16To64 |
| 1098 ; ARM32: uxth | 1112 ; ARM32: uxth |
| 1099 ; ARM32: mov {{.*}}, #0 | 1113 ; ARM32: mov {{.*}}, #0 |
| 1100 | 1114 |
| 1101 ; MIPS32-LABEL: zext16To64 | 1115 ; MIPS32-LABEL: zext16To64 |
| 1102 ; MIPS32: andi a0,a0,0xffff | 1116 ; MIPS32: andi {{.*}},a0,0xffff |
| 1103 ; MIPS32: li v1,0 | 1117 ; MIPS32: li {{.*}},0 |
| 1104 ; MIPS32: move v0,a0 | 1118 ; MIPS32: move v1,{{.*}} |
| 1119 ; MIPS32: move v0,{{.*}} |
| 1105 | 1120 |
| 1106 define internal i64 @zext8To64(i32 %a) { | 1121 define internal i64 @zext8To64(i32 %a) { |
| 1107 entry: | 1122 entry: |
| 1108 %a.arg_trunc = trunc i32 %a to i8 | 1123 %a.arg_trunc = trunc i32 %a to i8 |
| 1109 %conv = zext i8 %a.arg_trunc to i64 | 1124 %conv = zext i8 %a.arg_trunc to i64 |
| 1110 ret i64 %conv | 1125 ret i64 %conv |
| 1111 } | 1126 } |
| 1112 ; CHECK-LABEL: zext8To64 | 1127 ; CHECK-LABEL: zext8To64 |
| 1113 ; CHECK: movzx | 1128 ; CHECK: movzx |
| 1114 ; CHECK: mov {{.*}},0x0 | 1129 ; CHECK: mov {{.*}},0x0 |
| 1115 ; | 1130 ; |
| 1116 ; OPTM1-LABEL: zext8To64 | 1131 ; OPTM1-LABEL: zext8To64 |
| 1117 ; OPTM1: movzx | 1132 ; OPTM1: movzx |
| 1118 ; OPTM1: mov {{.*}},0x0 | 1133 ; OPTM1: mov {{.*}},0x0 |
| 1119 | 1134 |
| 1120 ; ARM32-LABEL: zext8To64 | 1135 ; ARM32-LABEL: zext8To64 |
| 1121 ; ARM32: uxtb | 1136 ; ARM32: uxtb |
| 1122 ; ARM32: mov {{.*}}, #0 | 1137 ; ARM32: mov {{.*}}, #0 |
| 1123 | 1138 |
| 1124 ; MIPS32-LABEL: zext8To64 | 1139 ; MIPS32-LABEL: zext8To64 |
| 1125 ; MIPS32: andi a0,a0,0xff | 1140 ; MIPS32: andi {{.*}},a0,0xff |
| 1126 ; MIPS32: li v1,0 | 1141 ; MIPS32: li {{.*}},0 |
| 1127 ; MIPS32: move v0,a0 | 1142 ; MIPS32: move v1,{{.*}} |
| 1143 ; MIPS32: move v0,{{.*}} |
| 1128 | 1144 |
| 1129 define internal i64 @zext1To64(i32 %a) { | 1145 define internal i64 @zext1To64(i32 %a) { |
| 1130 entry: | 1146 entry: |
| 1131 %a.arg_trunc = trunc i32 %a to i1 | 1147 %a.arg_trunc = trunc i32 %a to i1 |
| 1132 %conv = zext i1 %a.arg_trunc to i64 | 1148 %conv = zext i1 %a.arg_trunc to i64 |
| 1133 ret i64 %conv | 1149 ret i64 %conv |
| 1134 } | 1150 } |
| 1135 ; CHECK-LABEL: zext1To64 | 1151 ; CHECK-LABEL: zext1To64 |
| 1136 ; CHECK: and {{.*}},0x1 | 1152 ; CHECK: and {{.*}},0x1 |
| 1137 ; CHECK: mov {{.*}},0x0 | 1153 ; CHECK: mov {{.*}},0x0 |
| 1138 ; | 1154 ; |
| 1139 ; OPTM1-LABEL: zext1To64 | 1155 ; OPTM1-LABEL: zext1To64 |
| 1140 ; OPTM1: and {{.*}},0x1 | 1156 ; OPTM1: and {{.*}},0x1 |
| 1141 ; OPTM1: mov {{.*}},0x0 | 1157 ; OPTM1: mov {{.*}},0x0 |
| 1142 | 1158 |
| 1143 ; ARM32-LABEL: zext1To64 | 1159 ; ARM32-LABEL: zext1To64 |
| 1144 ; ARM32: and {{.*}}, #1 | 1160 ; ARM32: and {{.*}}, #1 |
| 1145 ; ARM32: mov {{.*}}, #0 | 1161 ; ARM32: mov {{.*}}, #0 |
| 1146 ; ARM32: bx | 1162 ; ARM32: bx |
| 1147 | 1163 |
| 1164 ; MIPS32-LABEL: zext1To64 |
| 1165 ; MIPS32: andi {{.*}},a0,0x1 |
| 1166 ; MIPS32: li {{.*}},0 |
| 1167 ; MIPS32: move v1,{{.*}} |
| 1168 ; MIPS32: move v0,{{.*}} |
| 1169 |
| 1148 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1170 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
| 1149 entry: | 1171 entry: |
| 1150 %cmp = icmp eq i64 %a, %b | 1172 %cmp = icmp eq i64 %a, %b |
| 1151 br i1 %cmp, label %if.then, label %if.end | 1173 br i1 %cmp, label %if.then, label %if.end |
| 1152 | 1174 |
| 1153 if.then: ; preds = %entry | 1175 if.then: ; preds = %entry |
| 1154 call void @func() | 1176 call void @func() |
| 1155 br label %if.end | 1177 br label %if.end |
| 1156 | 1178 |
| 1157 if.end: ; preds = %if.then, %entry | 1179 if.end: ; preds = %if.then, %entry |
| (...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2037 %s = lshr i64 %a, 40 | 2059 %s = lshr i64 %a, 40 |
| 2038 %t = trunc i64 %s to i32 | 2060 %t = trunc i64 %s to i32 |
| 2039 %r = sub i32 %t, 1 | 2061 %r = sub i32 %t, 1 |
| 2040 ret i32 %r | 2062 ret i32 %r |
| 2041 ; ARM32-LABEL: subOneToUpperAfterShift | 2063 ; ARM32-LABEL: subOneToUpperAfterShift |
| 2042 ; ARM32: subs | 2064 ; ARM32: subs |
| 2043 ; ARM32: sbc | 2065 ; ARM32: sbc |
| 2044 ; ARM32: lsr | 2066 ; ARM32: lsr |
| 2045 ; ARM32: sub | 2067 ; ARM32: sub |
| 2046 } | 2068 } |
| OLD | NEW |