aboutsummaryrefslogblamecommitdiff
path: root/lib/Target/Hexagon/HexagonIntrinsics.td
blob: 99f59d5ea669fc4eb8640bcad9c884fd7cbee220 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623








































































































































































































































































































































































































































































































































































                                                                                



































































































































































































































































                                                                               




                                                                        





































































































































                                                                               










                                                                             



















































































































































































































































































































































































































































































































































































































































































                                                                                











                                                                  

















































































































































































































                                                                               









                                                                           





                                                                      
                   
                                                                   
                    


                                                                    
                   
                                                                   
                     
                                                                     
                   
                                                                   
                  
                                                                  
                    
                                                                    
                   


                                                                   
                   


                                                                   
                   
                                                                   
                     


                                                                     
                     
                                                                     
                     
                                                                     
                     
                                                                     
                     


                                                                     
                   






                                                                      
                        
                                                                        
                          
                                                                          
                          
                                                                          
                          
                                                                          
                          
                                                                          
                         


                                                                         
                   
                                                                   
                     
                                                                     
                     
                                                                     
                     


                                                                     
                    
                                                                    
                    




                                                                             
                    
                                                                    
                    
                                                                    
                    
                                                                    
                    






                                                                      
                     
                                                                     
                      
                                                                      
                      
                                                                      
                       
                                                                       
                     
                                                                     
                      
                                                                      
                      
                                                                      
                       
                                                                       
                     
                                                                     
                      







                                                                      
                      
                                                                      
                       
                                                                       
                        


                                                                        
                      
                                                                      
                       
                                                                       
                       


                                                                       
                      
                                                                      
                       
                                                                       
                        






                                                                        
                    
                                                                    
                      




                                                                      
                           
                                                                           
                           

                                                                           
                               
                                                                               
                               

                                                                               
                           
                                                                           
                           
                                                                           
                           
                                                                           
                           

                                                                           
                               
                                                                               
                               
                                                                               
                               
                                                                               
                               


                                                                               
                      
                                                                      
                      
                                                                      
                       


                                                                       
                    
                                                                    
                   
                                                                   
                    


                                                                    
                   
                                                                   
                    


                                                                    
                   
                                                                   
                    


                                                                    
                    
                                                                    
                      




                                                                      
                           
                                                                           
                           

                                                                           
                               
                                                                               
                               

                                                                               
                           
                                                                           
                           
                                                                           
                           
                                                                           
                           

                                                                           
                               
                                                                               
                               
                                                                               
                               
                                                                               
                               


                                                                               
                    






                                                                      
                       






                                                                       
                      






                                                                      
                      
                                                                      
                       


                                                                       
                      
                                                                      
                       


                                                                       
                       
                                                                       
                        


                                                                        
                      
                                                                      
                      


                                                                      
                      
                                                                      
                       


                                                                       
                    








                                                                      
                     
                                                                     
                      
                                                                      
                       



                                                                       
                     
                                                                     
                       
                                                                       
                      
                                                                      
                      
                                                                      
                       
                                                                       
                      
                                                                      
                        
                                                                        
                       


                                                                       
                       
                                                                       
                       
                                                                       
                        


                                                                        
                     
                                                                     
                      


                                                                      
                     
                                                                     
                      


                                                                      
                     
                                                                     
                      
                                                                      
                       








                                                                       
                     
                                                                     
                      


                                                                     
                      
                                                                      
                       
                                                                       
                     
                                                                     
                       
                                                                       
                      
                                                                      
                      
                                                                      
                        
                                                                        
                       


                                                                       
                       
                                                                       
                       
                                                                       
                        


                                                                        
                     
                                                                     
                      


                                                                      
                     
                                                                     
                      


                                                                      
                     
                                                                     
                      







                                                                      
                    
                                                                    
                    


                                                                    
                         
                                                                         
                   
                                                                   
                    
                                                                    
                   
                                                                   
                  
                                                                  
                   
                                                                   
                   







                                                                      
                    
                                                                    
                     
                                                                     
                     
                                                                     
                      


                                                                      
                      


                                                                      
                         
                                                                         
                         


                                                                         
                        








                                                                        
                        
                                                                        
                        
                                                                        
                         
                                                                         
                         

                                                                         
                        
                                                                        
                        
                                                                        
                         
                                                                         
                         

                                                                         
                        
                                                                        
                        
                                                                        
                         
                                                                         
                         


                                                                         
                        
                                                                        
                        

                                                                        
                        
                                                                        
                        



                                                                        
                         
                                                                         
                         

                                                                         
                          
                                                                          
                          


                                                                          
                              
                                                                              
                              

                                                                              
                              
                                                                              
                              

                                                                              
                              
                                                                              
                              


                                                                              
                          
                                                                          
                          

                                                                          
                           
                                                                           
                           

                                                                           
                          
                                                                          
                          

                                                                          
                           
                                                                           
                           







                                                                           



                                                                      
                                                                        


                                                                      
                                                                    
                     
                                                                     
                      
                                                                      
                    
                                                                    
                      




                                                                      
                         
                                                                         
                        
                                                                        
                         
                                                                         
                        
                                                                        
                         
                                                                         
                        
                                                                        
                         
                                                                         
                        
                                                                        
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         




                                                                         
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         
                                                                         
                          
                                                                          
                         
                                                                         
                           
                                                                           
                          
                                                                          
                           
                                                                           
                          
                                                                          
                           
                                                                           
                          
                                                                          
                           
                                                                           
                          


                                                                          
                          
                                                                          
                          
                                                                          
                      
                                                                      
                              
                                                                              
                       


                                                                       
                          
                                                                          
                              
                                                                              
                              
                                                                              
                          
                                                                          
                              
                                                                              
                              









                                                                              
                         
                                                                        
                         
                                                                        
                             
                                                                            
                                 
                                                                                
                             
                                                                            
                             
                                                                            
                                 
                                                                                
                             

                                                                            
                         
                                                                        
                         
                                                                        
                             
                                                                            
                                 
                                                                                
                             
                                                                            
                             
                                                                            
                                 
                                                                                
                             

                                                                            
                         
                                                                        
                         
                                                                        
                             
                                                                            
                                 
                                                                                
                             
                                                                            
                             
                                                                            
                                 
                                                                                
                             

                                                                            
                         
                                                                        
                         
                                                                        
                             
                                                                            
                                 
                                                                                
                             
                                                                            
                             
                                                                            
                                 
                                                                                
                             


                                                                            
                          
                                                                         
                          
                                                                         
                              
                                                                             
                              

                                                                             
                          
                                                                         
                          
                                                                         
                              
                                                                             
                              

                                                                             
                          
                                                                         
                          
                                                                         
                              
                                                                             
                              

                                                                             
                          
                                                                         
                          
                                                                         
                              
                                                                             
                              


                                                                             
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 


                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 

                                                                               
                             
                                                                           
                             
                                                                           
                                 
                                                                               
                                 


                                                                               
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              


                                                                            
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              

                                                                            
                              
                                                                            
                              



                                                                            
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          


                                                                         
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           


                                                                          
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              


                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              
                                                                               
                              


                                                                               
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               


                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               
                                                                             
                               







                                                                             
                       
                                                                      
                           


                                                                          
                       
                                                                      
                           






                                                                          
                         
                                                                        
                         
                                                                        
                         
                                                                        
                         


                                                                        
                          
                                                                         
                          


                                                                         
                          
                                                                         
                          
                                                                         
                       
                                                                      
                          
                                                                         
                          


                                                                         
                         
                                                                        
                         
                                                                        
                     
                                                                    
                         
                                                                        
                         


                                                                        
                             
                                                                            
                             



                                                                            
                        
                                                                       
                        







                                                                       
                   
                                                                  
                    
                                                                   
                      


                                                                     
                    
                                                                   
                      


                                                                     
                    


                                                                   
                    







                                                                      
                   
                                                                  
                    
                                                                   
                   
                                                                  
                    
                                                                   
                   
                                                                  
                    
                                                                   
                       


                                                                      
                   
                                                                  
                   


                                                                  
                       
                                                                      
                        
                                                                       
                       



                                                                      
                        
                                                                       
                           
                                                                          
                         
                                                                        
                            


                                                                           
                      
                                                                     
                         
                                                                        
                       
                                                                      
                          


                                                                         
                          
                                                                            
                            


                                                                                
                    


                                                                   
                    


                                                                   
                        
                                                                       
                           
                                                                            
                        
                                                                       
                        
                                                                       
                           
                                                                            
                        


                                                                       
                        
                                                                       
                        







                                                                       
                     


                                                                    
                        







                                                                       
                   
                                                                  
                    
                                                                   
                    
                                                                   
                     
                                                                    
                     


                                                                    
                    



                                                                   
                        
                                                                       
                        


                                                                       
                          
                                                                         
                           


                                                                          
                       
                                                                      
                      
                                                                     
                        
                                                                       
                       
                                                                      
                      
                                                                     
                       


                                                                      
                             
                                                                            
                              
                                                                             
                             
                                                                            
                              


                                                                             
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       


                                                                      
                        


                                                                       
                        


                                                                       
                         
                                                                        
                         


                                                                        
                      
                                                                     
                      


                                                                     
                        
                                                                       
                        
                                                                       
                        
                                                                       
                        


                                                                       
                      
                                                                     
                      







                                                                      
                    


                                                                  
                     
                                                                   
                     


                                                                   
                       







                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       


                                                                      
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           


                                                                          
                           


                                                                          
                           
                                                                          
                           
                                                                          
                           

                                                                          
                            
                                                                           
                            

                                                                           
                          
                                                                         
                          
                                                                         
                          

                                                                         
                           
                                                                          
                           
                                                                          
                           

                                                                          
                            
                                                                           
                            

                                                                           
                          
                                                                         
                          
                                                                         
                          


                                                                         
                           
                                                                          
                                      


                                                                                
                           


                                                                          
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       
                                                                      
                       


                                                                      
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           

                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           


                                                                          
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           

                                                                          
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          

                                                                         
                           
                                                                          
                           
                                                                          
                           
                                                                          
                           

                                                                          
                          
                                                                         
                          
                                                                         
                          
                                                                         
                          


                                                                         
                           
                                                                          
                           


                                                                          
                                    
                                                                               
                                    
                                                                               
                                    
                                                                               
                                    








                                                                               
                     
                                                                    
                        



                                                                       
                        
                                                                       
                        
                                                                       
                        



                                                                       
                        
                                                                       
                        
                                                                       
                        
                                                                       
                        







                                                                       
                     
                                                                    
                        



                                                                       
                        
                                                                       
                        
                                                                       
                        



                                                                       
                        
                                                                       
                        
                                                                       
                        
                                                                       
                        


                                                                       
                              
                                                                             
                              

                                                                             



                                                                     

                                
                                
//===-- HexagonIntrinsics.td - Instruction intrinsics ------*- tablegen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// This is populated based on the following specs:
// Hexagon V2 Architecture
// Application-Level Specification
// 80-V9418-8 Rev. B
// March 4, 2008
//===----------------------------------------------------------------------===//

//
// ALU 32 types.
//

class qi_ALU32_sisi<string opc, Intrinsic IntID>
  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class qi_ALU32_sis10<string opc, Intrinsic IntID>
  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class qi_ALU32_sis8<string opc, Intrinsic IntID>
  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class qi_ALU32_siu8<string opc, Intrinsic IntID>
  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u8Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class qi_ALU32_siu9<string opc, Intrinsic IntID>
  : ALU32_rr<(outs PredRegs:$dst), (ins IntRegs:$src1, u9Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_ALU32_qisisi<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
                                      IntRegs:$src3),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
                                        IntRegs:$src3))]>;

class si_ALU32_qis8si<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2,
                                       IntRegs:$src3),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, $src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2,
                                        IntRegs:$src3))]>;

class si_ALU32_qisis8<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2,
                                       s8Imm:$src3),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
                                        imm:$src3))]>;

class si_ALU32_qis8s8<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s8Imm:$src2, s8Imm:$src3),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;

class si_ALU32_sisi<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU32_sisi_sat<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU32_sisi_rnd<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU32_sis16<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s16Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_ALU32_sis10<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, s10Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_ALU32_s10si<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins s10Imm:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "(#$src1, $src2)")),
             [(set IntRegs:$dst, (IntID imm:$src1, IntRegs:$src2))]>;

class si_lo_ALU32_siu16<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
             !strconcat("$dst.l = ", !strconcat(opc , "#$src2")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_hi_ALU32_siu16<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, u16Imm:$src2),
             !strconcat("$dst.h = ", !strconcat(opc , "#$src2")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_ALU32_s16<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins s16Imm:$src1),
             !strconcat("$dst = ", !strconcat(opc , "#$src1")),
             [(set IntRegs:$dst, (IntID imm:$src1))]>;

class di_ALU32_s8<string opc, Intrinsic IntID>
  : ALU32_rr<(outs DoubleRegs:$dst), (ins s8Imm:$src1),
             !strconcat("$dst = ", !strconcat(opc , "#$src1")),
             [(set DoubleRegs:$dst, (IntID imm:$src1))]>;

class di_ALU64_di<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "$src")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;

class si_ALU32_si<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "($src)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

class si_ALU32_si_tfr<string opc, Intrinsic IntID>
  : ALU32_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "$src")),
             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

//
// ALU 64 types.
//

class si_ALU64_si_sat<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

class si_ALU64_didi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class di_ALU64_sidi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;

class di_ALU64_didi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_ALU64_qididi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2,
                                          DoubleRegs:$src3),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2,
                                           DoubleRegs:$src3))]>;

class di_ALU64_sisi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_ALU64_didi_sat<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_ALU64_didi_rnd<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_ALU64_didi_crnd<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_ALU64_didi_rnd_sat<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_ALU64_didi_crnd_sat<string opc, Intrinsic IntID>
  : ALU64_rr<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):crnd:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class qi_ALU64_didi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs PredRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set PredRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class si_ALU64_sisi<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_sat_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_sat_hh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_sat_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_sat_hl<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_sat_ll<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_hh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_hl<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_l16_ll<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_sat_hh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1.H, $src2.H):sat:<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_sat_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1.L, $src2.H):sat:<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_sat_hl<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1.H, $src2.L):sat:<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_sat_ll<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1.L, $src2.L):sat:<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_hh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_hl<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_h16_ll<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<16")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_lh<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_ll<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_ALU64_sisi_sat<string opc, Intrinsic IntID>
  : ALU64_rr<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

//
// SInst classes.
//

class qi_SInst_qi<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "($src)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src))]>;

class qi_SInst_qi_pxfer<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "$src")),
             [(set PredRegs:$dst, (IntID IntRegs:$src))]>;

class qi_SInst_qiqi<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class qi_SInst_qiqi_neg<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, !$src2)")),
             [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_SInst_di<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "($src)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;

class di_SInst_di_sat<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src),
             !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src))]>;

class si_SInst_di<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "($src)")),
          [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;

class si_SInst_di_sat<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
          [(set IntRegs:$dst, (IntID DoubleRegs:$src))]>;

class di_SInst_disi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;

class di_SInst_didi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class di_SInst_si<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1),
          !strconcat("$dst = ", !strconcat(opc , "($src1)")),
          [(set DoubleRegs:$dst, (IntID IntRegs:$src1))]>;

class si_SInst_sisiu3<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2, u3Imm:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2,
                                     imm:$src3))]>;

class si_SInst_diu5<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, u5Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;

class si_SInst_disi<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;

class si_SInst_sidi<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, DoubleRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, DoubleRegs:$src2))]>;

class di_SInst_disisi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2,
                                       IntRegs:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2,
                                        IntRegs:$src3))]>;

class di_SInst_sisi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class qi_SInst_siu5<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
          [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class qi_SInst_siu6<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, u6Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
          [(set PredRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class qi_SInst_sisi<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set PredRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_SInst_si<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "($src)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

class si_SInst_si_sat<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "($src):sat")),
          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

class di_SInst_qi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins IntRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "($src)")),
          [(set DoubleRegs:$dst, (IntID IntRegs:$src))]>;

class si_SInst_qi<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "$src")),
          [(set IntRegs:$dst, (IntID IntRegs:$src))]>;

class si_SInst_qiqi<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class qi_SInst_si<string opc, Intrinsic IntID>
  : SInst<(outs PredRegs:$dst), (ins IntRegs:$src),
          !strconcat("$dst = ", !strconcat(opc , "$src")),
          [(set PredRegs:$dst, (IntID IntRegs:$src))]>;

class si_SInst_sisi<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_SInst_diu6<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2))]>;

class si_SInst_siu5<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_SInst_siu5_rnd<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2):rnd")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_SInst_siu5u5<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, u5Imm:$src2, u5Imm:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2, imm:$src3))]>;

class si_SInst_sisisi_acc<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
              !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         IntRegs:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisisi_nac<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
              !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         IntRegs:$src2))],
              "$dst2 = $dst">;

class di_SInst_didisi_acc<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_SInst_didisi_nac<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           IntRegs:$src2),
          !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                        DoubleRegs:$src1, IntRegs:$src2))],
          "$dst2 = $dst">;

class si_SInst_sisiu5u5<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2, u5Imm:$src3),
              !strconcat("$dst = ", !strconcat(opc ,
                                               "($src1, #$src2, #$src3)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2, imm:$src3))],
              "$dst2 = $dst">;

class si_SInst_sisidi<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        DoubleRegs:$src2),
              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         DoubleRegs:$src2))],
              "$dst2 = $dst">;

class di_SInst_didiu6u6<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u6Imm:$src2, u6Imm:$src3),
              !strconcat("$dst = ", !strconcat(opc ,
                                               "($src1, #$src2, #$src3)")),
              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                            imm:$src2, imm:$src3))],
              "$dst2 = $dst">;

class di_SInst_dididi<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           DoubleRegs:$src2),
              !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                            DoubleRegs:$src1,
                                            DoubleRegs:$src2))],
              "$dst2 = $dst">;

class di_SInst_diu6u6<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, u6Imm:$src2,
                                       u6Imm:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2, #$src3)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, imm:$src2,
                                        imm:$src3))]>;

class di_SInst_didiqi<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
                                       IntRegs:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, $src3)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
                                        IntRegs:$src3))]>;

class di_SInst_didiu3<string opc, Intrinsic IntID>
  : SInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2,
                                       u3Imm:$src3),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2, #$src3)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2,
                                        imm:$src3))]>;

class di_SInst_didisi_or<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           IntRegs:$src2),
          !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                        IntRegs:$src2))],
          "$dst2 = $dst">;

class di_SInst_didisi_and<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           IntRegs:$src2),
          !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                        IntRegs:$src2))],
          "$dst2 = $dst">;

class di_SInst_didiu6_and<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u6Imm:$src2),
          !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                        imm:$src2))],
          "$dst2 = $dst">;

class di_SInst_didiu6_or<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u6Imm:$src2),
          !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                        imm:$src2))],
          "$dst2 = $dst">;

class di_SInst_didiu6_xor<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u6Imm:$src2),
          !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
          [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                        imm:$src2))],
          "$dst2 = $dst">;

class si_SInst_sisisi_and<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
              !strconcat("$dst &= ", !strconcat(opc , "($src1, $src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         IntRegs:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisisi_or<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
              !strconcat("$dst |= ", !strconcat(opc , "($src1, $src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         IntRegs:$src2))],
              "$dst2 = $dst">;


class si_SInst_sisiu5_and<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2),
              !strconcat("$dst &= ", !strconcat(opc , "($src1, #$src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisiu5_or<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2),
              !strconcat("$dst |= ", !strconcat(opc , "($src1, #$src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisiu5_xor<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2),
              !strconcat("$dst ^= ", !strconcat(opc , "($src1, #$src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisiu5_acc<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2),
              !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2))],
              "$dst2 = $dst">;

class si_SInst_sisiu5_nac<string opc, Intrinsic IntID>
  : SInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u5Imm:$src2),
              !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
              [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                         imm:$src2))],
              "$dst2 = $dst">;

class di_SInst_didiu6_acc<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u5Imm:$src2),
              !strconcat("$dst += ", !strconcat(opc , "($src1, #$src2)")),
              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                            DoubleRegs:$src1, imm:$src2))],
              "$dst2 = $dst">;

class di_SInst_didiu6_nac<string opc, Intrinsic IntID>
  : SInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           u5Imm:$src2),
              !strconcat("$dst -= ", !strconcat(opc , "($src1, #$src2)")),
              [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, DoubleRegs:$src1,
                                            imm:$src2))],
              "$dst2 = $dst">;


//
// MInst classes.
//

class di_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):<<1:rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.L):<<1:rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.L):rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.H):<<1:rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.H):rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.L):<<1:rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.L):rnd")),
               [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_disisi_acc<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_nac<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_acc_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_nac_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_acc_sat_conj<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_nac_sat_conj<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst -= ", !strconcat(opc , "($src1, $src2*):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_nac_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst -= ", !strconcat(opc ,
                                               "($src1, $src2):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_acc_s1_sat_conj<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst += ", !strconcat(opc ,
                                               "($src1, $src2*):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_disisi_nac_s1_sat_conj<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
             !strconcat("$dst -= ", !strconcat(opc ,
                                               "($src1, $src2*):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2))],
             "$dst2 = $dst">;

class di_MInst_s8s8<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins s8Imm:$src1, s8Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "(#$src1, #$src2)")),
             [(set DoubleRegs:$dst, (IntID imm:$src1, imm:$src2))]>;

class si_MInst_sis9<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, s9Imm:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, #$src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, imm:$src2))]>;

class si_MInst_sisi<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_hh<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_lh<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_hl<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_ll<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;


class si_MInst_sisi_hh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):<<1")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_lh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):<<1")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_hl<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):<<1")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_ll<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):<<1")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_up<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_didi<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_MInst_didi_conj<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*)")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_MInst_sisi_s1_sat_conj<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2*):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):<<1:rnd:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_MInst_didi_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class di_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):rnd:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class si_SInst_sisi_sat<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
          [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_SInst_didi_sat<string opc, Intrinsic IntID>
  : SInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
          !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
          [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class si_SInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_l_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2.L):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_h_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2.H):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_sat_conj<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2*):rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_s1_rnd_sat_conj<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2*):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):rnd:sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisisi_xacc<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3),
             !strconcat("$dst ^= ", !strconcat(opc , "($src2, $src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3))],
             "$dst2 = $dst">;

class si_MInst_sisisi_acc<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3),
             !strconcat("$dst += ", !strconcat(opc , "($src2, $src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3))],
             "$dst2 = $dst">;

class si_MInst_sisisi_nac<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3),
             !strconcat("$dst -= ", !strconcat(opc , "($src2, $src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                        IntRegs:$src3))],
             "$dst2 = $dst">;

class si_MInst_sisis8_acc<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        s8Imm:$src3),
             !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                        imm:$src3))],
             "$dst2 = $dst">;

class si_MInst_sisis8_nac<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        s8Imm:$src3),
             !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
             [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                        imm:$src3))],
             "$dst2 = $dst">;

class si_MInst_sisiu4u5<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        u4Imm:$src2, u5Imm:$src3),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1, #$src2, #$src3)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          imm:$src2, imm:$src3))],
               "$dst2 = $dst">;

class si_MInst_sisiu8_acc<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        u8Imm:$src3),
               !strconcat("$dst += ", !strconcat(opc , "($src2, #$src3)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                          imm:$src3))],
               "$dst2 = $dst">;

class si_MInst_sisiu8_nac<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src2,
                                        u8Imm:$src3),
               !strconcat("$dst -= ", !strconcat(opc , "($src2, #$src3)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src2,
                                          imm:$src3))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_sat_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_acc_sat_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):<<1")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hh_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hh_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hl_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_hl_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.H, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_lh_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_lh_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_ll_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_sisisi_nac_ll_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs IntRegs:$dst), (ins IntRegs:$dst2, IntRegs:$src1,
                                        IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc ,
                                                 "($src1.L, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$dst2, IntRegs:$src1,
                                          IntRegs:$src2))],
               "$dst2 = $dst">;

class di_ALU32_sisi<string opc, Intrinsic IntID>
  : ALU32_rr<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):sat")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_sat_conj<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2*):sat")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_sisi_s1_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_didi_s1_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1,
                                           DoubleRegs:$src2))]>;

class si_MInst_didi_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc ,
                                              "($src1, $src2):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class si_MInst_didi_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):rnd:sat")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

class si_MInst_sisi_sat_hh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.H):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_hl<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.H, $src2.L):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_lh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.H):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.H):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_ll<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1.L, $src2.L):sat")),
             [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.L, $src2.L):<<1:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_hh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_hh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ", !strconcat(opc ,
                                                "($src1.H, $src2.H):<<1:rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_hh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc ,
                                     "($src1.H, $src2.H):<<1:rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_hl<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.H, $src2.L):rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.H, $src2.L):<<1:rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_hl<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.H, $src2.L):rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_hl_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.H, $src2.L):<<1:rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_lh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.H):rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_lh<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.H):rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.H):<<1:rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_lh_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.H):<<1:rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_ll<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.L):rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_sat_rnd_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.L):<<1:rnd:sat")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_ll<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.L):rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class si_MInst_sisi_rnd_ll_s1<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins IntRegs:$src1, IntRegs:$src2),
               !strconcat("$dst = ",
                          !strconcat(opc , "($src1.L, $src2.L):<<1:rnd")),
               [(set IntRegs:$dst, (IntID IntRegs:$src1, IntRegs:$src2))]>;

class di_MInst_dididi_acc_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
                                           DoubleRegs:$src1, DoubleRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2):sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_dididi_acc_rnd_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):rnd:sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_dididi_acc_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
                                           DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;


class di_MInst_dididi_acc_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2,
                                           DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):<<1:sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_dididi_acc_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_dididi_acc<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_dididi_acc_conj<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           DoubleRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1, $src2*)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             DoubleRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.H)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.H, $src2.L)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.H)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ", !strconcat(opc , "($src1.L, $src2.L)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1.H, $src2.H):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1.H, $src2.L):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1.L, $src2.H):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1.L, $src2.L):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_hh<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.H)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_hl<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.H, $src2.L)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_lh<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.H)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_ll<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ", !strconcat(opc , "($src1.L, $src2.L)")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_hh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ",
                          !strconcat(opc , "($src1.H, $src2.H):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_hl_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ",
                          !strconcat(opc , "($src1.H, $src2.L):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_lh_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ",
                          !strconcat(opc , "($src1.L, $src2.H):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_nac_ll_s1<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst -= ",
                          !strconcat(opc , "($src1.L, $src2.L):<<1")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disisi_acc_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, IntRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):<<1:sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2, IntRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class di_MInst_disi_s1_sat<string opc, Intrinsic IntID>
  : MInst<(outs DoubleRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2):<<1:sat")),
             [(set DoubleRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;

class di_MInst_didisi_acc_s1_sat<string opc, Intrinsic IntID>
  : MInst_acc<(outs DoubleRegs:$dst), (ins DoubleRegs:$dst2, DoubleRegs:$src1,
                                           IntRegs:$src2),
               !strconcat("$dst += ",
                          !strconcat(opc , "($src1, $src2):<<1:sat")),
               [(set DoubleRegs:$dst, (IntID DoubleRegs:$dst2,
                                             DoubleRegs:$src1,
                                             IntRegs:$src2))],
               "$dst2 = $dst">;

class si_MInst_disi_s1_rnd_sat<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, IntRegs:$src2),
             !strconcat("$dst = ",
                        !strconcat(opc , "($src1, $src2):<<1:rnd:sat")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, IntRegs:$src2))]>;

class si_MInst_didi<string opc, Intrinsic IntID>
  : MInst<(outs IntRegs:$dst), (ins DoubleRegs:$src1, DoubleRegs:$src2),
             !strconcat("$dst = ", !strconcat(opc , "($src1, $src2)")),
             [(set IntRegs:$dst, (IntID DoubleRegs:$src1, DoubleRegs:$src2))]>;

//
// LDInst classes.
//
let mayLoad = 1, neverHasSideEffects = 1 in
class di_LDInstPI_diu4<string opc, Intrinsic IntID>
  : LDInstPI<(outs IntRegs:$dst, DoubleRegs:$dst2),
           (ins IntRegs:$src1, IntRegs:$src2, CRRegs:$src3, s4Imm:$offset),
           "$dst2 = memd($src1++#$offset:circ($src3))",
           [],
           "$src1 = $dst">;

/********************************************************************
*            ALU32/ALU                                              *
*********************************************************************/

// ALU32 / ALU / Add.
def HEXAGON_A2_add:
  si_ALU32_sisi                   <"add",      int_hexagon_A2_add>;
def HEXAGON_A2_addi:
  si_ALU32_sis16                  <"add",      int_hexagon_A2_addi>;

// ALU32 / ALU / Logical operations.
def HEXAGON_A2_and:
  si_ALU32_sisi                   <"and",      int_hexagon_A2_and>;
def HEXAGON_A2_andir:
  si_ALU32_sis10                  <"and",      int_hexagon_A2_andir>;
def HEXAGON_A2_not:
  si_ALU32_si                     <"not",      int_hexagon_A2_not>;
def HEXAGON_A2_or:
  si_ALU32_sisi                   <"or",       int_hexagon_A2_or>;
def HEXAGON_A2_orir:
  si_ALU32_sis10                  <"or",       int_hexagon_A2_orir>;
def HEXAGON_A2_xor:
  si_ALU32_sisi                   <"xor",      int_hexagon_A2_xor>;

// ALU32 / ALU / Negate.
def HEXAGON_A2_neg:
  si_ALU32_si                     <"neg",      int_hexagon_A2_neg>;

// ALU32 / ALU / Subtract.
def HEXAGON_A2_sub:
  si_ALU32_sisi                   <"sub",      int_hexagon_A2_sub>;
def HEXAGON_A2_subri:
  si_ALU32_s10si                  <"sub",      int_hexagon_A2_subri>;

// ALU32 / ALU / Transfer Immediate.
def HEXAGON_A2_tfril:
  si_lo_ALU32_siu16               <"",         int_hexagon_A2_tfril>;
def HEXAGON_A2_tfrih:
  si_hi_ALU32_siu16               <"",         int_hexagon_A2_tfrih>;
def HEXAGON_A2_tfrsi:
  si_ALU32_s16                    <"",         int_hexagon_A2_tfrsi>;
def HEXAGON_A2_tfrpi:
  di_ALU32_s8                     <"",         int_hexagon_A2_tfrpi>;

// ALU32 / ALU / Transfer Register.
def HEXAGON_A2_tfr:
  si_ALU32_si_tfr                  <"",        int_hexagon_A2_tfr>;

/********************************************************************
*            ALU32/PERM                                             *
*********************************************************************/

// ALU32 / PERM / Combine.
def HEXAGON_A2_combinew:
  di_ALU32_sisi                   <"combine",  int_hexagon_A2_combinew>;
def HEXAGON_A2_combine_hh:
  si_MInst_sisi_hh                <"combine",  int_hexagon_A2_combine_hh>;
def HEXAGON_A2_combine_lh:
  si_MInst_sisi_lh                <"combine",  int_hexagon_A2_combine_lh>;
def HEXAGON_A2_combine_hl:
  si_MInst_sisi_hl                <"combine",  int_hexagon_A2_combine_hl>;
def HEXAGON_A2_combine_ll:
  si_MInst_sisi_ll                <"combine",  int_hexagon_A2_combine_ll>;
def HEXAGON_A2_combineii:
  di_MInst_s8s8                   <"combine",  int_hexagon_A2_combineii>;

// ALU32 / PERM / Mux.
def HEXAGON_C2_mux:
  si_ALU32_qisisi                 <"mux",      int_hexagon_C2_mux>;
def HEXAGON_C2_muxri:
  si_ALU32_qis8si                 <"mux",      int_hexagon_C2_muxri>;
def HEXAGON_C2_muxir:
  si_ALU32_qisis8                 <"mux",      int_hexagon_C2_muxir>;
def HEXAGON_C2_muxii:
  si_ALU32_qis8s8                 <"mux",      int_hexagon_C2_muxii>;

// ALU32 / PERM / Shift halfword.
def HEXAGON_A2_aslh:
  si_ALU32_si                     <"aslh",     int_hexagon_A2_aslh>;
def HEXAGON_A2_asrh:
  si_ALU32_si                     <"asrh",     int_hexagon_A2_asrh>;
def SI_to_SXTHI_asrh:
  si_ALU32_si                     <"asrh",     int_hexagon_SI_to_SXTHI_asrh>;

// ALU32 / PERM / Sign/zero extend.
def HEXAGON_A2_sxth:
  si_ALU32_si                     <"sxth",     int_hexagon_A2_sxth>;
def HEXAGON_A2_sxtb:
  si_ALU32_si                     <"sxtb",     int_hexagon_A2_sxtb>;
def HEXAGON_A2_zxth:
  si_ALU32_si                     <"zxth",     int_hexagon_A2_zxth>;
def HEXAGON_A2_zxtb:
  si_ALU32_si                     <"zxtb",     int_hexagon_A2_zxtb>;

/********************************************************************
*            ALU32/PRED                                             *
*********************************************************************/

// ALU32 / PRED / Compare.
def HEXAGON_C2_cmpeq:
  qi_ALU32_sisi                   <"cmp.eq",   int_hexagon_C2_cmpeq>;
def HEXAGON_C2_cmpeqi:
  qi_ALU32_sis10                  <"cmp.eq",   int_hexagon_C2_cmpeqi>;
def HEXAGON_C2_cmpgei:
  qi_ALU32_sis8                   <"cmp.ge",   int_hexagon_C2_cmpgei>;
def HEXAGON_C2_cmpgeui:
  qi_ALU32_siu8                   <"cmp.geu",  int_hexagon_C2_cmpgeui>;
def HEXAGON_C2_cmpgt:
  qi_ALU32_sisi                   <"cmp.gt",   int_hexagon_C2_cmpgt>;
def HEXAGON_C2_cmpgti:
  qi_ALU32_sis10                  <"cmp.gt",   int_hexagon_C2_cmpgti>;
def HEXAGON_C2_cmpgtu:
  qi_ALU32_sisi                   <"cmp.gtu",  int_hexagon_C2_cmpgtu>;
def HEXAGON_C2_cmpgtui:
  qi_ALU32_siu9                   <"cmp.gtu",  int_hexagon_C2_cmpgtui>;
def HEXAGON_C2_cmplt:
  qi_ALU32_sisi                   <"cmp.lt",   int_hexagon_C2_cmplt>;
def HEXAGON_C2_cmpltu:
  qi_ALU32_sisi                   <"cmp.ltu",  int_hexagon_C2_cmpltu>;

/********************************************************************
*            ALU32/VH                                               *
*********************************************************************/

// ALU32 / VH / Vector add halfwords.
// Rd32=vadd[u]h(Rs32,Rt32:sat]
def HEXAGON_A2_svaddh:
  si_ALU32_sisi                   <"vaddh",    int_hexagon_A2_svaddh>;
def HEXAGON_A2_svaddhs:
  si_ALU32_sisi_sat               <"vaddh",    int_hexagon_A2_svaddhs>;
def HEXAGON_A2_svadduhs:
  si_ALU32_sisi_sat               <"vadduh",   int_hexagon_A2_svadduhs>;

// ALU32 / VH / Vector average halfwords.
def HEXAGON_A2_svavgh:
  si_ALU32_sisi                   <"vavgh",    int_hexagon_A2_svavgh>;
def HEXAGON_A2_svavghs:
  si_ALU32_sisi_rnd               <"vavgh",    int_hexagon_A2_svavghs>;
def HEXAGON_A2_svnavgh:
  si_ALU32_sisi                   <"vnavgh",   int_hexagon_A2_svnavgh>;

// ALU32 / VH / Vector subtract halfwords.
def HEXAGON_A2_svsubh:
  si_ALU32_sisi                   <"vsubh",    int_hexagon_A2_svsubh>;
def HEXAGON_A2_svsubhs:
  si_ALU32_sisi_sat               <"vsubh",    int_hexagon_A2_svsubhs>;
def HEXAGON_A2_svsubuhs:
  si_ALU32_sisi_sat               <"vsubuh",   int_hexagon_A2_svsubuhs>;

/********************************************************************
*            ALU64/ALU                                              *
*********************************************************************/

// ALU64 / ALU / Add.
def HEXAGON_A2_addp:
  di_ALU64_didi                   <"add",      int_hexagon_A2_addp>;
def HEXAGON_A2_addsat:
  si_ALU64_sisi_sat               <"add",      int_hexagon_A2_addsat>;

// ALU64 / ALU / Add halfword.
// Even though the definition says hl, it should be lh -
//so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
def HEXAGON_A2_addh_l16_hl:
  si_ALU64_sisi_l16_lh            <"add",      int_hexagon_A2_addh_l16_hl>;
def HEXAGON_A2_addh_l16_ll:
  si_ALU64_sisi_l16_ll            <"add",      int_hexagon_A2_addh_l16_ll>;

def HEXAGON_A2_addh_l16_sat_hl:
  si_ALU64_sisi_l16_sat_lh        <"add",      int_hexagon_A2_addh_l16_sat_hl>;
def HEXAGON_A2_addh_l16_sat_ll:
  si_ALU64_sisi_l16_sat_ll        <"add",      int_hexagon_A2_addh_l16_sat_ll>;

def HEXAGON_A2_addh_h16_hh:
  si_ALU64_sisi_h16_hh            <"add",      int_hexagon_A2_addh_h16_hh>;
def HEXAGON_A2_addh_h16_hl:
  si_ALU64_sisi_h16_hl            <"add",      int_hexagon_A2_addh_h16_hl>;
def HEXAGON_A2_addh_h16_lh:
  si_ALU64_sisi_h16_lh            <"add",      int_hexagon_A2_addh_h16_lh>;
def HEXAGON_A2_addh_h16_ll:
  si_ALU64_sisi_h16_ll            <"add",      int_hexagon_A2_addh_h16_ll>;

def HEXAGON_A2_addh_h16_sat_hh:
  si_ALU64_sisi_h16_sat_hh        <"add",      int_hexagon_A2_addh_h16_sat_hh>;
def HEXAGON_A2_addh_h16_sat_hl:
  si_ALU64_sisi_h16_sat_hl        <"add",      int_hexagon_A2_addh_h16_sat_hl>;
def HEXAGON_A2_addh_h16_sat_lh:
  si_ALU64_sisi_h16_sat_lh        <"add",      int_hexagon_A2_addh_h16_sat_lh>;
def HEXAGON_A2_addh_h16_sat_ll:
  si_ALU64_sisi_h16_sat_ll        <"add",      int_hexagon_A2_addh_h16_sat_ll>;

// ALU64 / ALU / Compare.
def HEXAGON_C2_cmpeqp:
  qi_ALU64_didi                   <"cmp.eq",   int_hexagon_C2_cmpeqp>;
def HEXAGON_C2_cmpgtp:
  qi_ALU64_didi                   <"cmp.gt",   int_hexagon_C2_cmpgtp>;
def HEXAGON_C2_cmpgtup:
  qi_ALU64_didi                   <"cmp.gtu",  int_hexagon_C2_cmpgtup>;

// ALU64 / ALU / Logical operations.
def HEXAGON_A2_andp:
  di_ALU64_didi                   <"and",      int_hexagon_A2_andp>;
def HEXAGON_A2_orp:
  di_ALU64_didi                   <"or",       int_hexagon_A2_orp>;
def HEXAGON_A2_xorp:
  di_ALU64_didi                   <"xor",      int_hexagon_A2_xorp>;

// ALU64 / ALU / Maximum.
def HEXAGON_A2_max:
  si_ALU64_sisi                   <"max",      int_hexagon_A2_max>;
def HEXAGON_A2_maxu:
  si_ALU64_sisi                   <"maxu",     int_hexagon_A2_maxu>;

// ALU64 / ALU / Minimum.
def HEXAGON_A2_min:
  si_ALU64_sisi                   <"min",      int_hexagon_A2_min>;
def HEXAGON_A2_minu:
  si_ALU64_sisi                   <"minu",     int_hexagon_A2_minu>;

// ALU64 / ALU / Subtract.
def HEXAGON_A2_subp:
  di_ALU64_didi                   <"sub",      int_hexagon_A2_subp>;
def HEXAGON_A2_subsat:
  si_ALU64_sisi_sat               <"sub",      int_hexagon_A2_subsat>;

// ALU64 / ALU / Subtract halfword.
// Even though the definition says hl, it should be lh -
//so DON'T change the class " si_ALU64_sisi_l16_lh " it inherits.
def HEXAGON_A2_subh_l16_hl:
  si_ALU64_sisi_l16_lh            <"sub",      int_hexagon_A2_subh_l16_hl>;
def HEXAGON_A2_subh_l16_ll:
  si_ALU64_sisi_l16_ll            <"sub",      int_hexagon_A2_subh_l16_ll>;

def HEXAGON_A2_subh_l16_sat_hl:
  si_ALU64_sisi_l16_sat_lh        <"sub",      int_hexagon_A2_subh_l16_sat_hl>;
def HEXAGON_A2_subh_l16_sat_ll:
  si_ALU64_sisi_l16_sat_ll        <"sub",      int_hexagon_A2_subh_l16_sat_ll>;

def HEXAGON_A2_subh_h16_hh:
  si_ALU64_sisi_h16_hh            <"sub",      int_hexagon_A2_subh_h16_hh>;
def HEXAGON_A2_subh_h16_hl:
  si_ALU64_sisi_h16_hl            <"sub",      int_hexagon_A2_subh_h16_hl>;
def HEXAGON_A2_subh_h16_lh:
  si_ALU64_sisi_h16_lh            <"sub",      int_hexagon_A2_subh_h16_lh>;
def HEXAGON_A2_subh_h16_ll:
  si_ALU64_sisi_h16_ll            <"sub",      int_hexagon_A2_subh_h16_ll>;

def HEXAGON_A2_subh_h16_sat_hh:
  si_ALU64_sisi_h16_sat_hh        <"sub",      int_hexagon_A2_subh_h16_sat_hh>;
def HEXAGON_A2_subh_h16_sat_hl:
  si_ALU64_sisi_h16_sat_hl        <"sub",      int_hexagon_A2_subh_h16_sat_hl>;
def HEXAGON_A2_subh_h16_sat_lh:
  si_ALU64_sisi_h16_sat_lh        <"sub",      int_hexagon_A2_subh_h16_sat_lh>;
def HEXAGON_A2_subh_h16_sat_ll:
  si_ALU64_sisi_h16_sat_ll        <"sub",      int_hexagon_A2_subh_h16_sat_ll>;

// ALU64 / ALU / Transfer register.
def HEXAGON_A2_tfrp:
  di_ALU64_di                     <"",         int_hexagon_A2_tfrp>;

/********************************************************************
*            ALU64/BIT                                              *
*********************************************************************/

// ALU64 / BIT / Masked parity.
def HEXAGON_S2_parityp:
  si_ALU64_didi                   <"parity",   int_hexagon_S2_parityp>;

/********************************************************************
*            ALU64/PERM                                             *
*********************************************************************/

// ALU64 / PERM / Vector pack high and low halfwords.
def HEXAGON_S2_packhl:
  di_ALU64_sisi                   <"packhl",   int_hexagon_S2_packhl>;

/********************************************************************
*            ALU64/VB                                               *
*********************************************************************/

// ALU64 / VB / Vector add unsigned bytes.
def HEXAGON_A2_vaddub:
  di_ALU64_didi                   <"vaddub",   int_hexagon_A2_vaddub>;
def HEXAGON_A2_vaddubs:
  di_ALU64_didi_sat               <"vaddub",   int_hexagon_A2_vaddubs>;

// ALU64 / VB / Vector average unsigned bytes.
def HEXAGON_A2_vavgub:
  di_ALU64_didi                   <"vavgub",   int_hexagon_A2_vavgub>;
def HEXAGON_A2_vavgubr:
  di_ALU64_didi_rnd               <"vavgub",   int_hexagon_A2_vavgubr>;

// ALU64 / VB / Vector compare unsigned bytes.
def HEXAGON_A2_vcmpbeq:
  qi_ALU64_didi                   <"vcmpb.eq", int_hexagon_A2_vcmpbeq>;
def HEXAGON_A2_vcmpbgtu:
  qi_ALU64_didi                   <"vcmpb.gtu",int_hexagon_A2_vcmpbgtu>;

// ALU64 / VB / Vector maximum/minimum unsigned bytes.
def HEXAGON_A2_vmaxub:
  di_ALU64_didi                   <"vmaxub",   int_hexagon_A2_vmaxub>;
def HEXAGON_A2_vminub:
  di_ALU64_didi                   <"vminub",   int_hexagon_A2_vminub>;

// ALU64 / VB / Vector subtract unsigned bytes.
def HEXAGON_A2_vsubub:
  di_ALU64_didi                   <"vsubub",   int_hexagon_A2_vsubub>;
def HEXAGON_A2_vsububs:
  di_ALU64_didi_sat               <"vsubub",   int_hexagon_A2_vsububs>;

// ALU64 / VB / Vector mux.
def HEXAGON_C2_vmux:
  di_ALU64_qididi                 <"vmux",     int_hexagon_C2_vmux>;


/********************************************************************
*            ALU64/VH                                               *
*********************************************************************/

// ALU64 / VH / Vector add halfwords.
// Rdd64=vadd[u]h(Rss64,Rtt64:sat]
def HEXAGON_A2_vaddh:
  di_ALU64_didi                   <"vaddh",    int_hexagon_A2_vaddh>;
def HEXAGON_A2_vaddhs:
  di_ALU64_didi_sat               <"vaddh",    int_hexagon_A2_vaddhs>;
def HEXAGON_A2_vadduhs:
  di_ALU64_didi_sat               <"vadduh",   int_hexagon_A2_vadduhs>;

// ALU64 / VH / Vector average halfwords.
// Rdd64=v[n]avg[u]h(Rss64,Rtt64:rnd/:crnd][:sat]
def HEXAGON_A2_vavgh:
  di_ALU64_didi                   <"vavgh",    int_hexagon_A2_vavgh>;
def HEXAGON_A2_vavghcr:
  di_ALU64_didi_crnd              <"vavgh",    int_hexagon_A2_vavghcr>;
def HEXAGON_A2_vavghr:
  di_ALU64_didi_rnd               <"vavgh",    int_hexagon_A2_vavghr>;
def HEXAGON_A2_vavguh:
  di_ALU64_didi                   <"vavguh",   int_hexagon_A2_vavguh>;
def HEXAGON_A2_vavguhr:
  di_ALU64_didi_rnd               <"vavguh",   int_hexagon_A2_vavguhr>;
def HEXAGON_A2_vnavgh:
  di_ALU64_didi                   <"vnavgh",   int_hexagon_A2_vnavgh>;
def HEXAGON_A2_vnavghcr:
  di_ALU64_didi_crnd_sat          <"vnavgh",   int_hexagon_A2_vnavghcr>;
def HEXAGON_A2_vnavghr:
  di_ALU64_didi_rnd_sat           <"vnavgh",   int_hexagon_A2_vnavghr>;

// ALU64 / VH / Vector compare halfwords.
def HEXAGON_A2_vcmpheq:
  qi_ALU64_didi                   <"vcmph.eq", int_hexagon_A2_vcmpheq>;
def HEXAGON_A2_vcmphgt:
  qi_ALU64_didi                   <"vcmph.gt", int_hexagon_A2_vcmphgt>;
def HEXAGON_A2_vcmphgtu:
  qi_ALU64_didi                   <"vcmph.gtu",int_hexagon_A2_vcmphgtu>;

// ALU64 / VH / Vector maximum halfwords.
def HEXAGON_A2_vmaxh:
  di_ALU64_didi                   <"vmaxh",    int_hexagon_A2_vmaxh>;
def HEXAGON_A2_vmaxuh:
  di_ALU64_didi                   <"vmaxuh",   int_hexagon_A2_vmaxuh>;

// ALU64 / VH / Vector minimum halfwords.
def HEXAGON_A2_vminh:
  di_ALU64_didi                   <"vminh",    int_hexagon_A2_vminh>;
def HEXAGON_A2_vminuh:
  di_ALU64_didi                   <"vminuh",   int_hexagon_A2_vminuh>;

// ALU64 / VH / Vector subtract halfwords.
def HEXAGON_A2_vsubh:
  di_ALU64_didi                   <"vsubh",    int_hexagon_A2_vsubh>;
def HEXAGON_A2_vsubhs:
  di_ALU64_didi_sat               <"vsubh",    int_hexagon_A2_vsubhs>;
def HEXAGON_A2_vsubuhs:
  di_ALU64_didi_sat               <"vsubuh",   int_hexagon_A2_vsubuhs>;


/********************************************************************
*            ALU64/VW                                               *
*********************************************************************/

// ALU64 / VW / Vector add words.
// Rdd32=vaddw(Rss32,Rtt32)[:sat]
def HEXAGON_A2_vaddw:
  di_ALU64_didi                   <"vaddw",    int_hexagon_A2_vaddw>;
def HEXAGON_A2_vaddws:
  di_ALU64_didi_sat               <"vaddw",   int_hexagon_A2_vaddws>;

// ALU64 / VW / Vector average words.
def HEXAGON_A2_vavguw:
  di_ALU64_didi                   <"vavguw",   int_hexagon_A2_vavguw>;
def HEXAGON_A2_vavguwr:
  di_ALU64_didi_rnd               <"vavguw",   int_hexagon_A2_vavguwr>;
def HEXAGON_A2_vavgw:
  di_ALU64_didi                   <"vavgw",    int_hexagon_A2_vavgw>;
def HEXAGON_A2_vavgwcr:
  di_ALU64_didi_crnd              <"vavgw",    int_hexagon_A2_vavgwcr>;
def HEXAGON_A2_vavgwr:
  di_ALU64_didi_rnd               <"vavgw",    int_hexagon_A2_vavgwr>;
def HEXAGON_A2_vnavgw:
  di_ALU64_didi                   <"vnavgw",   int_hexagon_A2_vnavgw>;
def HEXAGON_A2_vnavgwcr:
  di_ALU64_didi_crnd_sat          <"vnavgw",   int_hexagon_A2_vnavgwcr>;
def HEXAGON_A2_vnavgwr:
  di_ALU64_didi_rnd_sat           <"vnavgw",   int_hexagon_A2_vnavgwr>;

// ALU64 / VW / Vector compare words.
def HEXAGON_A2_vcmpweq:
  qi_ALU64_didi                   <"vcmpw.eq", int_hexagon_A2_vcmpweq>;
def HEXAGON_A2_vcmpwgt:
  qi_ALU64_didi                   <"vcmpw.gt", int_hexagon_A2_vcmpwgt>;
def HEXAGON_A2_vcmpwgtu:
  qi_ALU64_didi                   <"vcmpw.gtu",int_hexagon_A2_vcmpwgtu>;

// ALU64 / VW / Vector maximum words.
def HEXAGON_A2_vmaxw:
  di_ALU64_didi                   <"vmaxw",    int_hexagon_A2_vmaxw>;
def HEXAGON_A2_vmaxuw:
  di_ALU64_didi                   <"vmaxuw",   int_hexagon_A2_vmaxuw>;

// ALU64 / VW / Vector minimum words.
def HEXAGON_A2_vminw:
  di_ALU64_didi                   <"vminw",    int_hexagon_A2_vminw>;
def HEXAGON_A2_vminuw:
  di_ALU64_didi                   <"vminuw",   int_hexagon_A2_vminuw>;

// ALU64 / VW / Vector subtract words.
def HEXAGON_A2_vsubw:
  di_ALU64_didi                   <"vsubw",    int_hexagon_A2_vsubw>;
def HEXAGON_A2_vsubws:
  di_ALU64_didi_sat               <"vsubw",    int_hexagon_A2_vsubws>;


/********************************************************************
*            CR                                                     *
*********************************************************************/

// CR / Logical reductions on predicates.
def HEXAGON_C2_all8:
  qi_SInst_qi                     <"all8",     int_hexagon_C2_all8>;
def HEXAGON_C2_any8:
  qi_SInst_qi                     <"any8",     int_hexagon_C2_any8>;

// CR / Logical operations on predicates.
def HEXAGON_C2_pxfer_map:
  qi_SInst_qi_pxfer               <"",         int_hexagon_C2_pxfer_map>;
def HEXAGON_C2_and:
  qi_SInst_qiqi                   <"and",      int_hexagon_C2_and>;
def HEXAGON_C2_andn:
  qi_SInst_qiqi_neg               <"and",      int_hexagon_C2_andn>;
def HEXAGON_C2_not:
  qi_SInst_qi                     <"not",      int_hexagon_C2_not>;
def HEXAGON_C2_or:
  qi_SInst_qiqi                   <"or",       int_hexagon_C2_or>;
def HEXAGON_C2_orn:
  qi_SInst_qiqi_neg               <"or",       int_hexagon_C2_orn>;
def HEXAGON_C2_xor:
  qi_SInst_qiqi                   <"xor",      int_hexagon_C2_xor>;


/********************************************************************
*            MTYPE/ALU                                              *
*********************************************************************/

// MTYPE / ALU / Add and accumulate.
def HEXAGON_M2_acci:
  si_MInst_sisisi_acc             <"add",      int_hexagon_M2_acci>;
def HEXAGON_M2_accii:
  si_MInst_sisis8_acc             <"add",      int_hexagon_M2_accii>;
def HEXAGON_M2_nacci:
  si_MInst_sisisi_nac             <"add",      int_hexagon_M2_nacci>;
def HEXAGON_M2_naccii:
  si_MInst_sisis8_nac             <"add",      int_hexagon_M2_naccii>;

// MTYPE / ALU / Subtract and accumulate.
def HEXAGON_M2_subacc:
  si_MInst_sisisi_acc             <"sub",      int_hexagon_M2_subacc>;

// MTYPE / ALU / Vector absolute difference.
def HEXAGON_M2_vabsdiffh:
  di_MInst_didi                   <"vabsdiffh",int_hexagon_M2_vabsdiffh>;
def HEXAGON_M2_vabsdiffw:
  di_MInst_didi                   <"vabsdiffw",int_hexagon_M2_vabsdiffw>;

// MTYPE / ALU / XOR and xor with destination.
def HEXAGON_M2_xor_xacc:
  si_MInst_sisisi_xacc            <"xor",      int_hexagon_M2_xor_xacc>;


/********************************************************************
*            MTYPE/COMPLEX                                          *
*********************************************************************/

// MTYPE / COMPLEX / Complex multiply.
// Rdd[-+]=cmpy(Rs, Rt:<<1]:sat
def HEXAGON_M2_cmpys_s1:
  di_MInst_sisi_s1_sat            <"cmpy",     int_hexagon_M2_cmpys_s1>;
def HEXAGON_M2_cmpys_s0:
  di_MInst_sisi_sat               <"cmpy",     int_hexagon_M2_cmpys_s0>;
def HEXAGON_M2_cmpysc_s1:
  di_MInst_sisi_s1_sat_conj       <"cmpy",     int_hexagon_M2_cmpysc_s1>;
def HEXAGON_M2_cmpysc_s0:
  di_MInst_sisi_sat_conj          <"cmpy",     int_hexagon_M2_cmpysc_s0>;

def HEXAGON_M2_cmacs_s1:
  di_MInst_disisi_acc_s1_sat      <"cmpy",     int_hexagon_M2_cmacs_s1>;
def HEXAGON_M2_cmacs_s0:
  di_MInst_disisi_acc_sat         <"cmpy",     int_hexagon_M2_cmacs_s0>;
def HEXAGON_M2_cmacsc_s1:
  di_MInst_disisi_acc_s1_sat_conj <"cmpy",     int_hexagon_M2_cmacsc_s1>;
def HEXAGON_M2_cmacsc_s0:
  di_MInst_disisi_acc_sat_conj    <"cmpy",     int_hexagon_M2_cmacsc_s0>;

def HEXAGON_M2_cnacs_s1:
  di_MInst_disisi_nac_s1_sat      <"cmpy",     int_hexagon_M2_cnacs_s1>;
def HEXAGON_M2_cnacs_s0:
  di_MInst_disisi_nac_sat         <"cmpy",     int_hexagon_M2_cnacs_s0>;
def HEXAGON_M2_cnacsc_s1:
  di_MInst_disisi_nac_s1_sat_conj <"cmpy",     int_hexagon_M2_cnacsc_s1>;
def HEXAGON_M2_cnacsc_s0:
  di_MInst_disisi_nac_sat_conj    <"cmpy",     int_hexagon_M2_cnacsc_s0>;

// MTYPE / COMPLEX / Complex multiply real or imaginary.
def HEXAGON_M2_cmpyr_s0:
  di_MInst_sisi                   <"cmpyr",    int_hexagon_M2_cmpyr_s0>;
def HEXAGON_M2_cmacr_s0:
  di_MInst_disisi_acc             <"cmpyr",    int_hexagon_M2_cmacr_s0>;

def HEXAGON_M2_cmpyi_s0:
  di_MInst_sisi                   <"cmpyi",    int_hexagon_M2_cmpyi_s0>;
def HEXAGON_M2_cmaci_s0:
  di_MInst_disisi_acc             <"cmpyi",    int_hexagon_M2_cmaci_s0>;

// MTYPE / COMPLEX / Complex multiply with round and pack.
// Rxx32+=cmpy(Rs32,[*]Rt32:<<1]:rnd:sat
def HEXAGON_M2_cmpyrs_s0:
  si_MInst_sisi_rnd_sat           <"cmpy",     int_hexagon_M2_cmpyrs_s0>;
def HEXAGON_M2_cmpyrs_s1:
  si_MInst_sisi_s1_rnd_sat        <"cmpy",     int_hexagon_M2_cmpyrs_s1>;

def HEXAGON_M2_cmpyrsc_s0:
  si_MInst_sisi_rnd_sat_conj      <"cmpy",     int_hexagon_M2_cmpyrsc_s0>;
def HEXAGON_M2_cmpyrsc_s1:
  si_MInst_sisi_s1_rnd_sat_conj   <"cmpy",     int_hexagon_M2_cmpyrsc_s1>;

//MTYPE / COMPLEX / Vector complex multiply real or imaginary.
def HEXAGON_M2_vcmpy_s0_sat_i:
  di_MInst_didi_sat               <"vcmpyi",   int_hexagon_M2_vcmpy_s0_sat_i>;
def HEXAGON_M2_vcmpy_s1_sat_i:
  di_MInst_didi_s1_sat            <"vcmpyi",   int_hexagon_M2_vcmpy_s1_sat_i>;

def HEXAGON_M2_vcmpy_s0_sat_r:
  di_MInst_didi_sat               <"vcmpyr",   int_hexagon_M2_vcmpy_s0_sat_r>;
def HEXAGON_M2_vcmpy_s1_sat_r:
  di_MInst_didi_s1_sat            <"vcmpyr",   int_hexagon_M2_vcmpy_s1_sat_r>;

def HEXAGON_M2_vcmac_s0_sat_i:
  di_MInst_dididi_acc_sat         <"vcmpyi",   int_hexagon_M2_vcmac_s0_sat_i>;
def HEXAGON_M2_vcmac_s0_sat_r:
  di_MInst_dididi_acc_sat         <"vcmpyr",   int_hexagon_M2_vcmac_s0_sat_r>;

//MTYPE / COMPLEX / Vector reduce complex multiply real or imaginary.
def HEXAGON_M2_vrcmpyi_s0:
  di_MInst_didi                   <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0>;
def HEXAGON_M2_vrcmpyr_s0:
  di_MInst_didi                   <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0>;

def HEXAGON_M2_vrcmpyi_s0c:
  di_MInst_didi_conj              <"vrcmpyi",  int_hexagon_M2_vrcmpyi_s0c>;
def HEXAGON_M2_vrcmpyr_s0c:
  di_MInst_didi_conj              <"vrcmpyr",  int_hexagon_M2_vrcmpyr_s0c>;

def HEXAGON_M2_vrcmaci_s0:
  di_MInst_dididi_acc             <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0>;
def HEXAGON_M2_vrcmacr_s0:
  di_MInst_dididi_acc             <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0>;

def HEXAGON_M2_vrcmaci_s0c:
  di_MInst_dididi_acc_conj        <"vrcmpyi",  int_hexagon_M2_vrcmaci_s0c>;
def HEXAGON_M2_vrcmacr_s0c:
  di_MInst_dididi_acc_conj        <"vrcmpyr",  int_hexagon_M2_vrcmacr_s0c>;


/********************************************************************
*            MTYPE/MPYH                                             *
*********************************************************************/

// MTYPE / MPYH / Multiply and use lower result.
//def HEXAGON_M2_mpysmi:
//FIXME: Hexagon_M2_mpysmi should really by of the type si_MInst_sim9,
// not si_MInst_sis9 - but for now, we will use s9.
// def Hexagon_M2_mpysmi:
//  si_MInst_sim9                   <"mpyi",     int_hexagon_M2_mpysmi>;
def Hexagon_M2_mpysmi:
  si_MInst_sis9                   <"mpyi",     int_hexagon_M2_mpysmi>;
def HEXAGON_M2_mpyi:
  si_MInst_sisi                   <"mpyi",     int_hexagon_M2_mpyi>;
def HEXAGON_M2_mpyui:
  si_MInst_sisi                   <"mpyui",    int_hexagon_M2_mpyui>;
def HEXAGON_M2_macsip:
  si_MInst_sisiu8_acc             <"mpyi",     int_hexagon_M2_macsip>;
def HEXAGON_M2_maci:
  si_MInst_sisisi_acc             <"mpyi",     int_hexagon_M2_maci>;
def HEXAGON_M2_macsin:
  si_MInst_sisiu8_nac             <"mpyi",     int_hexagon_M2_macsin>;

// MTYPE / MPYH / Multiply word by half (32x16).
//Rdd[+]=vmpywoh(Rss,Rtt)[:<<1][:rnd][:sat]
//Rdd[+]=vmpyweh(Rss,Rtt)[:<<1][:rnd][:sat]
def HEXAGON_M2_mmpyl_rs1:
  di_MInst_didi_s1_rnd_sat        <"vmpyweh",  int_hexagon_M2_mmpyl_rs1>;
def HEXAGON_M2_mmpyl_s1:
  di_MInst_didi_s1_sat            <"vmpyweh",  int_hexagon_M2_mmpyl_s1>;
def HEXAGON_M2_mmpyl_rs0:
  di_MInst_didi_rnd_sat           <"vmpyweh",  int_hexagon_M2_mmpyl_rs0>;
def HEXAGON_M2_mmpyl_s0:
  di_MInst_didi_sat               <"vmpyweh",  int_hexagon_M2_mmpyl_s0>;
def HEXAGON_M2_mmpyh_rs1:
  di_MInst_didi_s1_rnd_sat        <"vmpywoh",  int_hexagon_M2_mmpyh_rs1>;
def HEXAGON_M2_mmpyh_s1:
  di_MInst_didi_s1_sat            <"vmpywoh",  int_hexagon_M2_mmpyh_s1>;
def HEXAGON_M2_mmpyh_rs0:
  di_MInst_didi_rnd_sat           <"vmpywoh",  int_hexagon_M2_mmpyh_rs0>;
def HEXAGON_M2_mmpyh_s0:
  di_MInst_didi_sat               <"vmpywoh",  int_hexagon_M2_mmpyh_s0>;
def HEXAGON_M2_mmacls_rs1:
  di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweh",  int_hexagon_M2_mmacls_rs1>;
def HEXAGON_M2_mmacls_s1:
  di_MInst_dididi_acc_s1_sat      <"vmpyweh",  int_hexagon_M2_mmacls_s1>;
def HEXAGON_M2_mmacls_rs0:
  di_MInst_dididi_acc_rnd_sat     <"vmpyweh",  int_hexagon_M2_mmacls_rs0>;
def HEXAGON_M2_mmacls_s0:
  di_MInst_dididi_acc_sat         <"vmpyweh",  int_hexagon_M2_mmacls_s0>;
def HEXAGON_M2_mmachs_rs1:
  di_MInst_dididi_acc_s1_rnd_sat  <"vmpywoh",  int_hexagon_M2_mmachs_rs1>;
def HEXAGON_M2_mmachs_s1:
  di_MInst_dididi_acc_s1_sat      <"vmpywoh",  int_hexagon_M2_mmachs_s1>;
def HEXAGON_M2_mmachs_rs0:
  di_MInst_dididi_acc_rnd_sat     <"vmpywoh",  int_hexagon_M2_mmachs_rs0>;
def HEXAGON_M2_mmachs_s0:
  di_MInst_dididi_acc_sat         <"vmpywoh",  int_hexagon_M2_mmachs_s0>;

// MTYPE / MPYH / Multiply word by unsigned half (32x16).
//Rdd[+]=vmpywouh(Rss,Rtt)[:<<1][:rnd][:sat]
//Rdd[+]=vmpyweuh(Rss,Rtt)[:<<1][:rnd][:sat]
def HEXAGON_M2_mmpyul_rs1:
  di_MInst_didi_s1_rnd_sat        <"vmpyweuh", int_hexagon_M2_mmpyul_rs1>;
def HEXAGON_M2_mmpyul_s1:
  di_MInst_didi_s1_sat            <"vmpyweuh", int_hexagon_M2_mmpyul_s1>;
def HEXAGON_M2_mmpyul_rs0:
  di_MInst_didi_rnd_sat           <"vmpyweuh", int_hexagon_M2_mmpyul_rs0>;
def HEXAGON_M2_mmpyul_s0:
  di_MInst_didi_sat               <"vmpyweuh", int_hexagon_M2_mmpyul_s0>;
def HEXAGON_M2_mmpyuh_rs1:
  di_MInst_didi_s1_rnd_sat        <"vmpywouh", int_hexagon_M2_mmpyuh_rs1>;
def HEXAGON_M2_mmpyuh_s1:
  di_MInst_didi_s1_sat            <"vmpywouh", int_hexagon_M2_mmpyuh_s1>;
def HEXAGON_M2_mmpyuh_rs0:
  di_MInst_didi_rnd_sat           <"vmpywouh", int_hexagon_M2_mmpyuh_rs0>;
def HEXAGON_M2_mmpyuh_s0:
  di_MInst_didi_sat               <"vmpywouh", int_hexagon_M2_mmpyuh_s0>;
def HEXAGON_M2_mmaculs_rs1:
  di_MInst_dididi_acc_s1_rnd_sat  <"vmpyweuh", int_hexagon_M2_mmaculs_rs1>;
def HEXAGON_M2_mmaculs_s1:
  di_MInst_dididi_acc_s1_sat      <"vmpyweuh", int_hexagon_M2_mmaculs_s1>;
def HEXAGON_M2_mmaculs_rs0:
  di_MInst_dididi_acc_rnd_sat     <"vmpyweuh", int_hexagon_M2_mmaculs_rs0>;
def HEXAGON_M2_mmaculs_s0:
  di_MInst_dididi_acc_sat         <"vmpyweuh", int_hexagon_M2_mmaculs_s0>;
def HEXAGON_M2_mmacuhs_rs1:
  di_MInst_dididi_acc_s1_rnd_sat  <"vmpywouh", int_hexagon_M2_mmacuhs_rs1>;
def HEXAGON_M2_mmacuhs_s1:
  di_MInst_dididi_acc_s1_sat      <"vmpywouh", int_hexagon_M2_mmacuhs_s1>;
def HEXAGON_M2_mmacuhs_rs0:
  di_MInst_dididi_acc_rnd_sat     <"vmpywouh", int_hexagon_M2_mmacuhs_rs0>;
def HEXAGON_M2_mmacuhs_s0:
  di_MInst_dididi_acc_sat         <"vmpywouh", int_hexagon_M2_mmacuhs_s0>;

// MTYPE / MPYH / Multiply and use upper result.
def HEXAGON_M2_hmmpyh_rs1:
  si_MInst_sisi_h_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyh_rs1>;
def HEXAGON_M2_hmmpyl_rs1:
  si_MInst_sisi_l_s1_rnd_sat      <"mpy",      int_hexagon_M2_hmmpyl_rs1>;
def HEXAGON_M2_mpy_up:
  si_MInst_sisi                   <"mpy",      int_hexagon_M2_mpy_up>;
def HEXAGON_M2_dpmpyss_rnd_s0:
  si_MInst_sisi_rnd               <"mpy",      int_hexagon_M2_dpmpyss_rnd_s0>;
def HEXAGON_M2_mpyu_up:
  si_MInst_sisi                   <"mpyu",     int_hexagon_M2_mpyu_up>;

// MTYPE / MPYH / Multiply and use full result.
def HEXAGON_M2_dpmpyuu_s0:
  di_MInst_sisi                   <"mpyu",     int_hexagon_M2_dpmpyuu_s0>;
def HEXAGON_M2_dpmpyuu_acc_s0:
  di_MInst_disisi_acc             <"mpyu",     int_hexagon_M2_dpmpyuu_acc_s0>;
def HEXAGON_M2_dpmpyuu_nac_s0:
  di_MInst_disisi_nac             <"mpyu",     int_hexagon_M2_dpmpyuu_nac_s0>;
def HEXAGON_M2_dpmpyss_s0:
  di_MInst_sisi                   <"mpy",      int_hexagon_M2_dpmpyss_s0>;
def HEXAGON_M2_dpmpyss_acc_s0:
  di_MInst_disisi_acc             <"mpy",      int_hexagon_M2_dpmpyss_acc_s0>;
def HEXAGON_M2_dpmpyss_nac_s0:
  di_MInst_disisi_nac             <"mpy",      int_hexagon_M2_dpmpyss_nac_s0>;


/********************************************************************
*            MTYPE/MPYS                                             *
*********************************************************************/

// MTYPE / MPYS / Scalar 16x16 multiply signed.
//Rd=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]|
//          [:<<0[:rnd|:sat|:rnd:sat]|:<<1[:rnd|:sat|:rnd:sat]]]
def HEXAGON_M2_mpy_hh_s0:
  si_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpy_hh_s0>;
def HEXAGON_M2_mpy_hh_s1:
  si_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpy_hh_s1>;
def HEXAGON_M2_mpy_rnd_hh_s1:
  si_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hh_s1>;
def HEXAGON_M2_mpy_sat_rnd_hh_s1:
  si_MInst_sisi_sat_rnd_hh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s1>;
def HEXAGON_M2_mpy_sat_hh_s1:
  si_MInst_sisi_sat_hh_s1         <"mpy",     int_hexagon_M2_mpy_sat_hh_s1>;
def HEXAGON_M2_mpy_rnd_hh_s0:
  si_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpy_rnd_hh_s0>;
def HEXAGON_M2_mpy_sat_rnd_hh_s0:
  si_MInst_sisi_sat_rnd_hh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hh_s0>;
def HEXAGON_M2_mpy_sat_hh_s0:
  si_MInst_sisi_sat_hh            <"mpy",     int_hexagon_M2_mpy_sat_hh_s0>;

def HEXAGON_M2_mpy_hl_s0:
  si_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpy_hl_s0>;
def HEXAGON_M2_mpy_hl_s1:
  si_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpy_hl_s1>;
def HEXAGON_M2_mpy_rnd_hl_s1:
  si_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpy_rnd_hl_s1>;
def HEXAGON_M2_mpy_sat_rnd_hl_s1:
  si_MInst_sisi_sat_rnd_hl_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s1>;
def HEXAGON_M2_mpy_sat_hl_s1:
  si_MInst_sisi_sat_hl_s1         <"mpy",     int_hexagon_M2_mpy_sat_hl_s1>;
def HEXAGON_M2_mpy_rnd_hl_s0:
  si_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpy_rnd_hl_s0>;
def HEXAGON_M2_mpy_sat_rnd_hl_s0:
  si_MInst_sisi_sat_rnd_hl        <"mpy",     int_hexagon_M2_mpy_sat_rnd_hl_s0>;
def HEXAGON_M2_mpy_sat_hl_s0:
  si_MInst_sisi_sat_hl            <"mpy",     int_hexagon_M2_mpy_sat_hl_s0>;

def HEXAGON_M2_mpy_lh_s0:
  si_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpy_lh_s0>;
def HEXAGON_M2_mpy_lh_s1:
  si_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpy_lh_s1>;
def HEXAGON_M2_mpy_rnd_lh_s1:
  si_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpy_rnd_lh_s1>;
def HEXAGON_M2_mpy_sat_rnd_lh_s1:
  si_MInst_sisi_sat_rnd_lh_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s1>;
def HEXAGON_M2_mpy_sat_lh_s1:
  si_MInst_sisi_sat_lh_s1         <"mpy",     int_hexagon_M2_mpy_sat_lh_s1>;
def HEXAGON_M2_mpy_rnd_lh_s0:
  si_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpy_rnd_lh_s0>;
def HEXAGON_M2_mpy_sat_rnd_lh_s0:
  si_MInst_sisi_sat_rnd_lh        <"mpy",     int_hexagon_M2_mpy_sat_rnd_lh_s0>;
def HEXAGON_M2_mpy_sat_lh_s0:
  si_MInst_sisi_sat_lh            <"mpy",     int_hexagon_M2_mpy_sat_lh_s0>;

def HEXAGON_M2_mpy_ll_s0:
  si_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpy_ll_s0>;
def HEXAGON_M2_mpy_ll_s1:
  si_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpy_ll_s1>;
def HEXAGON_M2_mpy_rnd_ll_s1:
  si_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpy_rnd_ll_s1>;
def HEXAGON_M2_mpy_sat_rnd_ll_s1:
  si_MInst_sisi_sat_rnd_ll_s1     <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s1>;
def HEXAGON_M2_mpy_sat_ll_s1:
  si_MInst_sisi_sat_ll_s1         <"mpy",     int_hexagon_M2_mpy_sat_ll_s1>;
def HEXAGON_M2_mpy_rnd_ll_s0:
  si_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpy_rnd_ll_s0>;
def HEXAGON_M2_mpy_sat_rnd_ll_s0:
  si_MInst_sisi_sat_rnd_ll        <"mpy",     int_hexagon_M2_mpy_sat_rnd_ll_s0>;
def HEXAGON_M2_mpy_sat_ll_s0:
  si_MInst_sisi_sat_ll            <"mpy",     int_hexagon_M2_mpy_sat_ll_s0>;

//Rdd=mpy(Rs.[H|L],Rt.[H|L])[[:<<0|:<<1]|[:<<0:rnd|:<<1:rnd]]
def HEXAGON_M2_mpyd_hh_s0:
  di_MInst_sisi_hh                <"mpy",     int_hexagon_M2_mpyd_hh_s0>;
def HEXAGON_M2_mpyd_hh_s1:
  di_MInst_sisi_hh_s1             <"mpy",     int_hexagon_M2_mpyd_hh_s1>;
def HEXAGON_M2_mpyd_rnd_hh_s1:
  di_MInst_sisi_rnd_hh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s1>;
def HEXAGON_M2_mpyd_rnd_hh_s0:
  di_MInst_sisi_rnd_hh            <"mpy",     int_hexagon_M2_mpyd_rnd_hh_s0>;

def HEXAGON_M2_mpyd_hl_s0:
  di_MInst_sisi_hl                <"mpy",     int_hexagon_M2_mpyd_hl_s0>;
def HEXAGON_M2_mpyd_hl_s1:
  di_MInst_sisi_hl_s1             <"mpy",     int_hexagon_M2_mpyd_hl_s1>;
def HEXAGON_M2_mpyd_rnd_hl_s1:
  di_MInst_sisi_rnd_hl_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s1>;
def HEXAGON_M2_mpyd_rnd_hl_s0:
  di_MInst_sisi_rnd_hl            <"mpy",     int_hexagon_M2_mpyd_rnd_hl_s0>;

def HEXAGON_M2_mpyd_lh_s0:
  di_MInst_sisi_lh                <"mpy",     int_hexagon_M2_mpyd_lh_s0>;
def HEXAGON_M2_mpyd_lh_s1:
  di_MInst_sisi_lh_s1             <"mpy",     int_hexagon_M2_mpyd_lh_s1>;
def HEXAGON_M2_mpyd_rnd_lh_s1:
  di_MInst_sisi_rnd_lh_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s1>;
def HEXAGON_M2_mpyd_rnd_lh_s0:
  di_MInst_sisi_rnd_lh            <"mpy",     int_hexagon_M2_mpyd_rnd_lh_s0>;

def HEXAGON_M2_mpyd_ll_s0:
  di_MInst_sisi_ll                <"mpy",     int_hexagon_M2_mpyd_ll_s0>;
def HEXAGON_M2_mpyd_ll_s1:
  di_MInst_sisi_ll_s1             <"mpy",     int_hexagon_M2_mpyd_ll_s1>;
def HEXAGON_M2_mpyd_rnd_ll_s1:
  di_MInst_sisi_rnd_ll_s1         <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s1>;
def HEXAGON_M2_mpyd_rnd_ll_s0:
  di_MInst_sisi_rnd_ll            <"mpy",     int_hexagon_M2_mpyd_rnd_ll_s0>;

//Rx+=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
def HEXAGON_M2_mpy_acc_hh_s0:
  si_MInst_sisisi_acc_hh            <"mpy",  int_hexagon_M2_mpy_acc_hh_s0>;
def HEXAGON_M2_mpy_acc_hh_s1:
  si_MInst_sisisi_acc_hh_s1         <"mpy",  int_hexagon_M2_mpy_acc_hh_s1>;
def HEXAGON_M2_mpy_acc_sat_hh_s1:
  si_MInst_sisisi_acc_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s1>;
def HEXAGON_M2_mpy_acc_sat_hh_s0:
  si_MInst_sisisi_acc_sat_hh        <"mpy",  int_hexagon_M2_mpy_acc_sat_hh_s0>;

def HEXAGON_M2_mpy_acc_hl_s0:
  si_MInst_sisisi_acc_hl            <"mpy",  int_hexagon_M2_mpy_acc_hl_s0>;
def HEXAGON_M2_mpy_acc_hl_s1:
  si_MInst_sisisi_acc_hl_s1         <"mpy",  int_hexagon_M2_mpy_acc_hl_s1>;
def HEXAGON_M2_mpy_acc_sat_hl_s1:
  si_MInst_sisisi_acc_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s1>;
def HEXAGON_M2_mpy_acc_sat_hl_s0:
  si_MInst_sisisi_acc_sat_hl        <"mpy",  int_hexagon_M2_mpy_acc_sat_hl_s0>;

def HEXAGON_M2_mpy_acc_lh_s0:
  si_MInst_sisisi_acc_lh            <"mpy",  int_hexagon_M2_mpy_acc_lh_s0>;
def HEXAGON_M2_mpy_acc_lh_s1:
  si_MInst_sisisi_acc_lh_s1         <"mpy",  int_hexagon_M2_mpy_acc_lh_s1>;
def HEXAGON_M2_mpy_acc_sat_lh_s1:
  si_MInst_sisisi_acc_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s1>;
def HEXAGON_M2_mpy_acc_sat_lh_s0:
  si_MInst_sisisi_acc_sat_lh        <"mpy",  int_hexagon_M2_mpy_acc_sat_lh_s0>;

def HEXAGON_M2_mpy_acc_ll_s0:
  si_MInst_sisisi_acc_ll            <"mpy",  int_hexagon_M2_mpy_acc_ll_s0>;
def HEXAGON_M2_mpy_acc_ll_s1:
  si_MInst_sisisi_acc_ll_s1         <"mpy",  int_hexagon_M2_mpy_acc_ll_s1>;
def HEXAGON_M2_mpy_acc_sat_ll_s1:
  si_MInst_sisisi_acc_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s1>;
def HEXAGON_M2_mpy_acc_sat_ll_s0:
  si_MInst_sisisi_acc_sat_ll        <"mpy",  int_hexagon_M2_mpy_acc_sat_ll_s0>;

//Rx-=mpy(Rs.[H|L],Rt.[H|L])[[[:<<0|:<<1]|[:<<0:sat|:<<1:sat]]
def HEXAGON_M2_mpy_nac_hh_s0:
  si_MInst_sisisi_nac_hh            <"mpy",  int_hexagon_M2_mpy_nac_hh_s0>;
def HEXAGON_M2_mpy_nac_hh_s1:
  si_MInst_sisisi_nac_hh_s1         <"mpy",  int_hexagon_M2_mpy_nac_hh_s1>;
def HEXAGON_M2_mpy_nac_sat_hh_s1:
  si_MInst_sisisi_nac_sat_hh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s1>;
def HEXAGON_M2_mpy_nac_sat_hh_s0:
  si_MInst_sisisi_nac_sat_hh        <"mpy",  int_hexagon_M2_mpy_nac_sat_hh_s0>;

def HEXAGON_M2_mpy_nac_hl_s0:
  si_MInst_sisisi_nac_hl            <"mpy",  int_hexagon_M2_mpy_nac_hl_s0>;
def HEXAGON_M2_mpy_nac_hl_s1:
  si_MInst_sisisi_nac_hl_s1         <"mpy",  int_hexagon_M2_mpy_nac_hl_s1>;
def HEXAGON_M2_mpy_nac_sat_hl_s1:
  si_MInst_sisisi_nac_sat_hl_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s1>;
def HEXAGON_M2_mpy_nac_sat_hl_s0:
  si_MInst_sisisi_nac_sat_hl        <"mpy",  int_hexagon_M2_mpy_nac_sat_hl_s0>;

def HEXAGON_M2_mpy_nac_lh_s0:
  si_MInst_sisisi_nac_lh            <"mpy",  int_hexagon_M2_mpy_nac_lh_s0>;
def HEXAGON_M2_mpy_nac_lh_s1:
  si_MInst_sisisi_nac_lh_s1         <"mpy",  int_hexagon_M2_mpy_nac_lh_s1>;
def HEXAGON_M2_mpy_nac_sat_lh_s1:
  si_MInst_sisisi_nac_sat_lh_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s1>;
def HEXAGON_M2_mpy_nac_sat_lh_s0:
  si_MInst_sisisi_nac_sat_lh        <"mpy",  int_hexagon_M2_mpy_nac_sat_lh_s0>;

def HEXAGON_M2_mpy_nac_ll_s0:
  si_MInst_sisisi_nac_ll            <"mpy",  int_hexagon_M2_mpy_nac_ll_s0>;
def HEXAGON_M2_mpy_nac_ll_s1:
  si_MInst_sisisi_nac_ll_s1         <"mpy",  int_hexagon_M2_mpy_nac_ll_s1>;
def HEXAGON_M2_mpy_nac_sat_ll_s1:
  si_MInst_sisisi_nac_sat_ll_s1     <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s1>;
def HEXAGON_M2_mpy_nac_sat_ll_s0:
  si_MInst_sisisi_nac_sat_ll        <"mpy",  int_hexagon_M2_mpy_nac_sat_ll_s0>;

//Rx+=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
def HEXAGON_M2_mpyd_acc_hh_s0:
  di_MInst_disisi_acc_hh          <"mpy",    int_hexagon_M2_mpyd_acc_hh_s0>;
def HEXAGON_M2_mpyd_acc_hh_s1:
  di_MInst_disisi_acc_hh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hh_s1>;

def HEXAGON_M2_mpyd_acc_hl_s0:
  di_MInst_disisi_acc_hl          <"mpy",    int_hexagon_M2_mpyd_acc_hl_s0>;
def HEXAGON_M2_mpyd_acc_hl_s1:
  di_MInst_disisi_acc_hl_s1       <"mpy",    int_hexagon_M2_mpyd_acc_hl_s1>;

def HEXAGON_M2_mpyd_acc_lh_s0:
  di_MInst_disisi_acc_lh          <"mpy",    int_hexagon_M2_mpyd_acc_lh_s0>;
def HEXAGON_M2_mpyd_acc_lh_s1:
  di_MInst_disisi_acc_lh_s1       <"mpy",    int_hexagon_M2_mpyd_acc_lh_s1>;

def HEXAGON_M2_mpyd_acc_ll_s0:
  di_MInst_disisi_acc_ll          <"mpy",    int_hexagon_M2_mpyd_acc_ll_s0>;
def HEXAGON_M2_mpyd_acc_ll_s1:
  di_MInst_disisi_acc_ll_s1       <"mpy",    int_hexagon_M2_mpyd_acc_ll_s1>;

//Rx-=mpy(Rs.[H|L],Rt.[H|L:<<0|:<<1]
def HEXAGON_M2_mpyd_nac_hh_s0:
  di_MInst_disisi_nac_hh          <"mpy",    int_hexagon_M2_mpyd_nac_hh_s0>;
def HEXAGON_M2_mpyd_nac_hh_s1:
  di_MInst_disisi_nac_hh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hh_s1>;

def HEXAGON_M2_mpyd_nac_hl_s0:
  di_MInst_disisi_nac_hl          <"mpy",    int_hexagon_M2_mpyd_nac_hl_s0>;
def HEXAGON_M2_mpyd_nac_hl_s1:
  di_MInst_disisi_nac_hl_s1       <"mpy",    int_hexagon_M2_mpyd_nac_hl_s1>;

def HEXAGON_M2_mpyd_nac_lh_s0:
  di_MInst_disisi_nac_lh          <"mpy",    int_hexagon_M2_mpyd_nac_lh_s0>;
def HEXAGON_M2_mpyd_nac_lh_s1:
  di_MInst_disisi_nac_lh_s1       <"mpy",    int_hexagon_M2_mpyd_nac_lh_s1>;

def HEXAGON_M2_mpyd_nac_ll_s0:
  di_MInst_disisi_nac_ll          <"mpy",    int_hexagon_M2_mpyd_nac_ll_s0>;
def HEXAGON_M2_mpyd_nac_ll_s1:
  di_MInst_disisi_nac_ll_s1       <"mpy",    int_hexagon_M2_mpyd_nac_ll_s1>;

// MTYPE / MPYS / Scalar 16x16 multiply unsigned.
//Rd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyu_hh_s0:
  si_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyu_hh_s0>;
def HEXAGON_M2_mpyu_hh_s1:
  si_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyu_hh_s1>;
def HEXAGON_M2_mpyu_hl_s0:
  si_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyu_hl_s0>;
def HEXAGON_M2_mpyu_hl_s1:
  si_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyu_hl_s1>;
def HEXAGON_M2_mpyu_lh_s0:
  si_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyu_lh_s0>;
def HEXAGON_M2_mpyu_lh_s1:
  si_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyu_lh_s1>;
def HEXAGON_M2_mpyu_ll_s0:
  si_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyu_ll_s0>;
def HEXAGON_M2_mpyu_ll_s1:
  si_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyu_ll_s1>;

//Rdd=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyud_hh_s0:
  di_MInst_sisi_hh                <"mpyu",    int_hexagon_M2_mpyud_hh_s0>;
def HEXAGON_M2_mpyud_hh_s1:
  di_MInst_sisi_hh_s1             <"mpyu",    int_hexagon_M2_mpyud_hh_s1>;
def HEXAGON_M2_mpyud_hl_s0:
  di_MInst_sisi_hl                <"mpyu",    int_hexagon_M2_mpyud_hl_s0>;
def HEXAGON_M2_mpyud_hl_s1:
  di_MInst_sisi_hl_s1             <"mpyu",    int_hexagon_M2_mpyud_hl_s1>;
def HEXAGON_M2_mpyud_lh_s0:
  di_MInst_sisi_lh                <"mpyu",    int_hexagon_M2_mpyud_lh_s0>;
def HEXAGON_M2_mpyud_lh_s1:
  di_MInst_sisi_lh_s1             <"mpyu",    int_hexagon_M2_mpyud_lh_s1>;
def HEXAGON_M2_mpyud_ll_s0:
  di_MInst_sisi_ll                <"mpyu",    int_hexagon_M2_mpyud_ll_s0>;
def HEXAGON_M2_mpyud_ll_s1:
  di_MInst_sisi_ll_s1             <"mpyu",    int_hexagon_M2_mpyud_ll_s1>;

//Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyu_acc_hh_s0:
  si_MInst_sisisi_acc_hh            <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s0>;
def HEXAGON_M2_mpyu_acc_hh_s1:
  si_MInst_sisisi_acc_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hh_s1>;
def HEXAGON_M2_mpyu_acc_hl_s0:
  si_MInst_sisisi_acc_hl            <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s0>;
def HEXAGON_M2_mpyu_acc_hl_s1:
  si_MInst_sisisi_acc_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_hl_s1>;
def HEXAGON_M2_mpyu_acc_lh_s0:
  si_MInst_sisisi_acc_lh            <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s0>;
def HEXAGON_M2_mpyu_acc_lh_s1:
  si_MInst_sisisi_acc_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_lh_s1>;
def HEXAGON_M2_mpyu_acc_ll_s0:
  si_MInst_sisisi_acc_ll            <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s0>;
def HEXAGON_M2_mpyu_acc_ll_s1:
  si_MInst_sisisi_acc_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_acc_ll_s1>;

//Rd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyu_nac_hh_s0:
  si_MInst_sisisi_nac_hh            <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s0>;
def HEXAGON_M2_mpyu_nac_hh_s1:
  si_MInst_sisisi_nac_hh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hh_s1>;
def HEXAGON_M2_mpyu_nac_hl_s0:
  si_MInst_sisisi_nac_hl            <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s0>;
def HEXAGON_M2_mpyu_nac_hl_s1:
  si_MInst_sisisi_nac_hl_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_hl_s1>;
def HEXAGON_M2_mpyu_nac_lh_s0:
  si_MInst_sisisi_nac_lh            <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s0>;
def HEXAGON_M2_mpyu_nac_lh_s1:
  si_MInst_sisisi_nac_lh_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_lh_s1>;
def HEXAGON_M2_mpyu_nac_ll_s0:
  si_MInst_sisisi_nac_ll            <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s0>;
def HEXAGON_M2_mpyu_nac_ll_s1:
  si_MInst_sisisi_nac_ll_s1         <"mpyu",    int_hexagon_M2_mpyu_nac_ll_s1>;

//Rdd+=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyud_acc_hh_s0:
  di_MInst_disisi_acc_hh            <"mpyu", int_hexagon_M2_mpyud_acc_hh_s0>;
def HEXAGON_M2_mpyud_acc_hh_s1:
  di_MInst_disisi_acc_hh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hh_s1>;
def HEXAGON_M2_mpyud_acc_hl_s0:
  di_MInst_disisi_acc_hl            <"mpyu", int_hexagon_M2_mpyud_acc_hl_s0>;
def HEXAGON_M2_mpyud_acc_hl_s1:
  di_MInst_disisi_acc_hl_s1         <"mpyu", int_hexagon_M2_mpyud_acc_hl_s1>;
def HEXAGON_M2_mpyud_acc_lh_s0:
  di_MInst_disisi_acc_lh            <"mpyu", int_hexagon_M2_mpyud_acc_lh_s0>;
def HEXAGON_M2_mpyud_acc_lh_s1:
  di_MInst_disisi_acc_lh_s1         <"mpyu", int_hexagon_M2_mpyud_acc_lh_s1>;
def HEXAGON_M2_mpyud_acc_ll_s0:
  di_MInst_disisi_acc_ll            <"mpyu", int_hexagon_M2_mpyud_acc_ll_s0>;
def HEXAGON_M2_mpyud_acc_ll_s1:
  di_MInst_disisi_acc_ll_s1         <"mpyu", int_hexagon_M2_mpyud_acc_ll_s1>;

//Rdd-=mpyu(Rs.[H|L],Rt.[H|L])[:<<0|:<<1]
def HEXAGON_M2_mpyud_nac_hh_s0:
  di_MInst_disisi_nac_hh            <"mpyu", int_hexagon_M2_mpyud_nac_hh_s0>;
def HEXAGON_M2_mpyud_nac_hh_s1:
  di_MInst_disisi_nac_hh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hh_s1>;
def HEXAGON_M2_mpyud_nac_hl_s0:
  di_MInst_disisi_nac_hl            <"mpyu", int_hexagon_M2_mpyud_nac_hl_s0>;
def HEXAGON_M2_mpyud_nac_hl_s1:
  di_MInst_disisi_nac_hl_s1         <"mpyu", int_hexagon_M2_mpyud_nac_hl_s1>;
def HEXAGON_M2_mpyud_nac_lh_s0:
  di_MInst_disisi_nac_lh            <"mpyu", int_hexagon_M2_mpyud_nac_lh_s0>;
def HEXAGON_M2_mpyud_nac_lh_s1:
  di_MInst_disisi_nac_lh_s1         <"mpyu", int_hexagon_M2_mpyud_nac_lh_s1>;
def HEXAGON_M2_mpyud_nac_ll_s0:
  di_MInst_disisi_nac_ll            <"mpyu", int_hexagon_M2_mpyud_nac_ll_s0>;
def HEXAGON_M2_mpyud_nac_ll_s1:
  di_MInst_disisi_nac_ll_s1         <"mpyu", int_hexagon_M2_mpyud_nac_ll_s1>;


/********************************************************************
*            MTYPE/VB                                               *
*********************************************************************/

// MTYPE / VB / Vector reduce add unsigned bytes.
def HEXAGON_A2_vraddub:
  di_MInst_didi                   <"vraddub", int_hexagon_A2_vraddub>;
def HEXAGON_A2_vraddub_acc:
  di_MInst_dididi_acc             <"vraddub", int_hexagon_A2_vraddub_acc>;

// MTYPE / VB / Vector sum of absolute differences unsigned bytes.
def HEXAGON_A2_vrsadub:
  di_MInst_didi                   <"vrsadub", int_hexagon_A2_vrsadub>;
def HEXAGON_A2_vrsadub_acc:
  di_MInst_dididi_acc             <"vrsadub", int_hexagon_A2_vrsadub_acc>;

/********************************************************************
*            MTYPE/VH                                               *
*********************************************************************/

// MTYPE / VH / Vector dual multiply.
def HEXAGON_M2_vdmpys_s1:
  di_MInst_didi_s1_sat            <"vdmpy",   int_hexagon_M2_vdmpys_s1>;
def HEXAGON_M2_vdmpys_s0:
  di_MInst_didi_sat               <"vdmpy",   int_hexagon_M2_vdmpys_s0>;
def HEXAGON_M2_vdmacs_s1:
  di_MInst_dididi_acc_s1_sat      <"vdmpy",   int_hexagon_M2_vdmacs_s1>;
def HEXAGON_M2_vdmacs_s0:
  di_MInst_dididi_acc_sat         <"vdmpy",   int_hexagon_M2_vdmacs_s0>;

// MTYPE / VH / Vector dual multiply with round and pack.
def HEXAGON_M2_vdmpyrs_s0:
  si_MInst_didi_rnd_sat           <"vdmpy",   int_hexagon_M2_vdmpyrs_s0>;
def HEXAGON_M2_vdmpyrs_s1:
  si_MInst_didi_s1_rnd_sat        <"vdmpy",   int_hexagon_M2_vdmpyrs_s1>;

// MTYPE / VH / Vector multiply even halfwords.
def HEXAGON_M2_vmpy2es_s1:
  di_MInst_didi_s1_sat            <"vmpyeh",  int_hexagon_M2_vmpy2es_s1>;
def HEXAGON_M2_vmpy2es_s0:
  di_MInst_didi_sat               <"vmpyeh",  int_hexagon_M2_vmpy2es_s0>;
def HEXAGON_M2_vmac2es:
  di_MInst_dididi_acc             <"vmpyeh",  int_hexagon_M2_vmac2es>;
def HEXAGON_M2_vmac2es_s1:
  di_MInst_dididi_acc_s1_sat      <"vmpyeh",  int_hexagon_M2_vmac2es_s1>;
def HEXAGON_M2_vmac2es_s0:
  di_MInst_dididi_acc_sat         <"vmpyeh",  int_hexagon_M2_vmac2es_s0>;

// MTYPE / VH / Vector multiply halfwords.
def HEXAGON_M2_vmpy2s_s0:
  di_MInst_sisi_sat               <"vmpyh",   int_hexagon_M2_vmpy2s_s0>;
def HEXAGON_M2_vmpy2s_s1:
  di_MInst_sisi_s1_sat            <"vmpyh",   int_hexagon_M2_vmpy2s_s1>;
def HEXAGON_M2_vmac2:
  di_MInst_disisi_acc             <"vmpyh",   int_hexagon_M2_vmac2>;
def HEXAGON_M2_vmac2s_s0:
  di_MInst_disisi_acc_sat         <"vmpyh",   int_hexagon_M2_vmac2s_s0>;
def HEXAGON_M2_vmac2s_s1:
  di_MInst_disisi_acc_s1_sat      <"vmpyh",   int_hexagon_M2_vmac2s_s1>;

// MTYPE / VH / Vector multiply halfwords with round and pack.
def HEXAGON_M2_vmpy2s_s0pack:
  si_MInst_sisi_rnd_sat           <"vmpyh",   int_hexagon_M2_vmpy2s_s0pack>;
def HEXAGON_M2_vmpy2s_s1pack:
  si_MInst_sisi_s1_rnd_sat        <"vmpyh",   int_hexagon_M2_vmpy2s_s1pack>;

// MTYPE / VH / Vector reduce multiply halfwords.
// Rxx32+=vrmpyh(Rss32,Rtt32)
def HEXAGON_M2_vrmpy_s0:
  di_MInst_didi                   <"vrmpyh",  int_hexagon_M2_vrmpy_s0>;
def HEXAGON_M2_vrmac_s0:
  di_MInst_dididi_acc             <"vrmpyh",  int_hexagon_M2_vrmac_s0>;


/********************************************************************
*            STYPE/ALU                                              *
*********************************************************************/

// STYPE / ALU / Absolute value.
def HEXAGON_A2_abs:
  si_SInst_si                     <"abs",     int_hexagon_A2_abs>;
def HEXAGON_A2_absp:
  di_SInst_di                     <"abs",     int_hexagon_A2_absp>;
def HEXAGON_A2_abssat:
  si_SInst_si_sat                 <"abs",     int_hexagon_A2_abssat>;

// STYPE / ALU / Negate.
def HEXAGON_A2_negp:
  di_SInst_di                     <"neg",     int_hexagon_A2_negp>;
def HEXAGON_A2_negsat:
  si_SInst_si_sat                 <"neg",     int_hexagon_A2_negsat>;

// STYPE / ALU / Logical Not.
def HEXAGON_A2_notp:
  di_SInst_di                     <"not",     int_hexagon_A2_notp>;

// STYPE / ALU / Sign extend word to doubleword.
def HEXAGON_A2_sxtw:
  di_SInst_si                     <"sxtw",     int_hexagon_A2_sxtw>;


/********************************************************************
*            STYPE/BIT                                              *
*********************************************************************/

// STYPE / BIT / Count leading.
def HEXAGON_S2_cl0:
  si_SInst_si                     <"cl0",     int_hexagon_S2_cl0>;
def HEXAGON_S2_cl0p:
  si_SInst_di                     <"cl0",     int_hexagon_S2_cl0p>;
def HEXAGON_S2_cl1:
  si_SInst_si                     <"cl1",     int_hexagon_S2_cl1>;
def HEXAGON_S2_cl1p:
  si_SInst_di                     <"cl1",     int_hexagon_S2_cl1p>;
def HEXAGON_S2_clb:
  si_SInst_si                     <"clb",     int_hexagon_S2_clb>;
def HEXAGON_S2_clbp:
  si_SInst_di                     <"clb",     int_hexagon_S2_clbp>;
def HEXAGON_S2_clbnorm:
  si_SInst_si                     <"normamt", int_hexagon_S2_clbnorm>;

// STYPE / BIT / Count trailing.
def HEXAGON_S2_ct0:
  si_SInst_si                     <"ct0",     int_hexagon_S2_ct0>;
def HEXAGON_S2_ct1:
  si_SInst_si                     <"ct1",     int_hexagon_S2_ct1>;

// STYPE / BIT / Compare bit mask.
def Hexagon_C2_bitsclr:
  qi_SInst_sisi                   <"bitsclr", int_hexagon_C2_bitsclr>;
def Hexagon_C2_bitsclri:
  qi_SInst_siu6                   <"bitsclr", int_hexagon_C2_bitsclri>;
def Hexagon_C2_bitsset:
  qi_SInst_sisi                   <"bitsset", int_hexagon_C2_bitsset>;

// STYPE / BIT / Extract unsigned.
// Rd[d][32/64]=extractu(Rs[s],Rt[t],[imm])
def HEXAGON_S2_extractu:
  si_SInst_siu5u5                 <"extractu",int_hexagon_S2_extractu>;
def HEXAGON_S2_extractu_rp:
  si_SInst_sidi                   <"extractu",int_hexagon_S2_extractu_rp>;
def HEXAGON_S2_extractup:
  di_SInst_diu6u6                 <"extractu",int_hexagon_S2_extractup>;
def HEXAGON_S2_extractup_rp:
  di_SInst_didi                   <"extractu",int_hexagon_S2_extractup_rp>;

// STYPE / BIT / Insert bitfield.
def Hexagon_S2_insert:
  si_SInst_sisiu5u5               <"insert",  int_hexagon_S2_insert>;
def Hexagon_S2_insert_rp:
  si_SInst_sisidi                 <"insert",  int_hexagon_S2_insert_rp>;
def Hexagon_S2_insertp:
  di_SInst_didiu6u6               <"insert",  int_hexagon_S2_insertp>;
def Hexagon_S2_insertp_rp:
  di_SInst_dididi                 <"insert",  int_hexagon_S2_insertp_rp>;

// STYPE / BIT / Innterleave/deinterleave.
def Hexagon_S2_interleave:
  di_SInst_di                     <"interleave", int_hexagon_S2_interleave>;
def Hexagon_S2_deinterleave:
  di_SInst_di                     <"deinterleave", int_hexagon_S2_deinterleave>;

// STYPE / BIT / Linear feedback-shift Iteration.
def Hexagon_S2_lfsp:
  di_SInst_didi                   <"lfs",     int_hexagon_S2_lfsp>;

// STYPE / BIT / Bit reverse.
def Hexagon_S2_brev:
  si_SInst_si                     <"brev",    int_hexagon_S2_brev>;

// STYPE / BIT / Set/Clear/Toggle Bit.
def HEXAGON_S2_setbit_i:
  si_SInst_siu5                   <"setbit",  int_hexagon_S2_setbit_i>;
def HEXAGON_S2_togglebit_i:
  si_SInst_siu5                   <"togglebit", int_hexagon_S2_togglebit_i>;
def HEXAGON_S2_clrbit_i:
  si_SInst_siu5                   <"clrbit",  int_hexagon_S2_clrbit_i>;
def HEXAGON_S2_setbit_r:
  si_SInst_sisi                   <"setbit",  int_hexagon_S2_setbit_r>;
def HEXAGON_S2_togglebit_r:
  si_SInst_sisi                   <"togglebit", int_hexagon_S2_togglebit_r>;
def HEXAGON_S2_clrbit_r:
  si_SInst_sisi                   <"clrbit",  int_hexagon_S2_clrbit_r>;

// STYPE / BIT / Test Bit.
def HEXAGON_S2_tstbit_i:
  qi_SInst_siu5                   <"tstbit",  int_hexagon_S2_tstbit_i>;
def HEXAGON_S2_tstbit_r:
  qi_SInst_sisi                   <"tstbit",  int_hexagon_S2_tstbit_r>;


/********************************************************************
*            STYPE/COMPLEX                                          *
*********************************************************************/

// STYPE / COMPLEX / Vector Complex conjugate.
def HEXAGON_A2_vconj:
  di_SInst_di_sat                 <"vconj",   int_hexagon_A2_vconj>;

// STYPE / COMPLEX / Vector Complex rotate.
def HEXAGON_S2_vcrotate:
  di_SInst_disi                   <"vcrotate",int_hexagon_S2_vcrotate>;


/********************************************************************
*            STYPE/PERM                                             *
*********************************************************************/

// STYPE / PERM / Saturate.
def HEXAGON_A2_sat:
  si_SInst_di                     <"sat",     int_hexagon_A2_sat>;
def HEXAGON_A2_satb:
  si_SInst_si                     <"satb",    int_hexagon_A2_satb>;
def HEXAGON_A2_sath:
  si_SInst_si                     <"sath",    int_hexagon_A2_sath>;
def HEXAGON_A2_satub:
  si_SInst_si                     <"satub",   int_hexagon_A2_satub>;
def HEXAGON_A2_satuh:
  si_SInst_si                     <"satuh",   int_hexagon_A2_satuh>;

// STYPE / PERM / Swizzle bytes.
def HEXAGON_A2_swiz:
  si_SInst_si                     <"swiz",    int_hexagon_A2_swiz>;

// STYPE / PERM / Vector align.
// Need custom lowering
def HEXAGON_S2_valignib:
  di_SInst_didiu3                 <"valignb", int_hexagon_S2_valignib>;
def HEXAGON_S2_valignrb:
  di_SInst_didiqi                 <"valignb", int_hexagon_S2_valignrb>;

// STYPE / PERM / Vector round and pack.
def HEXAGON_S2_vrndpackwh:
  si_SInst_di                     <"vrndwh",  int_hexagon_S2_vrndpackwh>;
def HEXAGON_S2_vrndpackwhs:
  si_SInst_di_sat                 <"vrndwh",  int_hexagon_S2_vrndpackwhs>;

// STYPE / PERM / Vector saturate and pack.
def HEXAGON_S2_svsathb:
  si_SInst_si                     <"vsathb",  int_hexagon_S2_svsathb>;
def HEXAGON_S2_vsathb:
  si_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb>;
def HEXAGON_S2_svsathub:
  si_SInst_si                     <"vsathub", int_hexagon_S2_svsathub>;
def HEXAGON_S2_vsathub:
  si_SInst_di                     <"vsathub", int_hexagon_S2_vsathub>;
def HEXAGON_S2_vsatwh:
  si_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh>;
def HEXAGON_S2_vsatwuh:
  si_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh>;

// STYPE / PERM / Vector saturate without pack.
def HEXAGON_S2_vsathb_nopack:
  di_SInst_di                     <"vsathb",  int_hexagon_S2_vsathb_nopack>;
def HEXAGON_S2_vsathub_nopack:
  di_SInst_di                     <"vsathub", int_hexagon_S2_vsathub_nopack>;
def HEXAGON_S2_vsatwh_nopack:
  di_SInst_di                     <"vsatwh",  int_hexagon_S2_vsatwh_nopack>;
def HEXAGON_S2_vsatwuh_nopack:
  di_SInst_di                     <"vsatwuh", int_hexagon_S2_vsatwuh_nopack>;

// STYPE / PERM / Vector shuffle.
def HEXAGON_S2_shuffeb:
  di_SInst_didi                   <"shuffeb", int_hexagon_S2_shuffeb>;
def HEXAGON_S2_shuffeh:
  di_SInst_didi                   <"shuffeh", int_hexagon_S2_shuffeh>;
def HEXAGON_S2_shuffob:
  di_SInst_didi                   <"shuffob", int_hexagon_S2_shuffob>;
def HEXAGON_S2_shuffoh:
  di_SInst_didi                   <"shuffoh", int_hexagon_S2_shuffoh>;

// STYPE / PERM / Vector splat bytes.
def HEXAGON_S2_vsplatrb:
  si_SInst_si                     <"vsplatb", int_hexagon_S2_vsplatrb>;

// STYPE / PERM / Vector splat halfwords.
def HEXAGON_S2_vsplatrh:
  di_SInst_si                     <"vsplath", int_hexagon_S2_vsplatrh>;

// STYPE / PERM / Vector splice.
def Hexagon_S2_vsplicerb:
  di_SInst_didiqi                 <"vspliceb",int_hexagon_S2_vsplicerb>;
def Hexagon_S2_vspliceib:
  di_SInst_didiu3                 <"vspliceb",int_hexagon_S2_vspliceib>;

// STYPE / PERM / Sign extend.
def HEXAGON_S2_vsxtbh:
  di_SInst_si                     <"vsxtbh",  int_hexagon_S2_vsxtbh>;
def HEXAGON_S2_vsxthw:
  di_SInst_si                     <"vsxthw",  int_hexagon_S2_vsxthw>;

// STYPE / PERM / Truncate.
def HEXAGON_S2_vtrunehb:
  si_SInst_di                     <"vtrunehb",int_hexagon_S2_vtrunehb>;
def HEXAGON_S2_vtrunohb:
  si_SInst_di                     <"vtrunohb",int_hexagon_S2_vtrunohb>;
def HEXAGON_S2_vtrunewh:
  di_SInst_didi                   <"vtrunewh",int_hexagon_S2_vtrunewh>;
def HEXAGON_S2_vtrunowh:
  di_SInst_didi                   <"vtrunowh",int_hexagon_S2_vtrunowh>;

// STYPE / PERM / Zero extend.
def HEXAGON_S2_vzxtbh:
  di_SInst_si                     <"vzxtbh",  int_hexagon_S2_vzxtbh>;
def HEXAGON_S2_vzxthw:
  di_SInst_si                     <"vzxthw",  int_hexagon_S2_vzxthw>;


/********************************************************************
*            STYPE/PRED                                             *
*********************************************************************/

// STYPE / PRED / Mask generate from predicate.
def HEXAGON_C2_mask:
  di_SInst_qi                     <"mask",   int_hexagon_C2_mask>;

// STYPE / PRED / Predicate transfer.
def HEXAGON_C2_tfrpr:
  si_SInst_qi                     <"",       int_hexagon_C2_tfrpr>;
def HEXAGON_C2_tfrrp:
  qi_SInst_si                     <"",       int_hexagon_C2_tfrrp>;

// STYPE / PRED / Viterbi pack even and odd predicate bits.
def HEXAGON_C2_vitpack:
  si_SInst_qiqi                   <"vitpack",int_hexagon_C2_vitpack>;


/********************************************************************
*            STYPE/SHIFT                                            *
*********************************************************************/

// STYPE / SHIFT / Shift by immediate.
def HEXAGON_S2_asl_i_r:
  si_SInst_siu5                   <"asl",     int_hexagon_S2_asl_i_r>;
def HEXAGON_S2_asr_i_r:
  si_SInst_siu5                   <"asr",     int_hexagon_S2_asr_i_r>;
def HEXAGON_S2_lsr_i_r:
  si_SInst_siu5                   <"lsr",     int_hexagon_S2_lsr_i_r>;
def HEXAGON_S2_asl_i_p:
  di_SInst_diu6                   <"asl",     int_hexagon_S2_asl_i_p>;
def HEXAGON_S2_asr_i_p:
  di_SInst_diu6                   <"asr",     int_hexagon_S2_asr_i_p>;
def HEXAGON_S2_lsr_i_p:
  di_SInst_diu6                   <"lsr",     int_hexagon_S2_lsr_i_p>;

// STYPE / SHIFT / Shift by immediate and accumulate.
def HEXAGON_S2_asl_i_r_acc:
  si_SInst_sisiu5_acc             <"asl",     int_hexagon_S2_asl_i_r_acc>;
def HEXAGON_S2_asr_i_r_acc:
  si_SInst_sisiu5_acc             <"asr",     int_hexagon_S2_asr_i_r_acc>;
def HEXAGON_S2_lsr_i_r_acc:
  si_SInst_sisiu5_acc             <"lsr",     int_hexagon_S2_lsr_i_r_acc>;
def HEXAGON_S2_asl_i_r_nac:
  si_SInst_sisiu5_nac             <"asl",     int_hexagon_S2_asl_i_r_nac>;
def HEXAGON_S2_asr_i_r_nac:
  si_SInst_sisiu5_nac             <"asr",     int_hexagon_S2_asr_i_r_nac>;
def HEXAGON_S2_lsr_i_r_nac:
  si_SInst_sisiu5_nac             <"lsr",     int_hexagon_S2_lsr_i_r_nac>;
def HEXAGON_S2_asl_i_p_acc:
  di_SInst_didiu6_acc             <"asl",     int_hexagon_S2_asl_i_p_acc>;
def HEXAGON_S2_asr_i_p_acc:
  di_SInst_didiu6_acc             <"asr",     int_hexagon_S2_asr_i_p_acc>;
def HEXAGON_S2_lsr_i_p_acc:
  di_SInst_didiu6_acc             <"lsr",     int_hexagon_S2_lsr_i_p_acc>;
def HEXAGON_S2_asl_i_p_nac:
  di_SInst_didiu6_nac             <"asl",     int_hexagon_S2_asl_i_p_nac>;
def HEXAGON_S2_asr_i_p_nac:
  di_SInst_didiu6_nac             <"asr",     int_hexagon_S2_asr_i_p_nac>;
def HEXAGON_S2_lsr_i_p_nac:
  di_SInst_didiu6_nac             <"lsr",     int_hexagon_S2_lsr_i_p_nac>;

// STYPE / SHIFT / Shift by immediate and add.
def HEXAGON_S2_addasl_rrri:
  si_SInst_sisiu3                 <"addasl",  int_hexagon_S2_addasl_rrri>;

// STYPE / SHIFT / Shift by immediate and logical.
def HEXAGON_S2_asl_i_r_and:
  si_SInst_sisiu5_and             <"asl",     int_hexagon_S2_asl_i_r_and>;
def HEXAGON_S2_asr_i_r_and:
  si_SInst_sisiu5_and             <"asr",     int_hexagon_S2_asr_i_r_and>;
def HEXAGON_S2_lsr_i_r_and:
  si_SInst_sisiu5_and             <"lsr",     int_hexagon_S2_lsr_i_r_and>;

def HEXAGON_S2_asl_i_r_xacc:
  si_SInst_sisiu5_xor             <"asl",     int_hexagon_S2_asl_i_r_xacc>;
def HEXAGON_S2_lsr_i_r_xacc:
  si_SInst_sisiu5_xor             <"lsr",     int_hexagon_S2_lsr_i_r_xacc>;

def HEXAGON_S2_asl_i_r_or:
  si_SInst_sisiu5_or              <"asl",     int_hexagon_S2_asl_i_r_or>;
def HEXAGON_S2_asr_i_r_or:
  si_SInst_sisiu5_or              <"asr",     int_hexagon_S2_asr_i_r_or>;
def HEXAGON_S2_lsr_i_r_or:
  si_SInst_sisiu5_or              <"lsr",     int_hexagon_S2_lsr_i_r_or>;

def HEXAGON_S2_asl_i_p_and:
  di_SInst_didiu6_and             <"asl",     int_hexagon_S2_asl_i_p_and>;
def HEXAGON_S2_asr_i_p_and:
  di_SInst_didiu6_and             <"asr",     int_hexagon_S2_asr_i_p_and>;
def HEXAGON_S2_lsr_i_p_and:
  di_SInst_didiu6_and             <"lsr",     int_hexagon_S2_lsr_i_p_and>;

def HEXAGON_S2_asl_i_p_xacc:
  di_SInst_didiu6_xor             <"asl",     int_hexagon_S2_asl_i_p_xacc>;
def HEXAGON_S2_lsr_i_p_xacc:
  di_SInst_didiu6_xor             <"lsr",     int_hexagon_S2_lsr_i_p_xacc>;

def HEXAGON_S2_asl_i_p_or:
  di_SInst_didiu6_or              <"asl",     int_hexagon_S2_asl_i_p_or>;
def HEXAGON_S2_asr_i_p_or:
  di_SInst_didiu6_or              <"asr",     int_hexagon_S2_asr_i_p_or>;
def HEXAGON_S2_lsr_i_p_or:
  di_SInst_didiu6_or              <"lsr",     int_hexagon_S2_lsr_i_p_or>;

// STYPE / SHIFT / Shift right by immediate with rounding.
def HEXAGON_S2_asr_i_r_rnd:
  si_SInst_siu5_rnd               <"asr",     int_hexagon_S2_asr_i_r_rnd>;
def HEXAGON_S2_asr_i_r_rnd_goodsyntax:
  si_SInst_siu5              <"asrrnd",  int_hexagon_S2_asr_i_r_rnd_goodsyntax>;

// STYPE / SHIFT / Shift left by immediate with saturation.
def HEXAGON_S2_asl_i_r_sat:
  si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_i_r_sat>;

// STYPE / SHIFT / Shift by register.
def HEXAGON_S2_asl_r_r:
  si_SInst_sisi                   <"asl",     int_hexagon_S2_asl_r_r>;
def HEXAGON_S2_asr_r_r:
  si_SInst_sisi                   <"asr",     int_hexagon_S2_asr_r_r>;
def HEXAGON_S2_lsl_r_r:
  si_SInst_sisi                   <"lsl",     int_hexagon_S2_lsl_r_r>;
def HEXAGON_S2_lsr_r_r:
  si_SInst_sisi                   <"lsr",     int_hexagon_S2_lsr_r_r>;
def HEXAGON_S2_asl_r_p:
  di_SInst_disi                   <"asl",     int_hexagon_S2_asl_r_p>;
def HEXAGON_S2_asr_r_p:
  di_SInst_disi                   <"asr",     int_hexagon_S2_asr_r_p>;
def HEXAGON_S2_lsl_r_p:
  di_SInst_disi                   <"lsl",     int_hexagon_S2_lsl_r_p>;
def HEXAGON_S2_lsr_r_p:
  di_SInst_disi                   <"lsr",     int_hexagon_S2_lsr_r_p>;

// STYPE / SHIFT / Shift by register and accumulate.
def HEXAGON_S2_asl_r_r_acc:
  si_SInst_sisisi_acc             <"asl",     int_hexagon_S2_asl_r_r_acc>;
def HEXAGON_S2_asr_r_r_acc:
  si_SInst_sisisi_acc             <"asr",     int_hexagon_S2_asr_r_r_acc>;
def HEXAGON_S2_lsl_r_r_acc:
  si_SInst_sisisi_acc             <"lsl",     int_hexagon_S2_lsl_r_r_acc>;
def HEXAGON_S2_lsr_r_r_acc:
  si_SInst_sisisi_acc             <"lsr",     int_hexagon_S2_lsr_r_r_acc>;
def HEXAGON_S2_asl_r_p_acc:
  di_SInst_didisi_acc             <"asl",     int_hexagon_S2_asl_r_p_acc>;
def HEXAGON_S2_asr_r_p_acc:
  di_SInst_didisi_acc             <"asr",     int_hexagon_S2_asr_r_p_acc>;
def HEXAGON_S2_lsl_r_p_acc:
  di_SInst_didisi_acc             <"lsl",     int_hexagon_S2_lsl_r_p_acc>;
def HEXAGON_S2_lsr_r_p_acc:
  di_SInst_didisi_acc             <"lsr",     int_hexagon_S2_lsr_r_p_acc>;

def HEXAGON_S2_asl_r_r_nac:
  si_SInst_sisisi_nac             <"asl",     int_hexagon_S2_asl_r_r_nac>;
def HEXAGON_S2_asr_r_r_nac:
  si_SInst_sisisi_nac             <"asr",     int_hexagon_S2_asr_r_r_nac>;
def HEXAGON_S2_lsl_r_r_nac:
  si_SInst_sisisi_nac             <"lsl",     int_hexagon_S2_lsl_r_r_nac>;
def HEXAGON_S2_lsr_r_r_nac:
  si_SInst_sisisi_nac             <"lsr",     int_hexagon_S2_lsr_r_r_nac>;
def HEXAGON_S2_asl_r_p_nac:
  di_SInst_didisi_nac             <"asl",     int_hexagon_S2_asl_r_p_nac>;
def HEXAGON_S2_asr_r_p_nac:
  di_SInst_didisi_nac             <"asr",     int_hexagon_S2_asr_r_p_nac>;
def HEXAGON_S2_lsl_r_p_nac:
  di_SInst_didisi_nac             <"lsl",     int_hexagon_S2_lsl_r_p_nac>;
def HEXAGON_S2_lsr_r_p_nac:
  di_SInst_didisi_nac             <"lsr",     int_hexagon_S2_lsr_r_p_nac>;

// STYPE / SHIFT / Shift by register and logical.
def HEXAGON_S2_asl_r_r_and:
  si_SInst_sisisi_and             <"asl",     int_hexagon_S2_asl_r_r_and>;
def HEXAGON_S2_asr_r_r_and:
  si_SInst_sisisi_and             <"asr",     int_hexagon_S2_asr_r_r_and>;
def HEXAGON_S2_lsl_r_r_and:
  si_SInst_sisisi_and             <"lsl",     int_hexagon_S2_lsl_r_r_and>;
def HEXAGON_S2_lsr_r_r_and:
  si_SInst_sisisi_and             <"lsr",     int_hexagon_S2_lsr_r_r_and>;

def HEXAGON_S2_asl_r_r_or:
  si_SInst_sisisi_or              <"asl",     int_hexagon_S2_asl_r_r_or>;
def HEXAGON_S2_asr_r_r_or:
  si_SInst_sisisi_or              <"asr",     int_hexagon_S2_asr_r_r_or>;
def HEXAGON_S2_lsl_r_r_or:
  si_SInst_sisisi_or              <"lsl",     int_hexagon_S2_lsl_r_r_or>;
def HEXAGON_S2_lsr_r_r_or:
  si_SInst_sisisi_or              <"lsr",     int_hexagon_S2_lsr_r_r_or>;

def HEXAGON_S2_asl_r_p_and:
  di_SInst_didisi_and             <"asl",     int_hexagon_S2_asl_r_p_and>;
def HEXAGON_S2_asr_r_p_and:
  di_SInst_didisi_and             <"asr",     int_hexagon_S2_asr_r_p_and>;
def HEXAGON_S2_lsl_r_p_and:
  di_SInst_didisi_and             <"lsl",     int_hexagon_S2_lsl_r_p_and>;
def HEXAGON_S2_lsr_r_p_and:
  di_SInst_didisi_and             <"lsr",     int_hexagon_S2_lsr_r_p_and>;

def HEXAGON_S2_asl_r_p_or:
  di_SInst_didisi_or              <"asl",     int_hexagon_S2_asl_r_p_or>;
def HEXAGON_S2_asr_r_p_or:
  di_SInst_didisi_or              <"asr",     int_hexagon_S2_asr_r_p_or>;
def HEXAGON_S2_lsl_r_p_or:
  di_SInst_didisi_or              <"lsl",     int_hexagon_S2_lsl_r_p_or>;
def HEXAGON_S2_lsr_r_p_or:
  di_SInst_didisi_or              <"lsr",     int_hexagon_S2_lsr_r_p_or>;

// STYPE / SHIFT / Shift by register with saturation.
def HEXAGON_S2_asl_r_r_sat:
  si_SInst_sisi_sat               <"asl",     int_hexagon_S2_asl_r_r_sat>;
def HEXAGON_S2_asr_r_r_sat:
  si_SInst_sisi_sat               <"asr",     int_hexagon_S2_asr_r_r_sat>;

// STYPE / SHIFT / Table Index.
def Hexagon_S2_tableidxb_goodsyntax:
  si_MInst_sisiu4u5          <"tableidxb",int_hexagon_S2_tableidxb_goodsyntax>;
def Hexagon_S2_tableidxd_goodsyntax:
  si_MInst_sisiu4u5          <"tableidxd",int_hexagon_S2_tableidxd_goodsyntax>;
def Hexagon_S2_tableidxh_goodsyntax:
  si_MInst_sisiu4u5          <"tableidxh",int_hexagon_S2_tableidxh_goodsyntax>;
def Hexagon_S2_tableidxw_goodsyntax:
  si_MInst_sisiu4u5          <"tableidxw",int_hexagon_S2_tableidxw_goodsyntax>;


/********************************************************************
*            STYPE/VH                                               *
*********************************************************************/

// STYPE / VH / Vector absolute value halfwords.
// Rdd64=vabsh(Rss64)
def HEXAGON_A2_vabsh:
  di_SInst_di                     <"vabsh",   int_hexagon_A2_vabsh>;
def HEXAGON_A2_vabshsat:
  di_SInst_di_sat                 <"vabsh",   int_hexagon_A2_vabshsat>;

// STYPE / VH / Vector shift halfwords by immediate.
// Rdd64=v[asl/asr/lsr]h(Rss64,Rt32)
def HEXAGON_S2_asl_i_vh:
  di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_i_vh>;
def HEXAGON_S2_asr_i_vh:
  di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_i_vh>;
def HEXAGON_S2_lsr_i_vh:
  di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_i_vh>;

// STYPE / VH / Vector shift halfwords by register.
// Rdd64=v[asl/asr/lsl/lsr]w(Rss64,Rt32)
def HEXAGON_S2_asl_r_vh:
  di_SInst_disi                   <"vaslh",   int_hexagon_S2_asl_r_vh>;
def HEXAGON_S2_asr_r_vh:
  di_SInst_disi                   <"vasrh",   int_hexagon_S2_asr_r_vh>;
def HEXAGON_S2_lsl_r_vh:
  di_SInst_disi                   <"vlslh",   int_hexagon_S2_lsl_r_vh>;
def HEXAGON_S2_lsr_r_vh:
  di_SInst_disi                   <"vlsrh",   int_hexagon_S2_lsr_r_vh>;


/********************************************************************
*            STYPE/VW                                               *
*********************************************************************/

// STYPE / VW / Vector absolute value words.
def HEXAGON_A2_vabsw:
  di_SInst_di                     <"vabsw",   int_hexagon_A2_vabsw>;
def HEXAGON_A2_vabswsat:
  di_SInst_di_sat                 <"vabsw",   int_hexagon_A2_vabswsat>;

// STYPE / VW / Vector shift words by immediate.
// Rdd64=v[asl/vsl]w(Rss64,Rt32)
def HEXAGON_S2_asl_i_vw:
  di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_i_vw>;
def HEXAGON_S2_asr_i_vw:
  di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_i_vw>;
def HEXAGON_S2_lsr_i_vw:
  di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_i_vw>;

// STYPE / VW / Vector shift words by register.
// Rdd64=v[asl/vsl]w(Rss64,Rt32)
def HEXAGON_S2_asl_r_vw:
  di_SInst_disi                   <"vaslw",   int_hexagon_S2_asl_r_vw>;
def HEXAGON_S2_asr_r_vw:
  di_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_vw>;
def HEXAGON_S2_lsl_r_vw:
  di_SInst_disi                   <"vlslw",   int_hexagon_S2_lsl_r_vw>;
def HEXAGON_S2_lsr_r_vw:
  di_SInst_disi                   <"vlsrw",   int_hexagon_S2_lsr_r_vw>;

// STYPE / VW / Vector shift words with truncate and pack.
def HEXAGON_S2_asr_r_svw_trun:
  si_SInst_disi                   <"vasrw",   int_hexagon_S2_asr_r_svw_trun>;
def HEXAGON_S2_asr_i_svw_trun:
  si_SInst_diu5                   <"vasrw",   int_hexagon_S2_asr_i_svw_trun>;

// LD / Circular loads.
def HEXAGON_circ_ldd:
  di_LDInstPI_diu4                <"circ_ldd", int_hexagon_circ_ldd>;

include "HexagonIntrinsicsV3.td"
include "HexagonIntrinsicsV4.td"
include "HexagonIntrinsicsV5.td"