Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h @@ -45,6 +45,8 @@ /// right decision when generating code for different targets. const WebAssemblySubtarget *Subtarget; + MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override; + bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg, const SmallVectorImpl &Outs, Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -111,6 +111,11 @@ // FIXME: setOperationAction... } +MVT WebAssemblyTargetLowering::getScalarShiftAmountTy(const DataLayout &DL, + EVT VT) const { + return VT.getSimpleVT(); +} + //===----------------------------------------------------------------------===// // WebAssembly Lowering private implementation. //===----------------------------------------------------------------------===// Index: llvm/trunk/test/CodeGen/WebAssembly/integer64.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/integer64.ll +++ llvm/trunk/test/CodeGen/WebAssembly/integer64.ll @@ -109,39 +109,35 @@ ret i64 %a } -; FIXME: 64-bit shifts have an extra truncate of the input shift value, which -; WebAssembly hasn't taught isel to match yet. Fix with -; getScalarShiftAmountTy. - -; C;HECK-LABEL: shl64: -; C;HECK-NEXT: (setlocal @0 (argument 1)) -; C;HECK-NEXT: (setlocal @1 (argument 0)) -; C;HECK-NEXT: (setlocal @2 (SHL_I64 @1 @0)) -; C;HECK-NEXT: (return @2) -;define i64 @shl64(i64 %x, i64 %y) { -; %a = shl i64 %x, %y -; ret i64 %a -;} - -; C;HECK-LABEL: shr64: -; C;HECK-NEXT: (setlocal @0 (argument 1)) -; C;HECK-NEXT: (setlocal @1 (argument 0)) -; C;HECK-NEXT: (setlocal @2 (SHR_I64 @1 @0)) -; C;HECK-NEXT: (return @2) -;define i64 @shr64(i64 %x, i64 %y) { -; %a = lshr i64 %x, %y -; ret i64 %a -;} - -; C;HECK-LABEL: sar64: -; C;HECK-NEXT: (setlocal @0 (argument 1)) -; C;HECK-NEXT: (setlocal @1 (argument 0)) -; C;HECK-NEXT: (setlocal @2 (SAR_I64 @1 @0)) -; C;HECK-NEXT: (return @2) -;define i64 @sar64(i64 %x, i64 %y) { -; %a = ashr i64 %x, %y -; ret i64 %a -;} +; CHECK-LABEL: shl64: +; CHECK-NEXT: (setlocal @0 (argument 1)) +; CHECK-NEXT: (setlocal @1 (argument 0)) +; CHECK-NEXT: (setlocal @2 (SHL_I64 @1 @0)) +; CHECK-NEXT: (return @2) +define i64 @shl64(i64 %x, i64 %y) { + %a = shl i64 %x, %y + ret i64 %a +} + +; CHECK-LABEL: shr64: +; CHECK-NEXT: (setlocal @0 (argument 1)) +; CHECK-NEXT: (setlocal @1 (argument 0)) +; CHECK-NEXT: (setlocal @2 (SHR_I64 @1 @0)) +; CHECK-NEXT: (return @2) +define i64 @shr64(i64 %x, i64 %y) { + %a = lshr i64 %x, %y + ret i64 %a +} + +; CHECK-LABEL: sar64: +; CHECK-NEXT: (setlocal @0 (argument 1)) +; CHECK-NEXT: (setlocal @1 (argument 0)) +; CHECK-NEXT: (setlocal @2 (SAR_I64 @1 @0)) +; CHECK-NEXT: (return @2) +define i64 @sar64(i64 %x, i64 %y) { + %a = ashr i64 %x, %y + ret i64 %a +} ; CHECK-LABEL: clz64: ; CHECK-NEXT: (setlocal @0 (argument 0))