1276789Sdim/* ===-- ashlti3.c - Implement __ashlti3 -----------------------------------=== 2276789Sdim * 3276789Sdim * The LLVM Compiler Infrastructure 4276789Sdim * 5276789Sdim * This file is dual licensed under the MIT and the University of Illinois Open 6276789Sdim * Source Licenses. See LICENSE.TXT for details. 7276789Sdim * 8276789Sdim * ===----------------------------------------------------------------------=== 9276789Sdim * 10276789Sdim * This file implements __ashlti3 for the compiler_rt library. 11276789Sdim * 12276789Sdim * ===----------------------------------------------------------------------=== 13276789Sdim */ 14276789Sdim 15276789Sdim#include "int_lib.h" 16276789Sdim 17276789Sdim#ifdef CRT_HAS_128BIT 18276789Sdim 19276789Sdim/* Returns: a << b */ 20276789Sdim 21276789Sdim/* Precondition: 0 <= b < bits_in_tword */ 22276789Sdim 23276789SdimCOMPILER_RT_ABI ti_int 24276789Sdim__ashlti3(ti_int a, si_int b) 25276789Sdim{ 26276789Sdim const int bits_in_dword = (int)(sizeof(di_int) * CHAR_BIT); 27276789Sdim twords input; 28276789Sdim twords result; 29276789Sdim input.all = a; 30276789Sdim if (b & bits_in_dword) /* bits_in_dword <= b < bits_in_tword */ 31276789Sdim { 32276789Sdim result.s.low = 0; 33276789Sdim result.s.high = input.s.low << (b - bits_in_dword); 34276789Sdim } 35276789Sdim else /* 0 <= b < bits_in_dword */ 36276789Sdim { 37276789Sdim if (b == 0) 38276789Sdim return a; 39276789Sdim result.s.low = input.s.low << b; 40276789Sdim result.s.high = (input.s.high << b) | (input.s.low >> (bits_in_dword - b)); 41276789Sdim } 42276789Sdim return result.all; 43276789Sdim} 44276789Sdim 45276789Sdim#endif /* CRT_HAS_128BIT */ 46