@@ -1030,6 +1030,32 @@ multiclass XOForm_1r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1030
1030
}
1031
1031
}
1032
1032
1033
+ // Multiclass for instructions which have a record overflow form as well
1034
+ // as a record form but no carry (i.e. mulld, mulldo, subf, subfo, etc.)
1035
+ multiclass XOForm_1rx<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1036
+ string asmbase, string asmstr, InstrItinClass itin,
1037
+ list<dag> pattern> {
1038
+ let BaseName = asmbase in {
1039
+ def NAME : XOForm_1<opcode, xo, 0, OOL, IOL,
1040
+ !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1041
+ pattern>, RecFormRel;
1042
+ let Defs = [CR0] in
1043
+ def o : XOForm_1<opcode, xo, 0, OOL, IOL,
1044
+ !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1045
+ []>, isDOT, RecFormRel;
1046
+ }
1047
+ let BaseName = !strconcat(asmbase, "O") in {
1048
+ let Defs = [XER] in
1049
+ def O : XOForm_1<opcode, xo, 1, OOL, IOL,
1050
+ !strconcat(asmbase, !strconcat("o ", asmstr)), itin,
1051
+ []>, RecFormRel;
1052
+ let Defs = [XER, CR0] in
1053
+ def Oo : XOForm_1<opcode, xo, 1, OOL, IOL,
1054
+ !strconcat(asmbase, !strconcat("o. ", asmstr)), itin,
1055
+ []>, isDOT, RecFormRel;
1056
+ }
1057
+ }
1058
+
1033
1059
// Multiclass for instructions for which the non record form is not cracked
1034
1060
// and the record form is cracked (i.e. divw, mullw, etc.)
1035
1061
multiclass XOForm_1rcr<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
@@ -1045,6 +1071,16 @@ multiclass XOForm_1rcr<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1045
1071
[]>, isDOT, RecFormRel, PPC970_DGroup_First,
1046
1072
PPC970_DGroup_Cracked;
1047
1073
}
1074
+ let BaseName = !strconcat(asmbase, "O") in {
1075
+ let Defs = [XER] in
1076
+ def O : XOForm_1<opcode, xo, 1, OOL, IOL,
1077
+ !strconcat(asmbase, !strconcat("o ", asmstr)), itin,
1078
+ []>, RecFormRel;
1079
+ let Defs = [XER, CR0] in
1080
+ def Oo : XOForm_1<opcode, xo, 1, OOL, IOL,
1081
+ !strconcat(asmbase, !strconcat("o. ", asmstr)), itin,
1082
+ []>, isDOT, RecFormRel;
1083
+ }
1048
1084
}
1049
1085
1050
1086
multiclass XOForm_1rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
@@ -1060,6 +1096,16 @@ multiclass XOForm_1rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1060
1096
!strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1061
1097
[]>, isDOT, RecFormRel;
1062
1098
}
1099
+ let BaseName = !strconcat(asmbase, "O") in {
1100
+ let Defs = [CARRY, XER] in
1101
+ def O : XOForm_1<opcode, xo, 1, OOL, IOL,
1102
+ !strconcat(asmbase, !strconcat("o ", asmstr)), itin,
1103
+ []>, RecFormRel;
1104
+ let Defs = [CARRY, XER, CR0] in
1105
+ def Oo : XOForm_1<opcode, xo, 1, OOL, IOL,
1106
+ !strconcat(asmbase, !strconcat("o. ", asmstr)), itin,
1107
+ []>, isDOT, RecFormRel;
1108
+ }
1063
1109
}
1064
1110
1065
1111
multiclass XOForm_3r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
@@ -1074,6 +1120,16 @@ multiclass XOForm_3r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1074
1120
!strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1075
1121
[]>, isDOT, RecFormRel;
1076
1122
}
1123
+ let BaseName = !strconcat(asmbase, "O") in {
1124
+ let Defs = [XER] in
1125
+ def O : XOForm_3<opcode, xo, 1, OOL, IOL,
1126
+ !strconcat(asmbase, !strconcat("o ", asmstr)), itin,
1127
+ []>, RecFormRel;
1128
+ let Defs = [XER, CR0] in
1129
+ def Oo : XOForm_3<opcode, xo, 1, OOL, IOL,
1130
+ !strconcat(asmbase, !strconcat("o. ", asmstr)), itin,
1131
+ []>, isDOT, RecFormRel;
1132
+ }
1077
1133
}
1078
1134
1079
1135
multiclass XOForm_3rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
@@ -1089,6 +1145,16 @@ multiclass XOForm_3rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
1089
1145
!strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1090
1146
[]>, isDOT, RecFormRel;
1091
1147
}
1148
+ let BaseName = !strconcat(asmbase, "O") in {
1149
+ let Defs = [CARRY, XER] in
1150
+ def O : XOForm_3<opcode, xo, 1, OOL, IOL,
1151
+ !strconcat(asmbase, !strconcat("o ", asmstr)), itin,
1152
+ []>, RecFormRel;
1153
+ let Defs = [CARRY, XER, CR0] in
1154
+ def Oo : XOForm_3<opcode, xo, 1, OOL, IOL,
1155
+ !strconcat(asmbase, !strconcat("o. ", asmstr)), itin,
1156
+ []>, isDOT, RecFormRel;
1157
+ }
1092
1158
}
1093
1159
1094
1160
multiclass MForm_2r<bits<6> opcode, dag OOL, dag IOL,
@@ -2785,9 +2851,9 @@ def MODUW : XForm_8<31, 267, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2785
2851
let PPC970_Unit = 1, hasSideEffects = 0 in { // FXU Operations.
2786
2852
// XO-Form instructions. Arithmetic instructions that can set overflow bit
2787
2853
let isCommutable = 1 in
2788
- defm ADD4 : XOForm_1r <31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2789
- "add", "$rT, $rA, $rB", IIC_IntSimple,
2790
- [(set i32:$rT, (add i32:$rA, i32:$rB))]>;
2854
+ defm ADD4 : XOForm_1rx <31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2855
+ "add", "$rT, $rA, $rB", IIC_IntSimple,
2856
+ [(set i32:$rT, (add i32:$rA, i32:$rB))]>;
2791
2857
let isCodeGenOnly = 1 in
2792
2858
def ADD4TLS : XOForm_1<31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, tlsreg32:$rB),
2793
2859
"add $rT, $rA, $rB", IIC_IntSimple,
@@ -2804,38 +2870,28 @@ defm DIVW : XOForm_1rcr<31, 491, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2804
2870
defm DIVWU : XOForm_1rcr<31, 459, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2805
2871
"divwu", "$rT, $rA, $rB", IIC_IntDivW,
2806
2872
[(set i32:$rT, (udiv i32:$rA, i32:$rB))]>;
2807
- def DIVWE : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2808
- "divwe $rT, $rA, $rB", IIC_IntDivW,
2809
- [(set i32:$rT, (int_ppc_divwe gprc:$rA, gprc:$rB))]>,
2810
- Requires<[HasExtDiv]>;
2811
- let Defs = [CR0] in
2812
- def DIVWEo : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2813
- "divwe. $rT, $rA, $rB", IIC_IntDivW,
2814
- []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2815
- Requires<[HasExtDiv]>;
2816
- def DIVWEU : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2817
- "divweu $rT, $rA, $rB", IIC_IntDivW,
2818
- [(set i32:$rT, (int_ppc_divweu gprc:$rA, gprc:$rB))]>,
2819
- Requires<[HasExtDiv]>;
2820
- let Defs = [CR0] in
2821
- def DIVWEUo : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2822
- "divweu. $rT, $rA, $rB", IIC_IntDivW,
2823
- []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2824
- Requires<[HasExtDiv]>;
2873
+ defm DIVWE : XOForm_1rcr<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2874
+ "divwe", "$rT, $rA, $rB", IIC_IntDivW,
2875
+ [(set i32:$rT, (int_ppc_divwe gprc:$rA, gprc:$rB))]>,
2876
+ Requires<[HasExtDiv]>;
2877
+ defm DIVWEU : XOForm_1rcr<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2878
+ "divweu", "$rT, $rA, $rB", IIC_IntDivW,
2879
+ [(set i32:$rT, (int_ppc_divweu gprc:$rA, gprc:$rB))]>,
2880
+ Requires<[HasExtDiv]>;
2825
2881
let isCommutable = 1 in {
2826
2882
defm MULHW : XOForm_1r<31, 75, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2827
2883
"mulhw", "$rT, $rA, $rB", IIC_IntMulHW,
2828
2884
[(set i32:$rT, (mulhs i32:$rA, i32:$rB))]>;
2829
2885
defm MULHWU : XOForm_1r<31, 11, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2830
2886
"mulhwu", "$rT, $rA, $rB", IIC_IntMulHWU,
2831
2887
[(set i32:$rT, (mulhu i32:$rA, i32:$rB))]>;
2832
- defm MULLW : XOForm_1r <31, 235, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2833
- "mullw", "$rT, $rA, $rB", IIC_IntMulHW,
2834
- [(set i32:$rT, (mul i32:$rA, i32:$rB))]>;
2888
+ defm MULLW : XOForm_1rx <31, 235, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2889
+ "mullw", "$rT, $rA, $rB", IIC_IntMulHW,
2890
+ [(set i32:$rT, (mul i32:$rA, i32:$rB))]>;
2835
2891
} // isCommutable
2836
- defm SUBF : XOForm_1r <31, 40, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2837
- "subf", "$rT, $rA, $rB", IIC_IntGeneral,
2838
- [(set i32:$rT, (sub i32:$rB, i32:$rA))]>;
2892
+ defm SUBF : XOForm_1rx <31, 40, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2893
+ "subf", "$rT, $rA, $rB", IIC_IntGeneral,
2894
+ [(set i32:$rT, (sub i32:$rB, i32:$rA))]>;
2839
2895
defm SUBFC : XOForm_1rc<31, 8, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2840
2896
"subfc", "$rT, $rA, $rB", IIC_IntGeneral,
2841
2897
[(set i32:$rT, (subc i32:$rB, i32:$rA))]>,
0 commit comments