@@ -2096,6 +2096,7 @@ impl Assembler {
2096
2096
pub fn xmm_vpsrl_rr ( & mut self , src : Reg , dst : WritableReg , imm : u32 , size : OperandSize ) {
2097
2097
let op = match size {
2098
2098
OperandSize :: S32 => AvxOpcode :: Vpsrld ,
2099
+ OperandSize :: S64 => AvxOpcode :: Vpsrlq ,
2099
2100
_ => unimplemented ! ( ) ,
2100
2101
} ;
2101
2102
@@ -2111,6 +2112,7 @@ impl Assembler {
2111
2112
pub fn xmm_vpsub_rrr ( & mut self , src1 : Reg , src2 : Reg , dst : WritableReg , size : OperandSize ) {
2112
2113
let op = match size {
2113
2114
OperandSize :: S32 => AvxOpcode :: Vpsubd ,
2115
+ OperandSize :: S64 => AvxOpcode :: Vpsubq ,
2114
2116
_ => unimplemented ! ( ) ,
2115
2117
} ;
2116
2118
@@ -2442,6 +2444,56 @@ impl Assembler {
2442
2444
dst : dst. map ( Into :: into) ,
2443
2445
} ) ;
2444
2446
}
2447
+
2448
+ /// Compute the absolute value of elements in vector `src` and put the
2449
+ /// results in `dst`.
2450
+ pub fn xmm_vpabs_rr ( & mut self , src : Reg , dst : WritableReg , size : OperandSize ) {
2451
+ let op = match size {
2452
+ OperandSize :: S8 => AvxOpcode :: Vpabsb ,
2453
+ OperandSize :: S16 => AvxOpcode :: Vpabsw ,
2454
+ OperandSize :: S32 => AvxOpcode :: Vpabsd ,
2455
+ _ => unimplemented ! ( ) ,
2456
+ } ;
2457
+
2458
+ self . emit ( Inst :: XmmUnaryRmRVex {
2459
+ op,
2460
+ src : src. into ( ) ,
2461
+ dst : dst. to_reg ( ) . into ( ) ,
2462
+ } ) ;
2463
+ }
2464
+
2465
+ /// Arithmetically (sign preserving) right shift on vector in `src` by
2466
+ /// `imm` with result written to `dst`.
2467
+ pub fn xmm_vpsra_rri ( & mut self , src : Reg , dst : WritableReg , imm : u32 , size : OperandSize ) {
2468
+ let op = match size {
2469
+ OperandSize :: S32 => AvxOpcode :: Vpsrad ,
2470
+ _ => unimplemented ! ( ) ,
2471
+ } ;
2472
+
2473
+ self . emit ( Inst :: XmmRmiRVex {
2474
+ op,
2475
+ src1 : src. into ( ) ,
2476
+ src2 : XmmMemImm :: unwrap_new ( RegMemImm :: imm ( imm) ) ,
2477
+ dst : dst. to_reg ( ) . into ( ) ,
2478
+ } ) ;
2479
+ }
2480
+
2481
+ /// Perform an `and` operation on vectors of floats in `src1` and `src2`
2482
+ /// and put the results in `dst`.
2483
+ pub fn xmm_vandp_rrr ( & mut self , src1 : Reg , src2 : Reg , dst : WritableReg , size : OperandSize ) {
2484
+ let op = match size {
2485
+ OperandSize :: S32 => AvxOpcode :: Vandps ,
2486
+ OperandSize :: S64 => AvxOpcode :: Vandpd ,
2487
+ _ => unimplemented ! ( ) ,
2488
+ } ;
2489
+
2490
+ self . emit ( Inst :: XmmRmiRVex {
2491
+ op,
2492
+ src1 : src1. into ( ) ,
2493
+ src2 : src2. into ( ) ,
2494
+ dst : dst. to_reg ( ) . into ( ) ,
2495
+ } ) ;
2496
+ }
2445
2497
}
2446
2498
2447
2499
/// Captures the region in a MachBuffer where an add-with-immediate instruction would be emitted,
0 commit comments